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
相关产品推荐
相关产品推荐

