使用nodejs发送电子邮件

电子邮件在日常工作中有很大用途,凡项目或任务,有邮件来往可避免扯皮背锅。
而在一些自动化的应用场合,也使用得广泛,特别是系统监控方面,如果在资源使用达到警戒线之前自动发邮件通知运维人员,能消除隐患于前期,而不至于临时临急去做善后方案。
对于多人协合(不管是不是异地)场合,邮件也有用武之地,当有代码或文档更新时,自动发邮件通知项目成员或领导,让各方人员知晓并及时更新(是否更新,取决于人,而非工具)。

说到发邮件,不得不提用程序的方式实现。笔者之前已经开通了腾讯免费企业邮箱,并关联自己的域名,自己注册了些邮箱来测试。
本文使用nodejs语言实现发送电子邮件。

实现

nodejs拥有大量的库,非常方便使用,发送邮件使用了nodemailer库,参考例程,实现了发送功能,源码文件emailtest.js如下:

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
42
43
44
45
46
47
48
49
50
51
52
/*
npm i nodemailer
使用:

*/
const nodemailer = require("nodemailer");

// 参数:发件人,收件人,主题,正文(支持html格式)
function sendMail(from, aliasName, tos, subject, msg)
{
const smtpTransport = nodemailer.createTransport({
host: 'smtp.exmail.qq.com',
secureConnection: true, // use SSL
secure: true,
port: 465,
auth: {
user: from,
pass: '1qaz@WSX',
}
});

smtpTransport.sendMail({
//from : '标题别名 <foobar@latelee.org>',
from : aliasName + ' ' + '<' + from + '>',
//'li@latelee.org, latelee@163.com',//收件人邮箱,多个邮箱地址间用英文逗号隔开
to : tos,
subject : subject,//邮件主题
//text : msg,
html : msg
}, function(err, res) {
if (err)
{
console.log('error: ', err);
}
});
}

function nl2br(str, isXhtml) {
var breakTag = (isXhtml || typeof isXhtml === 'undefined') ? '<br />' : '<br>';
var str = (str + '').replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
};

function main()
{
sendMail('cicd@latelee.org', 'nodejs机器人', "li@latelee.org, latelee@163.com",
'这是邮件标题',
'这是正文。<h2> 我的主页:</h2> 地址为:<a href= www.latelee.org" target="_blank">www.latelee.org</a></br>');
}

// call main
main();

测试

安装依赖包:

1
npm install nodemailer

运行程序:

1
node emailtest.js

小结

不同语言有不同的实现细节,但总是能达到目的。结综合考虑,最终决定使用nodejs来实现。后续将扩展这个功能。

过了半年的PS:近期笔者邮箱收到了许多测试邮件,如果使用本文示例,请修改sendMail函数第三个参数为自己想接收的邮件地址,另外请勿修改`cicd@latelee.org`邮件密码。另外,也有部分同志在测试中写了些不和谐的文字,请勿如此。
再过半年的PPS:近期经常收到测试邮件,对工作生活造成一定干扰,麻烦大家一定要修改接收邮件。否则我会修改邮件密码,本文示例无法直接使用。

李迟 2019.1.15 中午