使用Meteor.js发送电子邮件附件(电子邮件包和/或nodemailer或其他) [英] Sending email attachments with Meteor.js (email package and/or nodemailer or otherwise)

查看:432
本文介绍了使用Meteor.js发送电子邮件附件(电子邮件包和/或nodemailer或其他)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

发送电子邮件附件似乎尚未在Meteor的官方电子邮件包中实现。我尝试过nodemailer的建议(见此处),但收到错误无法读取属性 createTransport'未定义。

Sending email attachments doesn't appear to be implemented yet in Meteor's official email package. I've tried the nodemailer suggestion (seen here) but received the error "Cannot read property 'createTransport' of undefined".

我试图在数据URI中创建一个CSV文件,然后发送该附件。以下是使用官方电子邮件包时的代码片段:

I'm attempting to create a CSV file in a data URI and then send that attachment. Here's a snippet of my code when using the official email package:

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代码看起来像:

Here is basically what my nodemailer code looked like:

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包解决了附件问题。

I ended up solving the attachment issue by using Sendgrids NPM package.

npm install sendgrid

如果你没有npm流星应用程序,你可以阅读这个。
https://meteorhacks.com/complete-npm-integration-for-meteor

If you don't have npm in you meteor app you can read this. https://meteorhacks.com/complete-npm-integration-for-meteor

在您的packages.json中

In your packages.json

{
  "sendgrid": "1.4.0"
}

然后在一个文件在服务器上运行:

Then in a file that runs on the server:

Meteor.startup(function(){
    process.env.MAIL_URL = 'smtp://<username>:<password>@smtp.sendgrid.net:587';
});

以下是一个示例流星方法,获取附件的网址(我们使用的是S3)附件集合。这种特定的方法可以将任意数量的附件发送到任何数量的收件人。这里有一些上下文特定的逻辑,但它应该足以使您正在运行并发送附件。

Here is a sample meteor method that gets the url of an attachment (we're using S3) from an attachment collection. This particular method can send any number of attachments to any number of recipients. There is some context specific logic in here but it should be enough to get you up and running sending attachments.

重要的部分:

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;
}
});

这篇关于使用Meteor.js发送电子邮件附件(电子邮件包和/或nodemailer或其他)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆