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

使用Nodemailer返回成功响应但未收到邮件的排查求助

Nodemailer返回发送成功但Gmail未收到邮件的排查与解决

问题场景

在本地localhost开发环境下,基于Node.js+Express+Nodemailer搭建的联系表单接口,调用sendMail方法后返回成功响应(250 2.0.0 OK),但收件箱(Gmail)始终无法收到邮件。

配置信息

  • 后端技术栈:Node.js + Express + Nodemailer
  • 邮件服务:Gmail(SMTP协议)
  • 运行环境:本地localhost

代码实现

require('dotenv').config();
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const nodemailer = require('nodemailer');

const app = express();

// CORS Middleware
app.use(cors({
    origin: 'http://localhost:3000',
    methods: ['GET', 'POST'],
    credentials: true,
}));

// Middleware
app.use(express.json());

// Nodemailer setup
const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: process.env.EMAIL_USER,
        pass: process.env.EMAIL_PASS
    }
});

// Contact Form API endpoint
app.post('/api/contact', (req, res) => {
    const { name, email, message } = req.body;

    const mailOptions = {
        from: email,
        to: process.env.EMAIL_USER,
        subject: `Contact Form Submission from ${name}`,
        text: message
    };

    transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
            console.error("Error sending mail: ", error);
            return res.status(500).send(error.toString());
        }
        console.log('Message sent: %s', info.messageId);
        res.status(200).send('Message sent: ' + info.response);
    });
});

// Start the server
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

已尝试的操作

  • 确认process.env.EMAIL_USER和process.env.EMAIL_PASS配置正确
  • 使用硬编码邮箱值测试,排除表单数据传递问题
  • 检查垃圾邮件/垃圾箱文件夹
  • 通过Postman发送测试请求,收到成功响应(Message sent: 250 2.0.0 OK)

排查思路与解决建议

1. 修复Gmail SMTP权限配置

Gmail对SMTP登录有严格的安全限制,需完成以下配置:

  • 启用应用专用密码:若账号开启了两步验证,必须在Google账号安全设置中生成「应用专用密码」,替换process.env.EMAIL_PASS的普通密码
  • 允许低安全应用访问(仅旧账号):对于未开启两步验证的旧账号,需在Google账号设置中开启「不太安全的应用访问」(该选项已逐步被淘汰,优先推荐应用专用密码)
  • 解除登录限制:登录Gmail账号,查看是否有「异常登录提醒」,手动允许该应用/设备的访问权限

2. 修正邮件from字段配置

代码中from设置为用户提交的邮箱地址,会触发Gmail的伪造发件人检测:

  • Gmail要求SMTP登录账号与from字段必须一致,否则会直接拦截邮件
  • 正确配置方式:将from设为你的Gmail账号,同时添加replyTo字段指定用户邮箱作为回复地址:
    const mailOptions = {
        from: process.env.EMAIL_USER, // 与SMTP登录账号一致
        to: process.env.EMAIL_USER,
        subject: `Contact Form Submission from ${name}`,
        text: `Sender Email: ${email}\n\n${message}`,
        replyTo: email // 用户回复时默认发送到该邮箱
    };
    

3. 排查本地环境限制

  • 本地IP可能被Google标记为非信任IP,尝试切换网络(如手机热点)重新测试
  • 检查本地防火墙、杀毒软件是否拦截了SMTP请求(Gmail SMTP默认端口为587)

4. 开启Nodemailer调试日志

通过调试日志查看SMTP交互细节,定位隐藏问题:

const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: process.env.EMAIL_USER,
        pass: process.env.EMAIL_PASS
    },
    debug: true, // 开启调试模式
    logger: true // 打印详细交互日志
});

5. 检查Gmail过滤规则

  • 查看Gmail的「过滤器和屏蔽的地址」设置,确认是否有规则自动归档或删除此类邮件
  • 检查「已删除邮件」「所有邮件」标签,确认邮件是否被系统隐藏

内容的提问来源于stack exchange,提问作者Jyoti Ranjan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:32:07