NodeJs之邮件(email)发送

NodeJs之邮件(email)发送

一,介绍与需求

 1.1,介绍

1,Nodemailer简介

Nodemailer是一个简单易用的Node.js邮件发送插件

github地址

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

 

posted @ 2019-04-22 14:22  jackson影琪  阅读(16440)  评论(0编辑  收藏  举报