在 Vercel 上,你通过 HTTP API 发送邮件,而不是 SMTP。Vercel 在 serverless 和 edge 函数中运行你的代码,这些运行时围绕短生命周期的 HTTP 请求处理构建,而非长期保持的 TCP 套接字。Edge 运行时尤其如此,它没有 Node net 模块,因此 SMTP 库甚至无法建立连接。向邮件 API 发送 HTTPS 请求完全契合这一模型。以下是 Next.js 的配置方式。
为什么 SMTP 在 Vercel 上表现不佳?
Serverless 函数的设计目标是快速启动、处理请求、然后关闭。保持一个 SMTP 连接(及其多步握手过程)与此相悖,函数可能在会话进行中被冻结或销毁。Edge 运行时限制更严格:它运行在一个不包含 Node 网络模块的 Web 标准环境中,因此依赖 net 和 tls 的库(如 Nodemailer)完全无法在其中运行。通过 HTTPS 发送可以绕开这两个问题,因为发起 fetch 正是这些运行时擅长的事情。
如何从 Next.js Route Handler 发送邮件?
在 app/api/send/route.ts 创建一个 Route Handler。它从环境变量中读取 API 密钥,并调用邮件 API。使用 Bird Node SDK:
// app/api/send/route.ts
import { BirdClient } from "@messagebird/sdk";
export const runtime = "nodejs";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
export async function POST(request: Request) {
const { to } = await request.json();
const { data, error } = await bird.email
.send({
from: "you@yourdomain.com",
to: [to ?? "delivered@bird.dev"],
subject: "Hello from Node",
html: "<p>It works.</p>",
})
.safe();
if (error) {
return Response.json({ error: error.message }, { status: 502 });
}
return Response.json({ id: data.id });
}
在 Vercel 项目的环境变量中设置 BIRD_API_KEY,确保它在运行时可用且不会被提交到代码仓库。delivered@bird.dev 沙箱地址始终接受邮件,方便验证首次部署。
Edge 运行时还是 Node 运行时?
export const runtime 行决定使用哪个运行时来执行你的 handler。因为 SDK 和 fetch 在两者中都能工作,你可以根据其他需求来选择:
| Node 运行时 | Edge 运行时 | |
|---|---|---|
| 默认 | 是 | 需手动启用 |
Node API(net、fs) | 可用 | 不可用 |
| 冷启动 | 较慢 | 较快 |
| SMTP 库 | 可运行,但在 serverless 上不可靠 | 完全无法运行 |
HTTP 邮件 API(fetch) | 可用 | 可用 |
如果你只调用 HTTP API,Edge 运行时能提供更快的冷启动。如果 handler 中其他部分依赖仅限 Node 的包,则使用 Node 运行时。无论哪种方式,邮件发送都是同样的基于 fetch 的调用。
使用 Bird 发送
上面的 handler 已经使用了标准代码片段。无论在哪里运行 JavaScript,调用方式都一样:
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.email
.send({
from: "you@yourdomain.com",
to: ["delivered@bird.dev"],
subject: "Hello from Node",
html: "<p>It works.</p>",
})
.safe();
如果你用组件构建邮件正文,React Email 可以将它们渲染为此调用所需的 HTML。关于邮件代码应放在何处的全面介绍,请参阅使用 JavaScript 发送邮件。
常见问题
可以在 Vercel 上使用 Nodemailer 吗?
在 Node 运行时中它可以加载,但在短生命周期的 serverless 函数中保持 SMTP 连接并不可靠。在 Edge 运行时中它无法运行,因为没有 Node net 模块。使用 HTTP API 可以避免这两个问题。
在 Vercel 上将 API 密钥存放在哪里?
在项目的环境变量中设置,可通过 Vercel 仪表盘或 CLI 操作。Handler 通过 process.env 读取它,这样密钥留在服务器端,不会进入代码仓库。
发送邮件用 Edge 还是 Node 运行时?
两者都适用于 HTTP API 调用。Edge 冷启动更快;如果你的 handler 还使用了仅限 Node 的包,则需要 Node 运行时。
Vercel 与 HTTP 邮件 API 是天然的搭配。邮件产品概览和邮件发送指南涵盖了其余内容。
峰值流量和积压恢复决定了你的应用从事务性邮件服务所需的发送能力。