证书链中存在自签名证书导致邮件发送失败问题求助
邮件发送失败问题排查与解决
本该收到邮件但未成功发出,报错信息如下:
Error: self-signed certificate in certificate chain
at TLSSocket.onConnectSecure (node:_tls_wrap:1674:34)
at TLSSocket.emit (node:events:518:28)
at TLSSocket._finishInit (node:_tls_wrap:1085:8)
at ssl.onhandshakedone (node:_tls_wrap:871:12) { code: 'ESOCKET', command: 'CONN' }
使用的Nodemailer代码:
const transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', port: 465, secure: true, auth: { user: process.env.MAIL_ID, pass: process.env.MP, }, }); const info = await transporter.sendMail({ from: '" Hey 👻" <example2023@gmail.com>', to: data.to, subject: data.subject, text: data.text, html: data.htm, }); console.log('Message sent: %s', info.messageId); console.log('Preview URl: %s', nodemailer.getTestMessageUrl(info)); }); module.exports = sendEmail;
解决方案
临时方案(仅开发环境)
在 transporter 配置中添加 tls: { rejectUnauthorized: false },关闭证书校验:
const transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', port: 465, secure: true, auth: { user: process.env.MAIL_ID, pass: process.env.MP, }, tls: { rejectUnauthorized: false } });
⚠️ 注意:生产环境禁止使用此方法,会引入安全风险。
生产环境根本解决办法
- 检查本地环境证书链完整性,安装缺失的根证书。
- 如果使用了代理或VPN,这类工具可能生成自签名证书导致校验失败,尝试关闭后重试。
- 针对Gmail SMTP:
- 若账号未开启2FA,可临时开启“不太安全的应用访问”(不推荐长期使用)。
- 若账号开启了2FA,生成并使用App密码进行认证(推荐方式)。
内容的提问来源于stack exchange,提问作者Mavlon Turguunov
相关产品推荐
相关产品推荐

