使用NodeJS发送带附件的邮件

27

有没有适用于NodeJS的邮件发送附件库?

13个回答

59

是的,很简单,我使用nodemailer:npm install nodemailer --save

var mailer = require('nodemailer');
mailer.SMTP = {
    host: 'host.com', 
    port:587,
    use_authentication: true, 
    user: 'you@example.com', 
    pass: 'xxxxxx'
};

然后读取一个文件并发送电子邮件:

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

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

    }
});

1
最后一行缺少 '})'。我无法直接编辑,因为它少于6个字符... - Panickos Neophytou
附件属性有一个类型。"contents" 是不正确的,应该是 "content"。 - Dmytro Mykhailov
这段代码片段处理二进制文件还是只处理文本? - David
旧版本的nodemailer使用“内容”。请确保检查您正在使用的版本,并与http://nodemailer.com上的nodemailer文档进行比较。 - ttemple
有没有办法发送数据库文件。我正在使用部署在Heroku上的sqlite,每次部署时,应用程序都会被格式化。我在目录中有database.db文件,并希望通过电子邮件发送它。因为对于这样的操作,我需要实现cronjob。任何帮助将不胜感激。 - Eklavya Chandra

6

尝试使用nodemailer,例如尝试使用以下代码:

  var nodemailer = require('nodemailer');
  nodemailer.SMTP = {
     host: 'mail.yourmail.com',
     port: 25,
     use_authentication: true,
     user: 'info@youdomain.com',
     pass: 'somepasswd'
   };

  var message = {   
        sender: "sender@domain.com",    
        to:'somemail@somedomain.com',   
        subject: '',    
        html: '<h1>test</h1>',  
        attachments: [  
        {   
            filename: "somepicture.jpg",    
            contents: new Buffer(data, 'base64'),   
            cid: cid    
        }   
        ]   
    };

最后,发送消息

    nodemailer.send_mail(message,   
      function(err) {   
        if (!err) { 
            console.log('Email send ...');
        } else console.log(sys.inspect(err));       
    });

ReferenceError: data未定义 -- 我是否缺少一个require? - Lonnie Best
我猜这里有一个打字错误,应该是“content”而不是“contents”。 - Sunil Garg

3

你尝试过Nodemailer吗?

Nodemailer支持:

  • Unicode字符的使用
  • HTML内容以及纯文本替代
  • 附件
  • 在HTML中嵌入图像
  • SSL(但不支持STARTTLS)

3

1
旧答案,但是API如何比本地sendmail服务器更一致呢? - James_1x0

1

2
不要忘记完全披露你与推荐项目的关联 :) - Mike

1

另一个可尝试的替代库是emailjs

我自己尝试了这里的一些建议,但运行代码时出现send_mail()和sendMail()未定义的问题(即使我只是复制并粘贴了稍微修改过的代码)。我正在使用node 0.12.4和npm 2.10.1。我在emailjs方面没有任何问题,它对我来说就像开箱即用一样。并且它具有漂亮的附件包装器,因此您可以按照自己的喜好和轻松方式附加它,与此处的nodemailer示例相比更容易。


1

他使用Node.js,为什么建议他使用PHP解决方案? - zobi8225
我认为它使用了node.js,但基于php,有点慢且不太好。但我认为它能胜任工作。 - Totty.js

1

使用邮件包非常灵活和简单。


0

我没有使用过它,但nodemailer(npm install nodemailer)看起来像是你想要的。


0

你可以使用谷歌的官方API来实现这个功能。 他们为此提供了Node的软件包。 谷歌官方API

我附上了我的代码的一部分,这是我用来实现附件功能的。

function makeBody(subject, message) {
var boundary = "__myapp__";
var nl = "\n";
var attach = new Buffer(fs.readFileSync(__dirname + "/../"+fileName)) .toString("base64");
// console.dir(attach);
var str = [

        "MIME-Version: 1.0",
        "Content-Transfer-Encoding: 7bit",
        "to: " + receiverId,
        "subject: " + subject,
        "Content-Type: multipart/alternate; boundary=" + boundary + nl,
        "--" + boundary,
        "Content-Type: text/plain; charset=UTF-8",
        "Content-Transfer-Encoding: 7bit" + nl,
        message+ nl,
        "--" + boundary,
        "--" + boundary,
        "Content-Type: Application/pdf; name=myPdf.pdf",
        'Content-Disposition: attachment; filename=myPdf.pdf',
        "Content-Transfer-Encoding: base64" + nl,
        attach,
        "--" + boundary + "--"

    ].join("\n");

    var encodedMail = new Buffer(str).toString("base64").replace(/\+/g, '-').replace(/\//g, '_');
    return encodedMail;
}

附言:感谢 himanshu 在这方面的深入研究


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接