Node.js使用Nodemailer发信成功但收件方收不到邮件的原因
问题根因
- 最核心的触发点是SMTP认证账号与发件人字段不匹配:代码中SMTP认证使用的账号是
mygmail@gmail.com,但邮件配置的from发件人地址写的是my@gmail.com。Gmail个人版SMTP服务不支持冒用非认证账号的身份发信,这类身份不匹配的邮件对外投递时会被标记为高风险可疑邮件,要么直接被收件方邮件服务商拦截丢弃,要么被归类到垃圾邮件目录;只有收件人是发件人自身账号时,Gmail会跳过身份校验直接投递,才会出现只有自己能收到邮件的现象。 - 测试邮件内容不规范也会加剧投递失败:示例代码里的邮件正文是非常口语化的短句,没有标准邮件结构和签名,新创建的SMTP发信通道本身没有发件信誉,很容易触发各邮箱服务商的反垃圾规则,不会进入收件人主收件箱。
- 少数情况是Google账号权限配置错误:如果Gmail账号没有开启两步验证就生成应用密码,或者生成应用密码时选择的服务类别不是「邮件」,会触发Gmail的对外发信限制,仅允许给自身账号发信。
修复方案
按以下顺序逐一排查调整:
- 统一发件人配置:把
mailOptions里的from字段改成和auth.user完全一致的邮箱地址,如果需要自定义发件人昵称,用"昵称 <邮箱地址>"的格式,绝对不能填和认证账号不一致的邮箱。 - 校验Google账号配置:
- 确认发件的Gmail账号已经开启两步验证,应用密码是开启两步验证后在账号安全页生成的、专门对应「邮件」类别的专用密码,不要混用其他服务的应用密码
- 第一次运行脚本发信后,登录Gmail网页版查看安全提醒,如果有「检测到异常登录/发信」的提示,点击「确认是本人操作」解除投递限制
- 排查垃圾邮件目录:调整配置后重新发信,让外部收件人检查垃圾邮件、广告邮件、订阅邮件三个目录,这类测试邮件首次发送大概率被反垃圾系统归类,收件人手动把邮件标记为「非垃圾邮件」后,后续发信就会正常进入主收件箱。
- 调整邮件测试内容:测试阶段不要用过于口语化、疑似垃圾内容的正文,尽量写清晰的测试主题和正文,降低反垃圾规则的命中概率。
- 定位具体拦截原因:如果以上操作后还是收不到,打印
sendMail返回的完整响应拿到messageId,去Gmail已发送文件夹找到对应邮件,查看原始邮件头,里面会明确标注邮件被拦截的节点和具体原因。
修正后的可运行代码示例
import nodemailer from "nodemailer"; // transporter 配置 const transporter = nodemailer.createTransport({ host: "smtp.gmail.com", port: 587, secure: false, requireTLS:true, auth: { user: "mygmail@gmail.com", pass:"myapppassword" // 替换为两步验证生成的邮件类应用密码 } }) // 邮件内容配置 const mailOptions = { from: '"发件人昵称" <mygmail@gmail.com>', // 必须和auth.user的邮箱完全一致 to: "myfriend@gmail.com", // 支持逗号分隔的多个收件人邮箱 subject: "Node.js 测试邮件", text: "你好,这是一封通过Nodemailer发送的测试邮件。" } // 执行发信 transporter.sendMail(mailOptions, (err, res) => { if (err) { console.log("发信失败:", err) } else { console.log("发信成功,服务器响应:", res.response) } })
内容的提问来源于stack exchange,提问作者ahmedraza farooqui
相关产品推荐
相关产品推荐

