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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:37:10