NestJS配置Gmail SMTP的MailerModule连接失败问题求助
NestJS MailerModule 配置Gmail SMTP连接失败解决方案
问题分析
你遇到的ECONNREFUSED 172.217.194.108:465错误,本质是SMTP连接无法建立,可能由配置参数冲突、端口不匹配或网络限制导致。以下是针对两种配置方式的修复方案:
方案1:使用谷歌应用密码(推荐,适配已开启的2FA)
当配置service: 'gmail'时,Nodemailer会自动填充Gmail的SMTP默认参数,但需确保secure属性与对应端口匹配:
正确配置示例(465 SSL端口)
MailerModule.forRootAsync({ inject: [ConfigService], useFactory: async (configService: ConfigService) => { return { transport: { service: 'gmail', secure: true, // 对应465 SSL端口 auth: { user: configService.get('email.user'), pass: configService.get('email.pass'), // 谷歌应用密码 }, }, }; }, }),
备选配置(587 TLS端口)
如果465端口被网络限制,可切换到587端口,需明确开启STARTTLS支持:
MailerModule.forRootAsync({ inject: [ConfigService], useFactory: async (configService: ConfigService) => { return { transport: { service: 'gmail', secure: false, // 587端口需设为false port: 587, auth: { user: configService.get('email.user'), pass: configService.get('email.pass'), }, tls: { rejectUnauthorized: false, // 本地开发或特殊环境可能需要该配置 }, }, }; }, }),
方案2:修复OAuth2配置
若坚持使用OAuth2,需修正端口与secure属性的冲突,并确保配置参数完整:
正确OAuth2配置
MailerModule.forRootAsync({ inject: [ConfigService], useFactory: async (configService: ConfigService) => { return { transport: { host: "smtp.gmail.com", port: 587, secure: false, // 587端口禁用secure,依赖STARTTLS auth: { type: "OAuth2", user: configService.get('email.user'), clientId: configService.get('email.clientId'), clientSecret: configService.get('email.clientSecret'), refreshToken: configService.get('email.refreshToken'), }, tls: { starttls: { enable: true, // 强制开启STARTTLS }, }, }, }; }, }),
OAuth2额外检查项
- 确认Google Cloud Console中已启用Gmail API
- 确保refreshToken是通过
offline访问类型获取的(若之前未配置需重新授权) - 检查OAuth2客户端的权限范围包含
https://mail.google.com/或https://www.googleapis.com/auth/gmail.send
通用排查步骤
- 网络连通性验证:在服务器/本地执行
nc -zv smtp.gmail.com 465或nc -zv smtp.gmail.com 587,确认端口可正常访问 - 防火墙/安全组检查:若部署在云服务器,需开放出站的465或587端口
- 应用密码有效性确认:检查生成的应用密码属于当前谷歌账号,且未被撤销
内容的提问来源于stack exchange,提问作者TowewTew
相关产品推荐
相关产品推荐

