在开发公司自研监控系统时,需要开发一个邮件发送通知的功能。非常幸运,很快就发现了两个人气值很高的Node开源项目,结合它们完成了邮件发送功能的开发。
生成邮件模板(node-email-templates)
node-email-templates 允许我们像开发页面一样,生成邮件模板。我们可以使用熟悉的jade,ejs等视图引擎,还可以通过sass去编写模板样式。node-email-templates 会帮助我们自动生成相应的样式内嵌的html页面。
插件Git地址:https://github.com/niftylettuce/node-email-templates
使用举例
安装插件,这里的视图引擎我们采用了ejs,样式文件使用sass。
npm install email-templates ejs node-sass --save
添加模板文件夹,创建相关文件
我们在根目录下创建了一个名为templates的文件,用来存放邮件模板;接下来,我们再创建一个名为monapi的文件夹,用来存放api质量监控相关的邮件模板,在该文件夹下,我们共创建了三个文件。其中html.ejs文件是必须的,另外两个是可选的。
html.ejs:
<link rel="stylesheet" href="style.css"> <div class="api-info"> <h2>API名称:<%= name %></h2> <div><label>平均时间:</label><span><%= avgTime + 'ms' %></span></div> <div><label>成功率:</label><span><%= sucRatio + '%' %></span></div> </div>
text.ejs:
API名称:<%= name %> 平均时间:<%= avgTime + 'ms' %> 成功率:<%= sucRatio + '%' %>
style.scss:
.api-info{ h2{ font-size: 24px; color:red; } }
引用插件,生成邮件模板实例
接下来的工作就是基于模板文件和插件创建相应地邮件模板实例,代码如下:
var EmailTemplate = require('email-templates').EmailTemplate; var templateDir = path.resolve(__dirname, '..', 'templates'); var monapi = new EmailTemplate(path.join(templateDir, 'monapi'));
这里需要特别提醒的是,目录的引用地址需根据你实际实际使用的目录结构做相应地调整。
使用邮件模板实例,生成邮件模板源码
var apiInfo = { name: 'ws/get.cgi', avgTime:'200', sucRatio:'80' }; monapi.render(apiInfo, function(err, resluts){ if(err){ console.log(err); } console.log(results.html); //生成的html源码 console.log(results.text); //生成的text源码 });
如上所示,在回调函数里,我们可以得到生成的邮件模板源码。node-mail-template 还支持自己配置模板引擎,感兴趣的读者可以参考插件git文档中的介绍。
发送邮件(nodemailer)
现在我们已经生成了邮件的内容,接下来的工作就是发送邮件了。nodemailer是另外一个非常好用的插件,可以帮助我们非常方便的完成邮件发送的功能。
使用该插件需要注意两个核心概念,一个就是传输器(transporter),这是用来发送邮件的对象实例;该实例只需要初始化一次,就可以多次发送邮件。构建该对象实例时需定义一个传输机制(transport),这是另外一个核心概念。如果未制定使用的传输机制的话,传输器使用默认的传输机制nodemailer-direct-transport,使用默认传输是不可靠的,发送的邮件经常会被看做是垃圾邮件。一般推荐使用标准的SMTP传输node-mailer-smtp-transport。
nodemailer-direct-transport和node-smtp-transport都是nodemailer内置的传输机制。针对特定的邮件服务器,还可以手动添加其他的传输插件,例如nodemailer-ses-transport等。
插件Git地址:https://github.com/nodemailer/nodemailer
使用举例
我们的例子中采用了标准的SMTP传输。
安装插件
npm install modemailer --save
创建传输器实例
var nodemailer = require('nodemailer'); var transporter = nodemailer.createTransport( { host:'smtp.host.com', port:25, auth:{ user:'***', pass:'******' }, ignoreTLS:true, secure:false, debug:true } );
关于SMTP配置项的说明,请参考https://github.com/nodemailer/nodemailer-smtp-transport#usage。
发送邮件
最后一步就是发送邮件了,这里我们发送邮件的操作放到了邮件模板生成的回调函数中,以保证传输内容的准确性。代码如下:
monapi.render(apiInfo, function(err, results){ if(err){ console.log(err); return; } transporter.sendMail({ from:'***@host.com', //发送邮箱 to: '***@server.com, ***@sina.com', //接收邮箱 subject: 'hello', html:results.html, //生成的html源码 text: results.text //生成的text源码 }, function(error, info){ if(err){ console.log(error); } }); });
邮件收到的内容如下:
另外,nodemailer还提供了添加抄送人,添加附件,内嵌图片等邮件发送常用功能。感兴趣的读者请参考插件git官方文档。