zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    解决Ubuntu下pycharm无法输入中文的问题
    爬取www.mmjpg.com网站图片,你懂得哦!
    批量查询ip地址归属地
    Opencv源码编译
    使用阿里云安装python模块
    Ansible运维自动化
    Mha-Atlas-MySQL高可用
    SVN
    Tomcat
    DHCP
  • 原文地址:https://www.cnblogs.com/jackson-yqj/p/10154296.html
Copyright © 2011-2022 走看看