发送电子邮件附件似乎尚未在Meteor的官方电子邮件包中实现。我尝试了nodemailer建议(见此处),但收到错误"无法读取未定义的属性"createTransport"。
我正试图在数据URI中创建一个CSV文件,然后发送该附件。以下是我使用官方电子邮件包时的代码片段:
csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv);
var options = {
from: "xxx@gmail.com",
to: "xxx@gmail.com",
subject: "xxx",
html: html,
attachment: {
fileName: fileName,
path: csvData
}
};
Meteor.call('sendEmail', options);
编辑:
以下基本上是我的nodemailer代码的样子:
var nodemailer = Nodemailer;
var transporter = nodemailer.createTransport();
transporter.sendMail({
from: 'sender@address',
to: 'receiver@address',
subject: 'hello',
text: 'hello world!',
attachments: [
{
path: csvData
}
]
});
没有足够的代表发表评论。
我最终通过使用Sendgrids NPM包解决了附件问题。
npm install sendgrid
如果你的流星应用程序中没有npm,你可以阅读这篇文章。https://meteorhacks.com/complete-npm-integration-for-meteor
在您的软件包中.json
{
"sendgrid": "1.4.0"
}
然后在服务器上运行的文件中:
Meteor.startup(function(){
process.env.MAIL_URL = 'smtp://<username>:<password>@smtp.sendgrid.net:587';
});
下面是一个示例流星方法,它从附件集合中获取附件的url(我们使用的是S3)。这种特殊的方法可以向任何数量的收件人发送任何数量的附件。这里有一些特定于上下文的逻辑,但它应该足以让您启动并运行发送附件。
重要部分:
var email = new sendgrid.Email();
email.setFrom("email@email.com");
email.setSubject("subject");
email.addFile({
filename: attachment_name,
url: attachment_url
});
sendgrid.send(email, function (err, json) {
if (err) {
console.error(err);
}
if (json) {
console.log(json.message);
}
});
完整的方法示例:
Meteor.methods({
SendEmail: function (subject, message, templateNumber) {
//console.log(subject, message, templateNumber);
var user_id = Meteor.userId();
var list = UserList.find({user_id: user_id}).fetch();
var sentTemplate = sentTemplate + templateNumber;
var counter = 0;
console.log(list.length);
// Track is the 'No Response' from the list.
for (var i = 0; i < list.length; i++) {
var email = new sendgrid.Email();
if (list[i].track == null || list[i].track == "1") {
//email.addTo(list[0].list[i].Email);
//console.log(list[0].list[i].Email);
email.to = list[i].email;
}
email.setFrom(Meteor.user().email);
email.replyto = Meteor.user().email;
email.setSubject(subject);
var firstName = list[i].name.split(" ")[0];
var companyReplace = message.replace("{{Company}}", list[i].company).replace("{{Company}}", list[i].company).replace("{{Company}}", list[i].company).replace("{{Company}}", list[i].company).replace("{{Company}}", list[i].company);
var nameReplace = companyReplace.replace("{{Name}}",list[i].name).replace("{{Name}}",list[i].name).replace("{{Name}}",list[i].name).replace("{{Name}}",list[i].name).replace("{{Name}}",list[i].name)
var firstNameReplace = companyReplace.replace("{{FirstName}}",firstName).replace("{{FirstName}}",firstName).replace("{{FirstName}}",firstName).replace("{{FirstName}}",firstName).replace("{{FirstName}}",firstName);
email.setHtml(firstNameReplace);
var numAttachments = Attachments.find({user_id: Meteor.userId()}).fetch().length;
var attachments = Attachments.find({user_id: Meteor.userId()}).fetch();
console.log("**********Attachments****************");
console.log(attachments);
console.log("**********Attachments****************");
for (var t = 0; t < numAttachments; t++) {
email.addFile({
filename: attachments[t].attachment_name,
url: attachments[t].attachment_url
});
}
sendgrid.send(email, function (err, json) {
if (err) {
console.error(err);
}
if (json) {
console.log(json.message);
}
});
//console.log(email);
} // end for loop
if (templateNumber == 1) {
Meteor.users.update({_id:Meteor.userId()}, {$set: {"sentTemplate1": true}});
}
if (templateNumber == 2) {
Meteor.users.update({_id:Meteor.userId()}, {$set: {"sentTemplate2": true}});
}
if (templateNumber == 3) {
Meteor.users.update({_id:Meteor.userId()}, {$set: {"sentTemplate3": true}});
}
if (templateNumber == 4) {
Meteor.users.update({_id:Meteor.userId()}, {$set: {"sentTemplate4": true}});
}
// for each email. replace all html
return list.length;
}
});