node.js 如何使用 nodemailer 将文件附加到电子邮件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21934667/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 16:53:59  来源:igfitidea点击:

How to attach file to an email with nodemailer

node.jsemailnodemailer

提问by DanialV

I have code that send email with nodemailerin nodejsbut I want to attach file to an email but I can't find way to do that I search on net but I could't find something useful.Is there any way that I can attach files to with that or any resource that can help me to attach file with nodemailer?

我有在nodejs 中使用nodemailer发送电子邮件的代码,但我想将文件附加到电子邮件,但我找不到方法,我在网上搜索但找不到有用的东西。有什么方法可以附加文件或任何可以帮助我使用 nodemailer 附加文​​件的资源?

var nodemailer = require('nodemailer');
var events = require('events');
var check =1;
var events = new events.EventEmitter();
var smtpTransport = nodemailer.createTransport("SMTP",{
    service: "gmail",
    auth: {
        user: "[email protected]",
        pass: "pass"
    }
});
function inputmail(){
    ///////Email
    const from = 'example<[email protected]>';
    const to  = '[email protected]';
    const subject  = 'example';
    const text = 'example email';
    const html = '<b>example email</b>';
    var mailOption = {
        from: from,
        to:  to,
        subject: subject,
        text: text,
        html: html
    }
    return mailOption;
}
function send(){
        smtpTransport.sendMail(inputmail(),function(err,success){
        if(err){
            events.emit('error', err);
        }
        if(success){
            events.emit('success', success);
        }
    });
}
///////////////////////////////////
send();
events.on("error", function(err){
    console.log("Mail not send");
    if(check<10)
        send();
    check++;
});
events.on("success", function(success){
    console.log("Mail send");
});

回答by Harry Martel

Include in the var mailOption the key attachments, as follow:

在 var mailOption 中包含关键附件,如下所示:

var mailOptions = {
...
attachments: [
    {   // utf-8 string as an attachment
        filename: 'text1.txt',
        content: 'hello world!'
    },
    {   // binary buffer as an attachment
        filename: 'text2.txt',
        content: new Buffer('hello world!','utf-8')
    },
    {   // file on disk as an attachment
        filename: 'text3.txt',
        path: '/path/to/file.txt' // stream this file
    },
    {   // filename and content type is derived from path
        path: '/path/to/file.txt'
    },
    {   // stream as an attachment
        filename: 'text4.txt',
        content: fs.createReadStream('file.txt')
    },
    {   // define custom content type for the attachment
        filename: 'text.bin',
        content: 'hello world!',
        contentType: 'text/plain'
    },
    {   // use URL as an attachment
        filename: 'license.txt',
        path: 'https://raw.github.com/andris9/Nodemailer/master/LICENSE'
    },
    {   // encoded string as an attachment
        filename: 'text1.txt',
        content: 'aGVsbG8gd29ybGQh',
        encoding: 'base64'
    },
    {   // data uri as an attachment
        path: 'data:text/plain;base64,aGVsbG8gd29ybGQ='
    }
]

}

}

Choose the option that adjust to your needs.

选择适合您需要的选项。

Link:Nodemailer Repository GitHub

链接:Nodemailer 存储库 GitHub

Good Luck!!

祝你好运!!

回答by Ben

I've tested each of these attachments methods and none is ok for me. Here's my mailer function code without the smtp transport config :

我已经测试了这些附件方法中的每一种,但对我来说都没有问题。这是我的邮件功能代码,没有 smtp 传输配置:

function mailer(from, to, subject, attachments, body) {

    // Setup email
    var mailOptions = {
        from: from,
        to: to,
        subject: subject,
        attachments: attachments,
        html: body
    };

    // send mail with defined transport object
    smtpTransport.sendMail(mailOptions, function(error, response){
        if(error) console.log(error);
        else console.log("Message sent: " + response.message);
        // shut down the connection pool, no more messages
        smtpTransport.close();
    });
}

And then the call :

然后调用:

var attachments = [{ filename: 'test.pdf', path: __dirname + '/pdf/test.pdf', contentType: 'application/pdf' }];
mailer("[email protected]", "[email protected]", "Test", attachments, "<h1>Hello</h1>");

The mail comes successfully but with no attachment. Even if I set a string or buffer attachment it's the same result.

邮件成功但没有附件。即使我设置了字符串或缓冲区附件,结果也是一样的。

回答by user3620634

If you are passing options object in mail composer constructor and attachment is on http server then it should look like:

如果您在邮件编写器构造函数中传递选项对象并且附件在 http 服务器上,那么它应该如下所示:

const options = {
    attachments = [
      { // use URL as an attachment
        filename: 'xxx.jpg',
        path: 'http:something.com/xxx.jpg'
      }
    ]
}

回答by Dhaval

Your code is almost right, just need to add, "attachments" property for attaching the files in your mail,

您的代码几乎是正确的,只需要添加“附件”属性,用于在您的邮件中附加文件,

YOUR mailOption:

您的邮件选项:

var mailOption = {
        from: from,
        to:  to,
        subject: subject,
        text: text,
        html: html
}

Just add attachments like

只需添加附件,如

var mailOption = {
        from: from,
        to:  to,
        subject: subject,
        text: text,
        html: html,
        attachments: [{
            filename: change with filename,
            path: change with file path
        }]
}

attachments also provide some other way to attach file for more information check nodemailer community's documentation HERE

附件还提供了一些其他方式来附加文件以获取更多信息,请在此处查看 nodemailer 社区的文档

回答by ginna

The alternative solution is to host your images online using a CDN and link to the online image source in your HTML, eg. <img src="list_image_url_here">.

另一种解决方案是使用 CDN 在线托管您的图像并链接到 HTML 中的在线图像源,例如。<img src="list_image_url_here">.

(I had problems with nodemailer's image embedding using nodemailer version 2.6.0, which is why I figured out this workaround.)

(我在使用 nodemailer 2.6.0 版嵌入 nodemailer 的图像时遇到了问题,这就是我想出这个解决方法的原因。)

An added benefit of this solution is that you're sending no attachments to nodemailer, so the sending process is more streamlined.

此解决方案的另一个好处是您不会向 nodemailer 发送附件,因此发送过程更加简化。

回答by naga priyanka Chakka

var express = require('express');
var router = express(),
multer = require('multer'),
upload = multer(),
fs = require('fs'),
path = require('path');
nodemailer = require('nodemailer'),

directory = path.dirname("");
var parent = path.resolve(directory, '..');
// your path to store the files
var uploaddir = parent + (path.sep) + 'emailprj' + (path.sep) + 'public' + (path.sep) + 'images' + (path.sep);
/* GET home page. */
router.get('/', function(req, res) {
res.render('index.ejs', {
    title: 'Express'
});
});

router.post('/sendemail', upload.any(), function(req, res) {

var file = req.files;
console.log(file[0].originalname)
fs.writeFile(uploaddir + file[0].originalname, file[0].buffer,     function(err) {
    //console.log("filewrited")
    //console.log(err)
})
var filepath = path.join(uploaddir, file[0].originalname);
console.log(filepath)
    //return false;
nodemailer.mail({
    from: "yourgmail.com",
    to: req.body.emailId, // list of receivers
    subject: req.body.subject + " ?", // Subject line
    html: "<b>" + req.body.description + "</b>", // html body
    attachments: [{
        filename: file[0].originalname,
        streamSource: fs.createReadStream(filepath)
    }]
});
res.send("Email has been sent successfully");
})
module.exports = router;

回答by esraa ali

var mailer = require('nodemailer');
mailer.SMTP = {
    host: 'host.com', 
    port:587,
    use_authentication: true, 
    user: '[email protected]', 
    pass: 'xxxxxx'
};

Then read a file and send an email :

fs.readFile("./attachment.txt", function (err, data) {

    mailer.send_mail({       
        sender: '[email protected]',
        to: '[email protected]',
        subject: 'Attachment!',
        body: 'mail content...',
        attachments: [{'filename': 'attachment.txt', 'content': data}]
    }), function(err, success) {
        if (err) {
            // Handle error
        }

    }
});