Node.js使用Nodemailer发送邮件

    电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。

    在很多项目中,我们都会遇到邮件注册,邮件反馈等需求。在node中收发电子邮件也非常简单,因为强大的社区有各种各样的包可以供我么直接使用。包就可以帮助我们快速实现发送邮件的功能。

    Github源码:https://github.com/ogilhinn/node-abc/tree/master/lesson10

    Nodemailer是一个简单易用的Node.js邮件发送组件

    官网地址:

    GitHub地址:https://github.com/nodemailer/nodemailer

    Nodemailer的主要特点包括:

    • 支持Unicode编码
    • 支持Window系统环境
    • 支持HTML内容和普通文本内容
    • 支持附件(传送大附件)
    • 支持HTML内容中嵌入图片
    • 支持SSL/STARTTLS安全的邮件发送
    • 支持内置的transport方法和其他插件实现的transport方法
    • 支持自定义插件处理消息
    • 支持XOAUTH2登录验证

    安装使用

    首先,我们肯定是要下载安装 注意:Node.js v6+

    打开官网可以看见一个小例子

    1. const nodemailer = require('nodemailer');
    2. // Generate test SMTP service account from ethereal.email
    3. // Only needed if you don't have a real mail account for testing
    4. nodemailer.createTestAccount((err, account) => {
    5. // create reusable transporter object using the default SMTP transport
    6. let transporter = nodemailer.createTransport({
    7. host: 'smtp.ethereal.email',
    8. port: 587,
    9. secure: false, // true for 465, false for other ports
    10. auth: {
    11. user: account.user, // generated ethereal user
    12. pass: account.pass // generated ethereal password
    13. }
    14. });
    15. // setup email data with unicode symbols
    16. let mailOptions = {
    17. from: '"Fred Foo ?" <foo@blurdybloop.com>', // sender address
    18. to: 'bar@blurdybloop.com, baz@blurdybloop.com', // list of receivers
    19. subject: 'Hello ✔', // Subject line
    20. text: 'Hello world?', // plain text body
    21. html: '<b>Hello world?</b>' // html body
    22. };
    23. // send mail with defined transport object
    24. transporter.sendMail(mailOptions, (error, info) => {
    25. if (error) {
    26. return console.log(error);
    27. }
    28. console.log('Message sent: %s', info.messageId);
    29. // Preview only available when sending through an Ethereal account
    30. console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
    31. // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@blurdybloop.com>
    32. // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
    33. });
    34. });

    这个小例子是生成了Ethereal的账户进行邮件发送演示的。但是这多没意思,我们来使用自己的邮箱来发送邮件

    这里我使用了我的qq邮箱给163邮箱发送email。

    1. 'use strict';
    2. const nodemailer = require('nodemailer');
    3. let transporter = nodemailer.createTransport({
    4. // host: 'smtp.ethereal.email',
    5. port: 465, // SMTP 端口
    6. secureConnection: true, // 使用了 SSL
    7. auth: {
    8. user: 'xxxxxx@qq.com',
    9. // 这里密码不是qq密码,是你设置的smtp授权码
    10. pass: 'xxxxxx',
    11. }
    12. });
    13. let mailOptions = {
    14. from: '"JavaScript之禅" <xxxxx@qq.com>', // sender address
    15. to: 'xxxxxxxx@163.com', // list of receivers
    16. subject: 'Hello', // Subject line
    17. // 发送text或者html格式
    18. // text: 'Hello world?', // plain text body
    19. html: '<b>Hello world?</b>' // html body
    20. };
    21. // send mail with defined transport object
    22. transporter.sendMail(mailOptions, (error, info) => {
    23. if (error) {
    24. return console.log(error);
    25. }
    26. console.log('Message sent: %s', info.messageId);
    27. // Message sent: <04ec7731-cc68-1ef6-303c-61b0f796b78f@qq.com>
    28. });

    运行程序,成功将返回messageId。这是便可以去收件箱查看这个新邮件啦

    这里我们需要注意,auth.pass 不是邮箱账户的密码而是stmp的授权码。

    到此我们就掌握了发邮件的基本操作。

    更多配置

    • CC: Carbon Copy(抄送),用于通知相关的人,收件人可以看到都邮件都抄送给谁了。一般回报工作或跨部门沟通时,都会CC给收件人的领导一份
    • BCC:Blind Carbon Copy(暗抄送),也是用于通知相关的人,但是收件人是看不到邮件被密送给谁了。
    • attachments: 附件

    更多配置项:

    这里我们就不演示CC、BCC了,请自行尝试。我们来试试发送附件

    发送email,就可以收到一个内容为hello world的text.txt文件,以及一个我公众号的二维码。

    HTML Email 编写指南: http://www.ruanyifeng.com/blog/2013/06/html_email.html

    这儿,我们使用Foundation for Emails: 的模板

    1. 'use strict';
    2. const nodemailer = require('nodemailer');
    3. const ejs = require('ejs');
    4. const fs = require('fs');
    5. const path = require('path');
    6. let transporter = nodemailer.createTransport({
    7. // host: 'smtp.ethereal.email',
    8. service: 'qq', // 使用内置传输发送邮件 查看支持列表:https://nodemailer.com/smtp/well-known/
    9. port: 465, // SMTP 端口
    10. secureConnection: true, // 使用 SSL
    11. auth: {
    12. user: 'xxxxxx@qq.com',
    13. pass: 'xxxxxx',
    14. }
    15. });
    16. from: '"JavaScript之禅" <xxxxx@qq.com>', // sender address
    17. to: 'xxxxxxxx@163.com', // list of receivers
    18. subject: 'Hello', // Subject line
    19. // 发送text或者html格式
    20. // text: 'Hello world?', // plain text body
    21. html: fs.createReadStream(path.resolve(__dirname, 'email.html')) // 流
    22. };
    23. // send mail with defined transport object
    24. transporter.sendMail(mailOptions, (error, info) => {
    25. if (error) {
    26. return console.log(error);
    27. }
    28. console.log('Message sent: %s', info.messageId);
    29. // Message sent: <04ec7731-cc68-1ef6-303c-61b0f796b78f@qq.com>
    30. });

    运行程序,你将如愿以偿手打如下Email。样式可能会有细微偏差

    上面email中我们用了外链的图片,我们也可以使用附件的方式,将图片嵌入进去。给附件加个cid属性即可。

    1. ...
    2. let mailOptions = {
    3. ...
    4. html: '<img src="cid:01">', // html body
    5. attachments: [
    6. {
    7. filename: 'ZenQcode.png',
    8. path: path.resolve(__dirname, 'ZenQcode.png'),
    9. cid: '01',
    10. }
    11. ]
    12. };
    13. ...

    邮件信息一般都不是固定的,我们可以引入模板引擎对HTML内容进行渲染。

    这里我们使用Ejs:https://github.com/mde/ejs/来做演示

    先建立一个email.ejs文件

    1. <h1>hello <%= title %></h1>
    2. <p><%= desc %></p>

    修改我们的js文件

    1. ...
    2. const template = ejs.compile(fs.readFileSync(path.resolve(__dirname, 'email.ejs'), 'utf8'));
    3. const html = template({
    4. title: 'Ejs',
    5. desc: '使用Ejs渲染模板',
    6. });
    7. let mailOptions = {
    8. from: '"JavaScript之禅" <xxxxx@qq.com>', // sender address
    9. to: 'xxxxx@163.com', // list of receivers
    10. subject: 'Hello', // Subject line
    11. html: html,// html body
    12. ...

    到此,你的邮箱将收到一个动态渲染的hello Ejs。

    本文到此告一段落,在此基础上你可以实现更多有用的功能

    HTML email 框架推荐

    左手代码,右手砖,抛砖引玉

    如果你知道更多好用HTML email资源,留言交流让更多人知道。

    产品周报类预览

    知乎周报

    关注公众号【JavaScript之禅】回复【 666 】,免费获取