最近需要实现有个邮箱验证和重置密码的服务,涉及到邮件发送的问题,团队其他成员实现了,自己学习下实现并记录下过程。
采用模块:nodemailer
模块官网:https://nodemailer.com/about/
license:MIT
测试环境:ubuntu(Tencent cloud)
1. 使用
npm install nodemailer 安装
使用该模块发送邮件有以下流程:
1. 使用SMTP或其他传输机制创建一个Nodemailer传输器
2. 设置消息选项(谁发送给谁)
3. 使用先前创建的传输器的sendMail()方法传递消息对象
测试code:
const nodemailer = require('nodemailer');
let serveremail = {
user:"[email protected]",
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: "[email protected], [email protected]", // 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方式连接。
2 遇到的问题
2.1
{ 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: 邮件服务商地址没有配置正确
2.2 使用126 邮箱报错
{ Error: Invalid login: 550 code: ‘EAUTH’,
response: ‘550 Óû§ÎÞȨµÇ½’,
responseCode: 550,
command: ‘AUTH PLAIN’ }
126邮箱不支持直接使用账户密码登录,如果我们要使用SMTP需要网页登录到126邮箱后台 设置 中设置开启 SMTP功能并配置相应授权码。
然后在代码中 使用授权码替换邮箱密码 使用nodemailer进行邮件操作。
2.3 实际使用中遇到的其他问题
因为hotmail 发多了已经被封号了,而且hotmail发国内邮箱并不是很理想,该方案已经被替换成了 AWS SNS服务,每月前几万条免费。