You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:19:19