原文連接:Node.js使用Nodemailer發送郵件javascript
電子郵件是—種用電子手段提供信息交換的通訊方式,是互聯網應用最廣的服務。經過網絡的電子郵件系統,用戶能夠以很是低廉的價格(無論發送到哪裏,都只需負擔網費)、很是快速的方式(幾秒鐘以內能夠發送到世界上任何指定的目的地),與世界上任何一個角落的網絡用戶聯繫。html
在不少項目中,咱們都會遇到郵件註冊,郵件反饋等需求。在node中收發電子郵件也很是簡單,由於強大的社區有各類各樣的包能夠供我麼直接使用。Nodemailer包就能夠幫助咱們快速實現發送郵件的功能。java
Github源碼:https://github.com/ogilhinn/node-abc/tree/master/lesson10node
Nodemailer是一個簡單易用的Node.js郵件發送組件git
官網地址:https://nodemailer.comgithub
GitHub地址:https://github.com/nodemailer/nodemailernpm
Nodemailer的主要特色包括:安全
首先,咱們確定是要下載安裝 注意:Node.js v6+bash
npm install nodemailer --save
打開官網能夠看見一個小例子網絡
'use strict'; const nodemailer = require('nodemailer'); // Generate test SMTP service account from ethereal.email // Only needed if you don't have a real mail account for testing nodemailer.createTestAccount((err, account) => { // create reusable transporter object using the default SMTP transport let transporter = nodemailer.createTransport({ host: 'smtp.ethereal.email', port: 587, secure: false, // true for 465, false for other ports auth: { user: account.user, // generated ethereal user pass: account.pass // generated ethereal password } }); // setup email data with unicode symbols let 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?', // plain text body html: '<b>Hello world?</b>' // html body }; // send mail with defined transport object transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log('Message sent: %s', info.messageId); // Preview only available when sending through an Ethereal account console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info)); // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@blurdybloop.com> // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou... }); });
這個小例子是生成了Ethereal的帳戶進行郵件發送演示的。可是這多沒意思,咱們來使用本身的郵箱來發送郵件
這裏我使用了個人qq郵箱給163郵箱發送email。
'use strict'; const nodemailer = require('nodemailer'); let transporter = nodemailer.createTransport({ // host: 'smtp.ethereal.email', service: 'qq', // 使用了內置傳輸發送郵件 查看支持列表:https://nodemailer.com/smtp/well-known/ port: 465, // SMTP 端口 secureConnection: true, // 使用了 SSL auth: { user: 'xxxxxx@qq.com', // 這裏密碼不是qq密碼,是你設置的smtp受權碼 pass: 'xxxxxx', } }); let mailOptions = { from: '"JavaScript之禪" <xxxxx@qq.com>', // sender address to: 'xxxxxxxx@163.com', // list of receivers subject: 'Hello', // Subject line // 發送text或者html格式 // text: 'Hello world?', // plain text body html: '<b>Hello world?</b>' // html body }; // send mail with defined transport object transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log('Message sent: %s', info.messageId); // Message sent: <04ec7731-cc68-1ef6-303c-61b0f796b78f@qq.com> });
運行程序,成功將返回messageId。這是即可以去收件箱查看這個新郵件啦
這裏咱們須要注意,auth.pass 不是郵箱帳戶的密碼而是stmp的受權碼。
到此咱們就掌握了發郵件的基本操做。
更多配置項:https://nodemailer.com/message/
這裏咱們就不演示CC、BCC了,請自行嘗試。咱們來試試發送附件
... // 只需添加attachments配置項便可 attachments: [ { // utf-8 string as an attachment filename: 'text.txt', content: 'hello world!' }, { filename: 'ZenQcode.png', path: path.resolve(__dirname, 'ZenQcode.png'), } ] ...
發送email,就能夠收到一個內容爲hello world的text.txt文件,以及一個我公衆號的二維碼。
HTML Email 編寫指南: http://www.ruanyifeng.com/blog/2013/06/html_email.html
這兒,咱們使用Foundation for Emails: https://foundation.zurb.com/emails.html的模板
'use strict'; const nodemailer = require('nodemailer'); const ejs = require('ejs'); const fs = require('fs'); const path = require('path'); let transporter = nodemailer.createTransport({ // host: 'smtp.ethereal.email', service: 'qq', // 使用內置傳輸發送郵件 查看支持列表:https://nodemailer.com/smtp/well-known/ port: 465, // SMTP 端口 secureConnection: true, // 使用 SSL auth: { user: 'xxxxxx@qq.com', // 這裏密碼不是qq密碼,是你設置的smtp受權碼 pass: 'xxxxxx', } }); let mailOptions = { from: '"JavaScript之禪" <xxxxx@qq.com>', // sender address to: 'xxxxxxxx@163.com', // list of receivers subject: 'Hello', // Subject line // 發送text或者html格式 // text: 'Hello world?', // plain text body html: fs.createReadStream(path.resolve(__dirname, 'email.html')) // 流 }; // send mail with defined transport object transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log('Message sent: %s', info.messageId); // Message sent: <04ec7731-cc68-1ef6-303c-61b0f796b78f@qq.com> });
運行程序,你將如願以償收到以下Email。樣式可能會有細微誤差
上面email中咱們用了外鏈的圖片,咱們也可使用附件的方式,將圖片嵌入進去。給附件加個cid
屬性便可。
... let mailOptions = { ... html: '<img src="cid:01">', // html body attachments: [ { filename: 'ZenQcode.png', path: path.resolve(__dirname, 'ZenQcode.png'), cid: '01', } ] }; ...
郵件信息通常都不是固定的,咱們能夠引入模板引擎對HTML內容進行渲染。
這裏咱們使用Ejs:https://github.com/mde/ejs/來作演示
$ npm install ejs --save
ejs具體語法請參看官方文檔
先創建一個email.ejs文件
<h1>hello <%= title %></h1> <p><%= desc %></p>
修改咱們的js文件
... const template = ejs.compile(fs.readFileSync(path.resolve(__dirname, 'email.ejs'), 'utf8')); const html = template({ title: 'Ejs', desc: '使用Ejs渲染模板', }); let mailOptions = { from: '"JavaScript之禪" <xxxxx@qq.com>', // sender address to: 'xxxxx@163.com', // list of receivers subject: 'Hello', // Subject line html: html,// html body }; ...
到此,你的郵箱將收到一個動態渲染的hello Ejs。
本文到此告一段落,在此基礎上你能夠實現更多有用的功能
左手代碼,右手磚,拋磚引玉
若是你知道更多好用HTML email資源,留言交流讓更多人知道。
…
…
…