Nodemailer线上请求报504网关超时但邮件仍正常送达求助
解决思路
1. 给请求返回响应(最关键)
你的接口代码在执行await transporter.sendMail()后,没有向客户端返回任何响应,导致请求一直处于挂起状态,直到网关触发504超时。哪怕邮件发送成功,服务器也必须明确告知客户端请求已处理完成。
修改代码如下:
general_users.post("/Kontakt", async(req, res, next) => { try { var content = req.body; content = JSON.stringify(content); await transporter.sendMail({ from: "mail@haselberger-web-development.de", to: "mail@haselberger-web-development.de", subject: "Kundenanfrage", text: content, html: `<b>${content}</b>`, }); // 发送成功后返回响应 res.status(200).json({ success: true, message: "邮件已发送" }); } catch (error) { // 捕获错误并返回错误信息 console.error("邮件发送失败:", error); res.status(500).json({ success: false, message: "邮件发送失败", error: error.message }); } });
2. 处理SMTP连接异常
线上环境可能存在网络波动,原代码没有错误捕获逻辑,一旦发送过程中出现异常,请求同样会挂起。用try/catch包裹发送逻辑,能确保无论成功还是失败,都能给客户端返回响应,避免超时。
3. 检查线上服务器出站端口权限
虽然邮件能发送成功,仍可确认线上服务器是否允许出站访问587端口(IONOS的SMTP端口)。部分云服务商可能限制默认端口,不过该可能性较低(毕竟你已收到邮件)。
4. 调整Nodemailer超时配置
给transporter添加超时参数,限制SMTP连接的等待时间,避免长时间阻塞请求:
const transporter = nodemailer.createTransport({ host: "smtp.ionos.de", port: 587, secure: false, auth: { user: "mail@haselberger-web-development.de", pass: "XXXXXXXXXXXX", }, timeout: 5000, // 设置5秒超时 connectionTimeout: 5000 });
内容的提问来源于stack exchange,提问作者mahas
相关产品推荐
相关产品推荐

