nodemailer 介绍
nodemailer 是 Node.js 中比较常用的用于发送邮件的一种中间件。
可以查看 nodemailer 在 npm 官网上的详细介绍: nodemailer 文档
注:邮箱验证就是通过POP3/SMTP等服务从一个邮箱发送内容给另一个邮箱去。
额外知识点
-
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
-
SMTP 服务器地址:实际上就是代收发服务器地址,是由邮箱服务商提供的。例如:QQ邮箱。
-
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。
前提
而要想让邮件服务器帮助我们发邮件,首先得让我们自己的邮箱账号同意开启POP3/SMTP服务。【此次举例 QQ邮箱的操作步骤,其他邮箱也大致一样。】
步骤如下:
1、发件人邮箱账户必须关闭QQ安全中心的邮箱保护。
2、在QQ邮箱点击 设置 > 账户 > 开启 下列服务:如下图:
3、生成授权码,用于通过SSL协议与POP3/SMTP等服务发送邮件的发件人进行登录验证。【注意:这里生成的授权码用于后面进行验证。】
这样,发件人邮箱就可以通过SSL协议,使用SMTP服务进行邮件发送了。
安装依赖
安装 nodemailer 及相应组件依赖
npm install nodemailer -s-d
npm install nodemailer-smtp-transport -s-d
开始使用
createTransport({…})
一、创建 SMTP 服务连接池,就跟数据库连接池一样可以进行回收的协议连接。主要是通过一些选项来配置好要应用的邮箱平台的主机认证,以 QQ 邮箱为例:
var nodemailer = require('nodemailer ');
//开启一个 SMTP 连接池
var transport = nodemailer.createTransport({
host : 'smtp.qq.com', //QQ邮箱的 smtp 服务器地址
secure : true, //使用 SSL 协议
secureConnection : false, //是否使用对 https 协议的安全连接
port : 465, //QQ邮件服务所占用的端口
auth : {
user : 'xxxxx@qq.com', //开启 smtp 服务的发件人邮箱,用于发送邮件给其他人
pass : 'xxxx' //SMTP 服务授权码
}
})
参数配置
创建好连接池之后,就需要为发送邮件功能进行配置一些参数信息。如下:
var mailOption = {
from : 'xxxx@qq.com', //发件人
to : 'xxx@qq.com', //收件人
subject : 'xxx注册验证', //标题
html : '<b>欢迎注册 xxx 系统</b>' //正文,可使用 HTML 格式进行渲染
}
sendMail(mailOption,call)
开始发送邮件,通过传入 mailOption 参数配置进行邮件发送,同时根据邮件发送情况执行回调函数 call。如下:
await transport.sendMail(mailOption,function (err,res)=>{
if(err){//执行错误
console.log(err)
} else {
console.log(res) //执行成功, 会返回响应体内容。
}
transport.close(); // 如果没用,则关闭连接池
})
常见错误记录
501
Error: Mail command failed: 501 mail from address must be same as authorization user
错误原因:授权码认证账号与发件人账号不一致。
535
Error: Invalid login: 535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
错误原因:发件人邮箱没有开启POP3/SMTP服务或没有输入正确的授权码。
解决方法:
1、进入发件人邮箱账户 设置 > 账户 > 开启 SMTP/POP3服务
2、生产授权码,将生成的授权码输入到 pass 关键字中。