Nodemailer在开发环境正常,生产环境无法发邮件如何解决?
解决Nodemailer+Gmail SMTP生产环境无法发邮件的问题
检查Gmail账户安全设置
Gmail现已禁用“不太安全的应用”访问权限,开发环境可能靠临时绕过验证正常运行,但生产环境服务器IP会触发安全拦截,必须用以下两种方式之一:- 启用两步验证后生成应用专用密码:先给Gmail账户开启两步验证,再在Google账户安全设置里找到“应用专用密码”,生成专属密码替换环境变量里的
SMPT_PASSWORD。 - 改用OAuth2认证:若不想开两步验证,可使用OAuth2方式配置transporter,需要在Google Cloud Console创建OAuth客户端ID,拿到相关凭证后修改代码:
const transporter = nodeMailer.createTransport({ service: 'gmail', auth: { type: 'OAuth2', user: process.env.SMPT_MAIL, clientId: process.env.OAUTH_CLIENT_ID, clientSecret: process.env.OAUTH_CLIENT_SECRET, refreshToken: process.env.OAUTH_REFRESH_TOKEN, accessToken: process.env.OAUTH_ACCESS_TOKEN, }, });
- 启用两步验证后生成应用专用密码:先给Gmail账户开启两步验证,再在Google账户安全设置里找到“应用专用密码”,生成专属密码替换环境变量里的
排查生产环境网络限制
多数云服务商默认屏蔽25端口,Gmail SMTP支持465(SSL)和587(TLS)端口,直接指定端口和安全协议避免被拦截:const transporter = nodeMailer.createTransport({ host: 'smtp.gmail.com', port: 465, secure: true, // 465端口对应SSL // 或用587端口:port:587, secure: false, tls: {rejectUnauthorized: false} auth: { user: process.env.SMPT_MAIL, pass: process.env.SMPT_PASSWORD, // 此处填应用专用密码 }, });添加错误捕获与日志
生产环境无控制台输出,必须加错误捕获打印详细日志,才能定位是认证失败、网络超时还是其他问题:exports.sendEmail = async (options) => { try { const transporter = nodeMailer.createTransport({ service: "gmail", auth: { user: process.env.SMPT_MAIL, pass: process.env.SMPT_PASSWORD, }, }); // 先验证transporter配置有效性 await transporter.verify(); const mailOptions = { from: process.env.SMPT_MAIL, to: options.email, subject: options.subject, html: options.message, }; await transporter.sendMail(mailOptions); console.log('邮件发送成功'); } catch (error) { console.error('邮件发送失败:', error.message, error.stack); throw error; // 抛出错误供上层处理 } };检查Gmail发送限制
Gmail免费账户每日最多发送500封邮件,若生产环境发送量超标也会失败,这种情况建议更换Google Workspace账户或第三方邮件服务(如SendGrid、Mailgun)。
内容的提问来源于stack exchange,提问作者Anmol ahuja
相关产品推荐
相关产品推荐

