使用Meteor.js发送电子邮件附件(电子邮件包和/或nodemailer或其他)

时间:2015-02-03 21:21:23

标签: javascript email meteor email-attachments nodemailer

发送电子邮件附件似乎尚未在Meteor的官方email package中实施。我已经尝试了nodemailer建议(见here)但收到错误“无法读取未定义的属性'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
        }
    ]
});

1 个答案:

答案 0 :(得分:5)

没有足够的回复评论。

我最终使用Sendgrids NPM软件包解决了附件问题。

npm install sendgrid

如果你没有在流星应用程序中使用npm,你可以阅读此内容。 https://meteorhacks.com/complete-npm-integration-for-meteor

在你的packages.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;
}
});