之前对nodemailer做了简要的研究,基本上是搞定了发邮件的问题。但很多情况下邮件的内容不是固定的,然后又需要有一个合适的样式,这就需要使用模板了。nodemailer有nodemailer-markdownnodemailer-express-handlebars俩个插件,分别支持markdown语法和handlebars的语法,理论上handlebars也支持mustache模板,但是去看了看nodemailer-express-handlebars的用法,不是很喜欢。另外邮件采用markdown的风格不是很好,而且设不了邮件背景,不过适合发有代码片段的邮件。

为解决上面的问题,自己包装了一下mustache,取名mustache-promise,下面就展示一下如借助这个模块渲染mustache模板作为邮件内容.

代码

  • 项目结构

  • 主文件代码

 //Created By zj on 2015/10/3
var nodemailer = require('nodemailer');
var smtpPool=require("nodemailer-smtp-pool");
var Mustache=require("mustache-promise");
var path=require("path");
var options={
"service":"QQ",
"auth":{
"user":"xxxxx@qq.com",
"pass":"xxx"
},
"maxConnections":10,
"secure":true
};
var transporter = nodemailer.createTransport(smtpPool(options));
var mst_pro=new Mustache();
//设置模板文件所在目录,看上面的项目结构;设置文件扩展名为 .mst;load()从文件加载模板内容
mst_pro.dir(path.join(__dirname,"./views")).extName(".mst").load("base",{"by":"footer"});
var sendEmail=function(info){
mst_pro.ok().then(function(){
transporter.sendMail({
from:'xxxxx@qq.com',
to: 'yyyyyy@163.com',
subject: '吐槽',
html:mst_pro.render(info)//以info中的数据渲染模板,输出的是html格式的内容
},function(err,res){
if(err){
console.log(err);
}else{
console.log(res);
}
}); });
}
var information={
"title":"A股小评",
"comments":[{
"comment":"A股就像一个小娃娃一样,一跌就跌停,一涨就涨停,一点都不稳重!",
"byWho":"zj"
},{
"comment":"A股就是世界股市的一个奇葩,经常千股跌停千股涨停,不带这样的,经常做过山车会得心脏病的",
"byWho":"yyrdl"
},{
"comment":"不知道新的韭菜有没有长好,准备去割韭菜了,哈哈",
"byWho":"you guess:)"
}]
};
sendEmail(information);
  • base.mst
<h3 style="max-width:100px;margin-left:auto;margin-right:auto">{{title}}</h3>
{{#comments}}
<div style="background-color:skyblue;padding:10px;margin-top:10px;border-radius:3px;">
<p style="font-size: 14px">{{comment}}</p>
{{>by}}
</div>
{{/comments}}
  • footer.mst
 <div style="margin-left: 600px;font-style: italic;">
-----{{byWho}}
</div>

效果截图




如果你想在邮件中加背景图,其实很简单,参照之前那边文章中的逻辑就可以了,理论上讲加音乐也可以,我试试 :)--结果是显示出了audio标签,但显示不支持该类文件,失败!

mustache-promise的用法在文档里面有详细的介绍

---记录,分享。转载请注明出处!

最新文章

  1. hexo博客-性能优化
  2. [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹
  3. CXF 动态创建客户端调用稳定版本号为2.7.18
  4. Gemfile分平台加载gem
  5. 如何在iOS9的plist文件中配置不使用https
  6. stl map底层之红黑树插入步骤详解与代码实现
  7. [整][转]Invoke和BeginInvoke的使用
  8. codeforces round367 div2.C (DP)
  9. java基础回顾(二)——内部类
  10. LINQ(LINQ to Entities)
  11. redis的key过期时间
  12. 尝试获取TextBox_TextChanged事件订阅列表过程
  13. OC - 22.隐式动画
  14. nodejs 保存 payload 发送过来的文件
  15. C# WinForm ShowInTaskbar Api Version
  16. 马哥k8s
  17. IPFS扫盲
  18. 画一条0.5px的线
  19. Angular4学习笔记(九)- 生命周期钩子简介
  20. python------模块定义、导入、优化 -------&gt;Yaml, l模块

热门文章

  1. 关于python文件操作 (转载)
  2. Windows Phone开发-开发环境和结构
  3. Oracle 11g系统自己主动收集统计信息的一些知识
  4. Android Service 服务(一)—— Service .
  5. VB.net 利用SerialPort进行读取串口操作
  6. Windows系统下用命令行编译C/C++程序过程总结
  7. Azure CLI (一)如何安装和配置Azure CLI
  8. CentOS7安装和配置FTP
  9. zTree默认选中指定节点并执行事件
  10. 关于Eclipse中的egit的常规使用和模板