部署在A2托管的Node.js应用nodemailer/mailgun传输功能失效问题
问题场景
部署在A2托管的Node.js应用使用nodemailer+mailgun处理邮件请求,本地运行完全正常,部署后无法正常发送邮件,不清楚如何查看服务端控制台输出验证运行状态。
相关代码(mail.js)
const nodemailer = require('nodemailer'); const mailGun = require('nodemailer-mailgun-transport'); require('dotenv').config(); const key = process.env.MAILGUN_API_KEY; const auth = { auth: { api_key: `${key}`, domain: 'MY DOMAIN' } }; const transporter = nodemailer.createTransport(mailGun(auth)); const sendMail = (email, firstName, lastName, phone, helpType, message, cb) => { const pcsEmail = { from: email, to: 'MY EMAIL', subject: 'A new message from your website', text: "Name: " + firstName + " " + lastName + "\n" + "Phone Number: " + phone + "\n" + "Type of Help: " + helpType + "\n" + "Message: " + message }; const confirmEmail = { from: 'MY EMAIL', to: email, subject: 'Email confirmation', text: "Hello there " + firstName + "," + "\n" + "\n" + "Thank you for contacting Pisgah Climbing School. The following email was sent to Pisgah Climbing School:" + "\n" + "\n" + message + "\n" + "\n" + "A PCS representative will contact you soon!" }; Promise.all([ transporter.sendMail(pcsEmail), transporter.sendMail(confirmEmail), ]) .then((res) => console.log(res)) .catch((err) => console.log(err)); }; exports.sendMail = sendMail;
可能的故障原因
- 环境变量未正确配置:托管平台未配置
MAILGUN_API_KEY或配置值错误,导致Mailgun鉴权失败 - 出站请求被拦截:A2托管封禁了Mailgun API所需的出站端口,或服务器IP未加入Mailgun白名单,请求被拦截
- Node.js版本不匹配:托管平台Node.js版本低于本地版本,高版本专属语法在低环境下抛出错误阻塞流程
- 依赖未正常安装:部署过程中
nodemailer、nodemailer-mailgun-transport等依赖包安装失败,模块加载异常 - Mailgun配置错误:代码中填写的Mailgun域名未完成验证,或API密钥权限不足
排查方法
- 申请开通A2托管的服务器日志权限,Node.js运行时的
console.log输出、错误堆栈都会记录在日志中,可直接查看邮件发送的返回结果或错误信息,和本地gitBash控制台的输出内容一致 - 打印并校验托管环境下的
process.env.MAILGUN_API_KEY值,确认和本地配置一致 - 分别在本地和托管环境执行
node -v命令,对比Node.js版本,确认托管环境版本支持代码中用到的所有语法特性 - 在托管环境中手动调用
sendMail方法测试,查看是否有报错返回
问题已解决:通过服务器日志结合托管平台技术支持协助排查,确认根因为代码中使用了仅最新版Node.js支持的
replaceAll()方法,托管环境的Node.js版本不支持该语法,抛出错误后阻塞了所有服务端处理流程,本地运行正常是因为本地使用的是最新版Node.js。
内容的提问来源于stack exchange,提问作者Kayla Alewine
相关产品推荐
相关产品推荐

