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

Nodemailer生产环境发邮件报500错误(疑似CORS导致)求解

问题排查与解决方案

首先你当前遇到的500错误不是CORS错误:CORS错误属于浏览器跨域拦截,不会返回500状态码,且你其余接口运行正常也验证了全局CORS配置没有问题,问题出在邮件发送的服务端逻辑上。

1 补全接口的错误捕获与响应逻辑

你贴出的newUserEmail代码不完整,缺失transporter.sendMail执行逻辑、参数校验和异常捕获,生产环境报错后没有输出日志也没有返回正确响应,才会触发默认的500错误。
补全后的代码参考:

const nodemailer = require('nodemailer');
const Web = require('../models/Web');
const moment = require('moment');

exports.newUserEmail = async (req, res) => {
  try {
    const { email } = req.body;
    // 新增参数校验,避免生产环境传参为空触发报错
    if (!email) return res.status(400).json({ msg: '邮箱参数缺失' });

    const transporter = nodemailer.createTransport({
      host: 'email200.raiolanetworks.es',
      port: 465,
      secure: true,
      auth: {
        user: process.env.SMTP_USER, // 不要硬编码账号密码,使用环境变量注入
        pass: process.env.SMTP_PASS,
      },
      tls: {
        rejectUnauthorized: false
      }
    });
    // 新增SMTP连接验证,提前暴露连接问题
    await transporter.verify();

    const mailOptions = {
      from: 'no-reply@wcorreo.com',
      to: email,
      subject: 'Gracias por tu registro',
      text: '¡Bienvenido! Muchas gracias por registrarte',
    };
    // 执行邮件发送
    await transporter.sendMail(mailOptions);
    return res.status(200).json({ msg: '邮件发送成功' });
  } catch (err) {
    // 打印错误日志,生产环境可直接查看DigitalOcean的服务日志定位具体问题
    console.error('邮件发送失败详情:', err);
    return res.status(500).json({ msg: '邮件发送失败', error: err.message });
  }
};

2 生产环境常见问题排查

补全代码后如果还有报错,可按以下优先级排查:

  • 检查DigitalOcean服务器的465出站端口是否被封禁:多数云服务商默认封禁SMTP端口用于防范垃圾邮件,你可以登录服务器执行telnet email200.raiolanetworks.es 465测试连通性,如果连接失败需要去DigitalOcean后台申请解封SMTP端口。
  • 检查环境变量配置:生产环境不要硬编码SMTP账号密码,需通过环境变量注入,确认你部署服务时已经正确配置了SMTP_USER和SMTP_PASS两个环境变量,避免本地写死的密码生产环境未配置导致SMTP验证失败。
  • 检查发件人域名权限:你使用的发件人地址为no-reply@wcorreo.com,需要确认该域名已经在SMTP服务商处完成SPF、DKIM解析配置,否则会被SMTP服务端拒绝发送请求。

3 可选:单独配置接口CORS规则

如果确认邮件发送逻辑正常仍有跨域问题,可以单独给邮件接口配置CORS规则:

// 针对单个接口开启CORS
app.post('/api/email/new-user', cors(), (req, res) => {
  // 接口逻辑
});

// 如果前端请求带cookie,需要调整全局CORS配置
app.use(cors({
  origin: ['https://你的前端域名'], // 替换为实际的前端访问域名
  credentials: true
}));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:45:03