前言:
这是实现用户邮件认证的一部分,也问了很多人应该怎么处理,折腾了也大半天,主要困在渲染和异步的坑哪里。最终效果..
代码实现:
nodermailer相关代码如下,不要妄想做什么邮件轰炸器,一般邮箱每秒接受8封同账户邮件(亲贱),需要注意的地方时from:后面的发送人地址“<>”不要漏了,之前在这里踩了个大坑。
var Nodemailer=require('nodemailer'); var transporter = Nodemailer.createTransport({ host: 'smtp.163.com', port: 25, auth: { user: '******', pass: '*******' } }) var mailOptions = { secureConnection: true, from: 'DDH<fkwebs@163.com>', // sender address to: That.to, // list of receivers//接收人地址 subject: 'DDH邮件账户认证 ✔', // Subject line text: '邮件激活认证✔', // plaintext body 就是直接找邮件上显示的text内容 html: html// html body }; transporter.sendMail(mailOptions, function (error, info) { if (error) { callback(error, null); } else { callback(null, info.response); } })
这还仅仅不够,需要渲染的html页面,怎么能从模版中做好用户名称和验证地址的渲染呢?总不能让所有Email的千篇一律吧,于是乎又陷入深深的纠结之中。于是问了柴犬君,柴犬君答:“汪,汪,汪汪!!”没错,我从他的教导生中领会到了就是This!
function stmpHTML(name){ var str1='我的名字是' var str2='我喜欢吃翔' return (str1+name+str12) } stmpHTML(柴犬);//返回:我的名字是柴犬,我喜欢吃翔。
从这里,我们可以看到大哥柴犬的智商是多么的高,我是万万没想到还可以这样弄。稍等…有点不对劲,如果需要渲染的信息很多这不就是坑了。于是乎我又问柴犬大哥,大哥云:“汪汪,汪汪汪,汪汪,汪!”
大哥果然是大哥,他说可以用jade渲染用rander方法,聪明如你,我刚准备res.render()然后爬虫爬回来(PS:我是有多笨),大哥又叫了几声,我baidu一下,原来jade有 jade.renderFile();方法可以渲染文件并返回一个html;
jade.renderFile('views/mailer/prove.jade', JadeByHtml, function (error, html) { //JadeByHtml 是要渲染的信息 console.log(html) }
这样就方便多了,只要jade模版整好,直接就能渲染成html字串,分分钟成功。这个故事告诉我们:jade是渲染引擎,而不是渲染中间件…..
然后我屁颠屁颠的去执行,发现每次都收到一个空对象的文件,一开始以为是收邮件网页无法解析<html><heade><body>等重复标签,经过折腾发现,多个标签浏览器是自动合并的,最后又问了狗哥,狗哥说,我掉进了异步的大坑。就是同时写了多个异步函数在同一个函数里,jade不等渲染返回,下面的方法就执行了,而且两个回调不容易写嵌套,这意味着下面的对象无法调用jade的渲染回调,如果写到里面,下面的回调又不能获取mailoption来发送邮件。狗哥说发给他看看能不能写成回调,一不做二不休,自己翻出ECMA6,来了个promise(人生中第一个ECMA6语法),折腾了2小时终于让他们有序执行了。具体方法下次说。