最近在用eggjs做背景開發,正好遇到需要發送郵件的功能,再此記錄一下
1. 下載下傳 nodemailer
npm install nodemailer --save
2. 郵箱授權
當然,要發送郵件,我們需要有自己的郵箱,并且要去擷取到授權碼
這裡以QQ郵箱為例:
進入郵箱 》 設定 》 賬戶 》POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務
開啟POP3/SMYP服務,擷取授權碼
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/