NodeJs之郵件(email)發送
一,介紹與需求
1.1,介紹
1,Nodemailer簡介
Nodemailer是一個簡單易用的Node.js郵件發送插件
Nodemailer的主要特點包括:
-
- 支持Unicode編碼
- 支持Window系統環境,不需要安裝依賴
- 支持HTML內容和普通文本text內容
- 支持附件(傳送大附件)
- 支持HTML內容中嵌入圖片
- 支持SSL/STARTTLS安全的郵件發送
- 支持內置的transport方法和其他插件實現的transport方法
- 支持自定義插件處理消息
- 支持XOAUTH2登錄驗證
常見發郵件的字段:
-
- from 發送者郵箱
- sender 發送者區域顯示的信息
- to 接收者郵箱
- cc 抄送者郵箱
- bcc 密送者郵箱
- subject 郵箱主題
- attachments 附件內容
- watchHtml apple watch指定的html版本
- text 文本信息
- html html內容
- headers 另加頭信息
- encoding 編碼格式
郵件內容使用UTF-8格式,附件使用二進制流。
附件
附件對象包含了下面這些屬性:
-
- filename 附件名
- content 內容
- encoding 編碼格式
- path 文件路徑
- contentType 附件內容類型
2,emailjs簡介
emailjs是一個簡單易用的Node.js郵件發送插件
1 npm install emailjs --save
下面講的主要是Nodemailer發送郵件,畢竟星比較多嘛
1.2,需求
電子郵件是—種用電子手段提供信息交換的通信方式,是互聯網應用最廣的服務。通過網絡的電子郵件系統,用戶可以以非常低廉的價格(不管發送到哪里,都只需負擔網費)、非常快速的方式(幾秒鍾之內可以發送到世界上任何指定的目的地),與世界上任何一個角落的網絡用戶聯系。
在很多項目中,我們都會遇到郵件注冊,郵件反饋等需求。在node中收發電子郵件也非常簡單,因為強大的社區有各種各樣的包可以供我么直接使用。
二,配置使用
主要講的是Nodemailer發送郵件
第一步:安裝Nodemailer
1 npm install nodemailer --save
第二步:配置參數xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <appSettings> 3 <add key="smtp" value="smtp.qq.com"/> 4 <!-- 配置服務 smtp.exmail.qq.com//企業郵箱 非qq; --> 5 <add key="mailFrom" value="*@qq.com"/> 6 <!--配置發送郵箱 --> 7 <add key="mailPwd" value="v567jvsvqajos67e"/> 8 <!--smtp授權碼 --> 9 </appSettings>
第三步:封裝發送郵件方法
使用內置傳輸的方式發送郵件,在sendEmail.js添加如下代碼:
1 var nodemailer = require("nodemailer"); 2 var settingConfig = require('../config/settingConfig.js');//解析參數 3 4 var smtp = settingConfig.getValueByKey("smtp"); 5 var mailFrom = settingConfig.getValueByKey("mailFrom"); 6 var mailPwd = settingConfig.getValueByKey("mailPwd"); 7 8 function emailTo(email,subject,text,html,callback) { 9 var transporter = nodemailer.createTransport({ 10 host: smtp, 11 auth: { 12 user: mailFrom, 13 pass: mailPwd //授權碼,通過QQ獲取 14 15 } 16 }); 17 var mailOptions = { 18 from: mailFrom, // 發送者 19 to: email, // 接受者,可以同時發送多個,以逗號隔開 20 subject: subject, // 標題 21 }; 22 if(text != undefined) 23 { 24 mailOptions.text =text;// 文本 25 } 26 if(html != undefined) 27 { 28 mailOptions.html =html;// html 29 } 30 31 var result = { 32 httpCode: 200, 33 message: '發送成功!', 34 } 35 try { 36 transporter.sendMail(mailOptions, function (err, info) { 37 if (err) { 38 result.httpCode = 500; 39 result.message = err; 40 callback(result); 41 return; 42 } 43 callback(result); 44 }); 45 } catch (err) { 46 result.httpCode = 500; 47 result.message = err; 48 callback(result); 49 } 50 51 }
使用其他傳輸插件 https://github.com/andris9/nodemailer-smtp-transport,
安裝插件
1 npm install nodemailer-smtp-transport --save
其他代碼類似,差別只是在創建transport上,所以這里我就寫一部分代碼:
1 var nodemailer = require('nodemailer'); 2 var smtpTransport = require('nodemailer-smtp-transport'); 3 4 function emailTo(email,subject,text,html,callback) { 5 // 開啟一個 SMTP 連接池 6 var transporter = nodemailer.createTransport(smtpTransport({ 7 host: smtp,//主機 8 secure: true, // 使用 SSL 9 secureConnection: true, // 使用 SSL 10 port: 465, // SMTP 端口 11 auth: { 12 user: mailFrom, 13 pass: mailPwd //授權碼,通過QQ獲取 14 15 } 16 })); 17 var mailOptions = { 18 from: mailFrom, // 發送者 19 to: email, // 接受者,可以同時發送多個,以逗號隔開 20 subject: subject, // 標題 21 };24 mailOptions.text =text;// 文本 30 31 var result = { 32 httpCode: 200, 33 message: '發送成功!', 34 data: [], 35 } 36 try { 37 transporter.sendMail(mailOptions, function (err, info) { 38 if (err) { 39 result.httpCode = 500; 40 result.message = err; 41 callback(result); 42 return; 43 } 44 callback(result); 45 }); 46 } catch (err) { 47 result.httpCode = 500; 48 result.message = err; 49 callback(result); 50 } 51 transport.close(); // 如果沒用,關閉連接池 52 53 }
第四步:發送郵件接口
在sendEmailApi.js添加如下代碼:
1 var mailer = require('../services/sendEmail.js'); 2 router.post("/SendEmail", function (req, res) { 3 var email = req.body.email; 4 var subject = "影琪通知";//標題 5 var text =undefined; 6 var html = "<p>你好</p><p>歡迎訪問jackson影琪</p><p>點擊下面鏈接進入訪問吧:</p><p><a href='https://www.cnblogs.com/jackson-zhangjiang/'>https://www.cnblogs.com/jackson-zhangjiang/</a></p>";; 7 mailer.emailTo(email, subject, text, html, function (data) { 8 res.status(data.httpCode).json(data); 9 }) 10 })
第五步:拋出發送郵件接口
在app.js添加如下代碼:
1 app.use("/api", require("./sendEmailApi.js"));
第六步:web前端調用
采用jquery的方式,使用ajax
1 sendEmail: function (email, callBack) { 2 var datajson = { 3 "email": email 4 }; 5 $.ajax({ 6 url: 'http://127.0.0.1:3000/api/' + 'SendEmail', 7 type: "POST", 8 dataType: "json", 9 xhrFields: { 10 withCredentials: true 11 }, 12 crossDomain: true, 13 data: datajson, 14 success: function (data) { 15 callBack(data); 16 }, 17 error: function (err) { 18 console.log(err); 19 } 20 }); 21 }
第七步:效果

三,常見問題
1.賬號未設置該服務
1 { [AuthError: Invalid login - 454 Authentication failed, please open smtp flag first!] 2 name: 'AuthError', 3 data: '454 Authentication failed, please open smtp flag first!', 4 stage: 'auth' }
解決方案:QQ郵箱 -> 設置 -> 帳戶 -> 開啟服務:POP3/SMTP服務
2.登錄認證失敗,可能由於smpt授權碼/獨立密碼錯誤導致
1 Invalid login - 535 Authentication failed
解決方案:
qq郵箱在測試smtp郵件服務器時,
一,在qq郵箱,設置,賬戶設置中.開啟下smtp.
二,獲取授權碼.
三,在配置smtp服務器的密碼時,注意一定要填你獲得的授權碼.不要用郵箱登錄密碼.否則會提示535 Authentication failed錯誤.
3.權限認證失敗,可能由於授權碼錯誤導致,或者發件服務器不對應 我在qq設置的時候就遇到過

解決方案:登錄Foxmail,查看發件服務器是什么?我QQ郵箱發件服務器是smtp.qq.com,企業郵箱是:smtp.exmail.qq.com
