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
在settingConfig.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
3376





