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
How to attach file to an email with nodemailer
提问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
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
}
}
});

