nodejs 邮件服务(网易126邮箱为例)

蓬新
2023-12-01

最近需要实现有个邮箱验证和重置密码的服务,涉及到邮件发送的问题,团队其他成员实现了,自己学习下实现并记录下过程。

采用模块: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:"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方式连接。

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: 这是因为公司内网环境465端口出口地址被封了,连接不到网易的服务器。

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 SES服务,每月前几万条免费。PS:190215 发现SES到QQ邮箱好像也是有问题的,在网上找了资料建议使用sendcloud

 类似资料: