天天看點

eggjs 使用nodemailer發送郵件

最近在用eggjs做背景開發,正好遇到需要發送郵件的功能,再此記錄一下

1. 下載下傳 nodemailer

npm install nodemailer --save
           

2. 郵箱授權

當然,要發送郵件,我們需要有自己的郵箱,并且要去擷取到授權碼

這裡以QQ郵箱為例:

進入郵箱 》 設定 》 賬戶 》POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務

開啟POP3/SMYP服務,擷取授權碼

eggjs 使用nodemailer發送郵件

3. 使用nodemailer

獲得授權碼後,我們就可以測試一下了

// 這裡舉簡單例子,也可以封裝成service來調用
// 引入nodemailer
const nodemailer = require('nodemailer');

// 封裝發送者資訊
const transporter = nodemailer.createTransport({
  service: 'qq', // 調用qq伺服器
  secureConnection: true, // 啟動SSL
  port: 465, // 端口就是465
  auth: {
    user: '[email protected]', // 賬号
    pass: 'xxxxxxxxxx', // 授權碼,

  },
});

// 郵件參數及内容
const mailOptions = {
  from: '[email protected]', // 發送者,與上面的user一緻
  to: '[email protected]', // 接收者,可以同時發送多個,以逗号隔開
  subject: '測試的郵件', // 标題
  // text: '測試内容', // 文本
  html: '<h2>測試一下:</h2><a class="elem-a" href="https://baidu.com" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ><span class="content-elem-span">測試連結</span></a>',
};

// 調用函數,發送郵件
await transporter.sendMail(mailOptions, function(err, info) {
  if (err) {
    console.log(err);
    return;
  }
  console.log(info);

});
           

簡單封裝

上面是直接使用nodemailer,在實際開發中,我們可以對其進行簡單封裝,以便調用

在app/service/tool.js檔案

// app/service/tool.js

'use strict';

const Service = require('egg').Service;

const nodemailer = require('nodemailer');
const user_email = '[email protected]';
const auth_code = 'xxxxxx';

const transporter = nodemailer.createTransport({
  service: 'qq',
  secureConnection: true,
  port: 465,
  auth: {
    user: user_email, // 賬号
    pass: auth_code, // 授權碼

  },
});

class ToolService extends Service {

  async sendMail(email, subject, text, html) {

    const mailOptions = {
      from: user_email, // 發送者,與上面的user一緻
      to: email,   // 接收者,可以同時發送多個,以逗号隔開
      subject,   // 标題
      text,   // 文本
      html,
    };

    try {
      await transporter.sendMail(mailOptions);
      return true;
    } catch (err) {
      return false;
    }
  }

}

module.exports = ToolService;

           

在測試controller中調用, app/controller/test.js

// app/controller/test.js
'use strict';

const Controller = require('egg').Controller;

class TestController extends Controller {
  async testSendMail() {
  	const ctx = this.ctx;
  	
  	const email = '[email protected]';  // 接收者的郵箱
    const subject = '測試郵件';
    const text = '這是一封測試郵件';
    const html = '<h2>測試一下::</h2><a class="elem-a" href="https://baidu.com" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ><span class="content-elem-span">測試連結</span></a>';
    
    const has_send = await this.service.tool.sendMail(email, subject, html);
    
    if (has_send) {
		ctx.body={
			message: '發送成功',
		};
		return;
	}
	ctx.body={
		message: '發送失敗',
	};
    
  }

}

module.exports = TestController;
           

這就是簡單的發送郵件,這個插件還可以上傳附件,詳情可參考nodemailer文檔:https://nodemailer.com/about/