Astro API路由本地正常但Vercel部署后超时问题求助
解决Astro + Vercel下Nodemailer API超时问题
1. 排查SMTP配置问题
本地正常但部署后超时,大概率是邮件服务商的SMTP连接在Vercel环境下受阻:
- 优先使用SSL端口465而非TLS端口587,Vercel的serverless网络对SSL连接兼容性更好,减少握手延迟;
- 若用Gmail等服务商,必须使用应用专用密码(而非普通账号密码),且确保账号开启了IMAP/SMTP服务;
- 检查SMTP主机地址是否正确,避免拼写错误(比如
smtp.gmail.com而非smtp.google.com)。
2. 确保API路由正确处理响应
Astro的API路由必须明确返回响应,避免函数挂起导致超时。示例路由代码:
// src/pages/api/sendmail.json.ts import type { APIRoute } from 'astro'; import nodemailer from 'nodemailer'; export const POST: APIRoute = async ({ request }) => { try { const { email } = await request.json(); // 初始化 transporter const transporter = nodemailer.createTransport({ host: import.meta.env.SMTP_HOST, port: 465, secure: true, auth: { user: import.meta.env.SMTP_USER, pass: import.meta.env.SMTP_PASS, }, }); // 发送邮件 await transporter.sendMail({ from: '"你的名称" <your-email@example.com>', to: email, subject: '测试邮件', text: '这是来自Astro + Vercel的邮件', }); // 返回成功响应 return new Response(JSON.stringify({ success: true }), { status: 200, headers: { 'Content-Type': 'application/json' }, }); } catch (err) { console.error('邮件发送失败:', err); // 返回错误响应 return new Response(JSON.stringify({ success: false, error: '发送失败' }), { status: 500, headers: { 'Content-Type': 'application/json' }, }); } };
3. 同步环境变量到Vercel
本地.env文件中的SMTP_HOST、SMTP_USER、SMTP_PASS等变量,必须在Vercel项目的设置 -> 环境变量中添加,且确保部署时变量已生效(可在Vercel控制台的构建日志中验证)。
4. 保留Hybrid输出模式
无需将Astro的output改为server,Hybrid模式已足够支持serverless API路由。之前改server模式导致页面无法加载,可能是页面配置了prerender: true但依赖动态内容,保持hybrid模式即可。
5. 查看Vercel函数日志定位问题
登录Vercel控制台,进入项目的函数页面,找到sendmail.json函数,查看运行日志,里面会显示具体的错误信息(比如认证失败、连接超时、端口被屏蔽等),这是定位问题最直接的方式。
内容的提问来源于stack exchange,提问作者Benzagon
相关产品推荐
相关产品推荐

