文章目录
  1. 1. 前言
  2. 2. Nodemailer介绍
  3. 3. 实现简单发邮件
  4. 4. Nodemailer的高级使用
    1. 4.1. CC and BCC (抄送和密送)
    2. 4.2. 发送附件
    3. 4.3. 发HTML格式内容,并嵌入图片

前言

由于Node.js的代码特性,以及自己代码能力的问题,经常在跑程序的时候会报出一些不影响业务需求的错误,无非是jade方面缩进问题,或者是某个变量值为null or undefined的情况,在数据场景不一致,特别是数据来源并不唯一的情况下,就会出现这种不可预见的数据异常,例如其他方向的程序员有直接操作数据库的权限(遇到过C程序员不规范操作数据库,产生异常数据而导致系统奔溃,个人感觉这种架构很不合理,所以提出建议,用Node.js统一操作数据库,开放数据接口,与C程序进行交互,但无奈被否决)。所以希望在生产环境中程序一旦出现异常,会向特定的用户发出预警或者异常报告。而之前参与过一个项目是通过邮件通知程序员的。当时由于是实习成员身份,负责在架构师搭建的项目中去实现业务代码,并没有很认真去研究这种预警场景,所以今天按照自己的方式去实现。而此博文先实现发邮件的需求。

Nodemailer介绍

Nodemailer是一个Node中常用的用于发邮件的组件。Github地址为:https://github.com/andris9/Nodemailer
Node引用还是那样呗:

1
$ npm installl nodemailer

根据http://blog.fens.me/nodejs-email-nodemailer/的介绍,其主要特点包括:

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

一句话说完,足以满足你的需求了。

实现简单发邮件

根据官方提供的例子官网例子,通过Gmail邮箱发送邮件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var nodemailer = require('nodemailer');

// create reusable transporter object using SMTP transport
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'gmail.user@gmail.com',
pass: 'userpass'
}
});

// NB! No need to recreate the transporter object. You can use
// the same transporter object for all e-mails

// setup e-mail data with unicode symbols
var mailOptions = {
from: 'Fred Foo ✔ <foo@blurdybloop.com>', // sender address
to: 'bar@blurdybloop.com, baz@blurdybloop.com', // list of receivers
subject: 'Hello ✔', // Subject line
text: 'Hello world ✔', // plaintext body
html: '<b>Hello world ✔</b>' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);

});

如果你需要配置SMTP

1
2
3
4
5
6
7
8
9
10
11
12
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

var transporter = nodemailer.createTransport(smtpTransport({
host: "smtp.exmail.qq.com",
port: 465,
secure: true,
auth: {
user: "xxx@xxxx.com",
pass: "xxxxxxxxxxxx"
}
}));

Nodemailer的高级使用

Nodemailer支持的搞基功能包括:

  • CC and BCC (抄送和密送)
  • 发送附件
  • 发送HTML格式内容,可嵌入图片

CC and BCC (抄送和密送)

只需在mailOptions中添加cc和bcc的配置就行。

1
2
3
4
5
6
7
8
9
var mailOptions = {
from: 'Fred Foo ✔ <foo@blurdybloop.com>', // sender address
to: 'bar@blurdybloop.com, baz@blurdybloop.com', // list of receivers
cc: 'cc@blurdybloop.com, cc2@blurdybloop.com',
bcc: 'bcc@blurdybloop.com, bcc2@blurdybloop.com',
subject: 'Hello ✔', // Subject line
text: 'Hello world ✔', // plaintext body
html: '<b>Hello world ✔</b>' // html body
};

发送附件

在mailOptions中增加attachments数组配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var mailOptions = {
...
attachments: [
{ // 以字符串,做为文件正文内容
filename: 'text1.txt',
content: 'hello world!'
},
{ // binary buffer as an attachment
filename: 'text2.txt',
content: new Buffer('hello world!','utf-8')
},
{ // file on disk as an attachment
filename: 'text3.txt',
path: '/path/to/file.txt' // stream this file
},
{ // filename and content type is derived from path
path: '/path/to/file.txt'
},
{ // stream as an attachment
filename: 'text4.txt',
content: fs.createReadStream('file.txt')
},
{ // define custom content type for the attachment
filename: 'text.bin',
content: 'hello world!',
contentType: 'text/plain'
},
{ // use URL as an attachment
filename: 'license.txt',
path: 'https://raw.github.com/andris9/Nodemailer/master/LICENSE'
},
{ // encoded string as an attachment
filename: 'text1.txt',
content: 'aGVsbG8gd29ybGQh',
encoding: 'base64'
},
{ // data uri as an attachment
path: 'data:text/plain;base64,aGVsbG8gd29ybGQ='
}
]
}

发HTML格式内容,并嵌入图片

Nodemailer也为我们提供了在HTML的正文中嵌入图片的功能,程序中只要配置cid,作为图片的唯一引用地址就行了。上传本地图片./img/r-book1.png,设置cid为00000001,然后在html的正文中,img标签src属性指向00000001的cid就行了。

1
2
3
4
5
6
7
8
9
10
11
var mailOptions = {
from: 'bsspirit ',
to: 'xxxxx@163.com',
subject: 'Embedded Image',
html: '<b>Hello world ✔</b><br/>Embedded image: <img src="cid:00000001"/>',
attachments: [{
filename: '01.png',
path: './img/r-book1.png',
cid: '00000001'
}]
}
文章目录
  1. 1. 前言
  2. 2. Nodemailer介绍
  3. 3. 实现简单发邮件
  4. 4. Nodemailer的高级使用
    1. 4.1. CC and BCC (抄送和密送)
    2. 4.2. 发送附件
    3. 4.3. 发HTML格式内容,并嵌入图片