Nodemailer本地开发正常,部署到RHEL VPS后无法发送邮件求助
排查方向整理
1. 验证环境变量加载情况
- 本地开发时
.env文件能正常读取,但pm2运行时可能因工作目录或启动方式问题,导致环境变量未加载。 - 查看pm2启动日志:执行
pm2 logs,检查启动时输出的token值是否为正确密码,若显示undefined,说明环境变量未加载。 - 解决方式:启动pm2时指定
.env路径,或在pm2配置文件(如ecosystem.config.js)中配置env参数,确保变量正确注入。
2. 查看邮件发送的错误日志
- 代码中已捕获错误并打印
console.log(error),但pm2的日志可能未实时展示。执行pm2 logs <你的应用名称>,找到表单提交时的错误信息,这是定位问题的核心(比如认证失败、连接超时、SSL证书异常等)。
3. 检查RHEL的安全机制
- SELinux限制:RHEL默认开启SELinux,可能阻止Node.js发起出站SMTP连接。临时关闭测试:
sudo setenforce 0,若邮件发送恢复,需配置SELinux允许Node.js访问网络:sudo semanage permissive -a node_t - 防火墙配置:虽然开放了465端口,但firewalld可能限制出站流量。临时关闭测试:
sudo systemctl stop firewalld,若正常,再重新配置防火墙规则允许465端口出站。
4. 测试与外部SMTP服务器的连通性
- 在RHEL服务器上直接测试SMTP端口连通性:
- 用nc命令:
nc -zv <你的SMTP主机> 465 - 用telnet:
telnet <你的SMTP主机> 465
- 用nc命令:
- 若连接失败,说明VPS提供商封锁了465端口,或SMTP服务器将VPS IP列入黑名单,需联系服务商或更换SMTP服务器。
5. 调整Nodemailer配置
- 代码中
tls: { rejectUnauthorized: false }可能绕过了SSL证书验证,在服务器环境中可能引发信任问题。尝试注释该配置,测试邮件是否能发送。 - 确认SMTP主机、端口、账号密码完全正确,部分邮件服务商(如Gmail、Outlook)需开启「应用专用密码」或启用SMTP服务。
6. 检查pm2运行的用户权限
- 若pm2用root用户启动,可能和本地普通用户的网络权限不同。尝试用本地开发时的用户启动pm2:
测试邮件发送是否正常。su - <你的用户名> -c "pm2 start app.js"
内容的提问来源于stack exchange,提问作者psi4j
相关产品推荐
相关产品推荐

