最近需要实现有个邮箱验证和重置密码的服务,涉及到邮件发送的问题,团队其他成员实现了,自己学习下实现并记录下过程。
采用模块:nodemailer
模块官网:https://nodemailer.com/about/
license:MIT
测试环境:ubuntu(Tencent cloud)
npm install nodemailer 安装
使用该模块发送邮件有以下流程:
测试code:
const nodemailer = require('nodemailer');
let serveremail = {
user:"xxxxxxx@126.com",
password:"xxxxxxx",
service:'smtp.126.com'
}
nodemailer.createTestAccount((err, account) => {
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: serveremail.service, // 邮件服务地址 可在126后台查看
port: 465, // port
secure: true, // true for 465, false for other ports
auth: {
user: serveremail.user, // generated ethereal user
pass: serveremail.password // generated ethereal password
}
});
// setup email data with unicode symbols
let mailOptions = {
from: serveremail.user, // sender address
to: "xxxxxx@163.com, xxxxxxxx@gmail.com", // list of receivers 接收者地址
subject: 'Hello friend', // Subject line // 邮件标题
text: 'this is nodemailer test', // plain text body
html: '<b>Big test</b>' // html body //邮件内容
};
transporter.sendMail(mailOptions, (error, info) => { //发送邮件
if (error) {
return console.log(error);
}
console.log('Message sent: %s', info.messageId);//成功回调
console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
// Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
});
});
关于电子邮箱端口:
端口587只应用于提交(即,邮件客户端到邮件服务器)
端口25只应用于中继(即,邮件服务器到邮件服务器通信)
端口465 用于ssl方式连接。
{ Error: connect ECONNREFUSED 127.0.0.1:465
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1173:14)
errno: ‘ECONNREFUSED’,
code: ‘ECONNECTION’,
syscall: ‘connect’,
address: ‘127.0.0.1’,
port: 465,
command: ‘CONN’ }
是因为 Nodemailer传输器中host: 这是因为公司内网环境465端口出口地址被封了,连接不到网易的服务器。
{ Error: Invalid login: 550 code: ‘EAUTH’,
response: ‘550 Óû§ÎÞȨµÇ½’,
responseCode: 550,
command: ‘AUTH PLAIN’ }
126邮箱不支持直接使用账户密码登录,如果我们要使用SMTP需要网页登录到126邮箱后台 设置 中设置开启 SMTP功能并配置相应授权码。
然后在代码中 使用授权码替换邮箱密码 使用nodemailer进行邮件操作。
因为hotmail 发多了已经被封号了,而且hotmail发国内邮箱并不是很理想,该方案已经被替换成了 AWS SES服务,每月前几万条免费。PS:190215 发现SES到QQ邮箱好像也是有问题的,在网上找了资料建议使用sendcloud