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

Astro项目部署至Netlify后Nodemailer无法发送邮件问题

Astro + Nodemailer 部署Netlify后邮件发送超时问题解决

问题分析

本地开发时可正常通过Gmail SMTP发送邮件,部署到Netlify后出现ETIMEDOUT连接超时错误,核心原因是Netlify函数环境的出站网络限制、Gmail安全策略或代码配置疏漏。

解决方案

1. 用环境变量替代硬编码凭证

代码中硬编码邮箱密码会导致部署时凭证未正确加载,同时存在安全风险:

// 修改Nodemailer配置,从环境变量读取凭证
const transporter = createTransport({
    service: "gmail",
    auth: {
        user: import.meta.env.GMAIL_USER,
        pass: import.meta.env.GMAIL_APP_PASSWORD,
    }
});

在Netlify后台操作:

  • 进入站点「Site settings」→「Environment variables」
  • 添加两个变量:GMAIL_USER(你的Gmail地址)、GMAIL_APP_PASSWORD(开启2FA后生成的应用专用密码)

2. 调整SMTP连接参数避开端口限制

Netlify对默认SMTP端口(25、465)有限制,改用Gmail的587端口并显式配置:

const transporter = createTransport({
    host: "smtp.gmail.com",
    port: 587,
    secure: false, // 587端口用STARTTLS,需设为false
    auth: {
        user: import.meta.env.GMAIL_USER,
        pass: import.meta.env.GMAIL_APP_PASSWORD,
    },
    tls: {
        // 临时解决SSL证书验证问题,生产环境建议移除(确保证书有效)
        rejectUnauthorized: false
    }
});

3. 修复异步错误捕获逻辑

原代码中main().catch(console.error)未被外层try/catch覆盖,改为await调用以捕获所有发送错误:

// 替换原main函数调用
try {
    await main();
} catch (emailError) {
    console.error('邮件发送失败:', emailError);
    // 可添加返回错误信息给前端的逻辑
}

4. 推荐:改用Netlify官方集成或第三方邮件API

直接用SMTP在Netlify环境中易受限制,更稳定的替代方案:

  • Netlify Forms + Notifications:Astro表单提交可被Netlify自动捕获,在后台设置邮件通知即可,无需编写Nodemailer代码。
  • 第三方邮件API:用SendGrid等服务的HTTP API替代SMTP,Netlify对HTTP请求无限制,示例代码:
import fetch from 'node-fetch';

// 替换Nodemailer发送逻辑
const sendEmail = async () => {
    const response = await fetch('https://api.sendgrid.com/v3/mail/send', {
        method: 'POST',
        headers: {
            'Authorization': `Bearer ${import.meta.env.SENDGRID_API_KEY}`,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            personalizations: [{ to: [{ email: import.meta.env.TO_EMAIL }] }],
            from: { email: import.meta.env.FROM_EMAIL },
            subject: '📬 New Response',
            content: [{ type: 'text/plain', value: emailBody }]
        })
    });

    if (!response.ok) {
        throw new Error(`邮件发送失败,状态码:${response.status}`);
    }
};

await sendEmail();

5. 检查Gmail安全设置

  • 确保Gmail账号开启两步验证,并生成正确的应用专用密码(不能使用普通登录密码)。
  • 若仍失败,查看Gmail后台「最近登录记录」,确认Netlify服务器IP未被拦截,手动允许该登录尝试。

内容的提问来源于stack exchange,提问作者Noob101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:08:10