
vercel 默认 edge 运行时限制了 node.js 原生网络模块的使用,导致邮件发送失败;需显式声明 `runtime: 'nodejs'` 并启用动态路由,才能正常使用 resend 或 nodemailer 发送邮件。
在 Vercel 上部署邮件发送功能(如使用 Resend 或 Nodemailer)时,本地运行正常但线上静默失败(仅打印到 subject 就停止),是一个典型且高频的问题。根本原因在于:Vercel 的默认函数运行时已切换为 Edge Runtime(基于 WebAssembly 和轻量 JS 引擎),而 Resend SDK(v3+)和 Nodemailer 均依赖 Node.js 核心模块(如 https, net, tls),这些模块在 Edge 环境中不可用,调用会直接抛出未捕获错误或卡死——且因错误未被 catch 或日志被截断,开发者往往只看到“日志中断”,误以为是 API 密钥或配置问题。
✅ 正确解法:强制使用 Node.js 运行时
你需要在邮件处理函数(如 app/api/send/route.ts 或 pages/api/send.ts)顶部显式声明:
export const runtime = 'nodejs'; // 关键:指定 Node.js 18+ 运行时 export const dynamic = 'force-dynamic'; // 确保不被静态缓存(尤其对 POST 路由)
⚠️ 注意:runtime = 'edge' 是错误方案(官方文档旧示例已过时);Edge Runtime 不支持 Resend v3 SDK(其底层使用 fetch 但受限于 CORS 和证书策略,且 Resend 服务端明确拒绝 Edge-origin 请求)。当前唯一稳定路径是 nodejs 运行时。
? 完整可运行示例(App Router,app/api/send/route.ts):
import { NextRequest, NextResponse } from 'next/server';
import { Resend } from 'resend';
export const runtime = 'nodejs';
export const dynamic = 'force-dynamic';
export async function POST(req: NextRequest) {
try {
const { to, subject, html } = await req.json();
console.log('→ Sending email to:', to);
const resend = new Resend(process.env.RESEND_API_KEY!);
const response = await resend.emails.send({
from: process.env.SMTP_FROM_EMAIL!,
to,
subject,
html,
});
console.log('✓ Email sent:', response.data?.id);
return NextResponse.json({ success: true, id: response.data?.id });
} catch (error) {
console.error('✗ Email send failed:', error);
return NextResponse.json(
{ error: 'Failed to send email' },
{ status: 500 }
);
}
}? 配置检查清单:
- ✅ 确保 RESEND_API_KEY 和 SMTP_FROM_EMAIL 已在 Vercel 项目 Settings → Environment Variables 中正确添加(且设为 Production 环境);
- ✅ 验证发件邮箱已在 Resend 控制台完成验证(resend.com/dashboard/domains);
- ✅ 使用 POST 请求调用该 API(避免 GET 缓存干扰);
- ❌ 不要使用 'edge' runtime —— 即使 Resend 官方旧文档链接提及,也已失效(2024 年起 Vercel Edge 对第三方 SMTP 服务兼容性极差);
- ? 免费版 Vercel 完全支持邮件发送,无需升级 Pro(Pro Trial 无额外网络权限,仅增加并发/带宽配额)。
? 补充说明:若坚持用 Nodemailer,请确保:
- 使用 nodemailer.createTransport({ service: 'resend' })(需 Resend 官方插件)或直连 SMTP(推荐);
- 同样必须声明 runtime = 'nodejs';
- 避免在 Edge 环境下导入 nodemailer(会构建报错)。
总结:这不是账户权限问题,而是运行时环境错配。一句 export const runtime = 'nodejs' 就是解锁 Vercel 邮件能力的钥匙。










