Node.js使用Nodemailer發送郵件

原文連接:Node.js使用Nodemailer發送郵件javascript

電子郵件是—種用電子手段提供信息交換的通訊方式,是互聯網應用最廣的服務。經過網絡的電子郵件系統,用戶能夠以很是低廉的價格(無論發送到哪裏,都只需負擔網費)、很是快速的方式(幾秒鐘以內能夠發送到世界上任何指定的目的地),與世界上任何一個角落的網絡用戶聯繫。html

在不少項目中,咱們都會遇到郵件註冊,郵件反饋等需求。在node中收發電子郵件也很是簡單,由於強大的社區有各類各樣的包能夠供我麼直接使用。Nodemailer包就能夠幫助咱們快速實現發送郵件的功能。java

Github源碼:https://github.com/ogilhinn/node-abc/tree/master/lesson10node

Nodemailer簡介

Nodemailer是一個簡單易用的Node.js郵件發送組件git

官網地址:https://nodemailer.comgithub

GitHub地址:https://github.com/nodemailer/nodemailernpm

Nodemailer的主要特色包括:安全

  • 支持Unicode編碼
  • 支持Window系統環境
  • 支持HTML內容和普通文本內容
  • 支持附件(傳送大附件)
  • 支持HTML內容中嵌入圖片
  • 支持SSL/STARTTLS安全的郵件發送
  • 支持內置的transport方法和其餘插件實現的transport方法
  • 支持自定義插件處理消息
  • 支持XOAUTH2登陸驗證

安裝使用

首先,咱們確定是要下載安裝 注意: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。這是即可以去收件箱查看這個新郵件啦

email

這裏咱們須要注意,auth.pass 不是郵箱帳戶的密碼而是stmp的受權碼。

到此咱們就掌握了發郵件的基本操做。

更多配置

  • CC: Carbon Copy(抄送),用於通知相關的人,收件人能夠看到都郵件都抄送給誰了。通常回報工做或跨部門溝通時,都會CC給收件人的領導一份
  • BCC:Blind Carbon Copy(暗抄送),也是用於通知相關的人,可是收件人是看不到郵件被密送給誰了。
  • attachments: 附件

更多配置項: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郵件

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。樣式可能會有細微誤差

屏幕快照 2017-12-01 16.32.41

上面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 框架推薦

左手代碼,右手磚,拋磚引玉

若是你知道更多好用HTML email資源,留言交流讓更多人知道。

最後福利乾貨來了

36個國內外精緻電子郵件HTML模版

產品週報類預覽

投票

知乎週報

關注公衆號【JavaScript之禪】回覆【 666 】,免費獲取

JavaScript之禪

相關文章
相關標籤/搜索