個(gè)人博客原文:https://bxm0927.github.io/2017/07/21/node-mail/
nodemailer 簡(jiǎn)介
Nodemailer 是 Node.js 應(yīng)用程序的一個(gè)模塊,可以方便地發(fā)送電子郵件。
該項(xiàng)目于 2010 年開(kāi)始,至今已經(jīng)相當(dāng)穩(wěn)定,這也是如今大多數(shù) Node.js 用戶默認(rèn)情況下發(fā)送郵件的解決方案。
使用
# 初始化 pageage.json 文件
$ npm init
# 安裝依賴
$ npm install nodemailer --save
# 運(yùn)行
node app.js
app.js
const nodemailer = require('nodemailer');
// 開(kāi)啟一個(gè) SMTP 連接池
let transporter = nodemailer.createTransport({
host: 'smtp.qq.com',
secureConnection: true, // use SSL
port: 465,
secure: true, // secure:true for port 465, secure:false for port 587
auth: {
user: '80583600@qq.com',
pass: 'xxx' // QQ郵箱需要使用授權(quán)碼
}
});
// 設(shè)置郵件內(nèi)容(誰(shuí)發(fā)送什么給誰(shuí))
let mailOptions = {
from: '"白小明 ??" <80583600@qq.com>', // 發(fā)件人
to: 'xx1@qq.com, xx2@qq.com', // 收件人
subject: 'Hello ?', // 主題
text: '這是一封來(lái)自 Node.js 的測(cè)試郵件', // plain text body
html: '<b>這是一封來(lái)自 Node.js 的測(cè)試郵件</b>', // html body
// 下面是發(fā)送附件,不需要就注釋掉
attachments: [{
filename: 'test.md',
path: './test.md'
},
{
filename: 'content',
content: '發(fā)送內(nèi)容'
}
]
};
// 使用先前創(chuàng)建的傳輸器的 sendMail 方法傳遞消息對(duì)象
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log(`Message: ${info.messageId}`);
console.log(`sent: ${info.response}`);
});
效果預(yù)覽
踩坑細(xì)節(jié)
實(shí)踐的時(shí)候遇到許多問(wèn)題,現(xiàn)在列舉如下,若未詳盡,敬請(qǐng)留言交流。
POP3/SMTP服務(wù)、獲取授權(quán)碼(以QQ為例)
首先需要開(kāi)啟郵箱的 POP3/SMTP 服務(wù)。
QQ郵箱需要使用授權(quán)碼,而不是QQ密碼;163 郵箱直接使用163郵箱密碼就行。
進(jìn)入QQ郵箱,設(shè)置-賬戶-開(kāi)啟服務(wù) POP3/SMTP 服務(wù),并生成授權(quán)碼,現(xiàn)在獲取授權(quán)碼需要驗(yàn)證手機(jī)短信。
支持郵箱
理論上支持所有主流郵箱,但我只測(cè)試了 QQ 和 163,都成功了。若其他郵箱出問(wèn)題請(qǐng)留言交流。
535 錯(cuò)誤
Error: Invalid login: 535 Error: authentication failed
認(rèn)證失敗:
- 可能是賬號(hào)密碼錯(cuò)誤
- 鏈接資源池時(shí)加 ssl:
secureConnection: true,
- QQ 的 host 是
smtp.qq.com
;163 的 host 是smtp.163.com
553 錯(cuò)誤
Error: Mail command failed: 553 Mail from must equal authorized user
發(fā)件人和認(rèn)證的郵箱地址不一致
- auth.user 需要與 from 中的郵箱一致