如何在 Vercel 上发送邮件

在 Vercel 上,通过 HTTP API 在 Node.js 或 Edge 中发送邮件,或在 Node.js 函数中 await SMTP。

HTTP 邮件 API 可在 Vercel 的 Node.js 和 Edge 运行时中使用,也是 Vercel 推荐的方式。SMTP 可在 Node.js 中使用,前提是在函数执行时限内 await 发送完成。它无法在 Edge 中运行,因为 Edge 缺少 Node 的 TCP 模块。

SMTP 在 Vercel 上有哪些要求?

在 Node.js 函数中,返回响应之前先 await SMTP 发送,确保通信在函数停止前完成。发送必须在函数的持续时间限制内完成。Vercel 允许通过端口 465 和 587 进行出站 SMTP;端口 25 被封禁。Edge 缺少 Node.js 的 net 模块,因此 SMTP 库无法在其中建立 TCP 连接。

如何从 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 库在持续时间限制内 await完全无法运行
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.js 函数中:返回响应之前先 await 发送,并在函数的持续时间限制内完成。Nodemailer 无法在 Edge 中运行,因为该运行时缺少 Node 的 net 模块。

在 Vercel 上将 API 密钥存放在哪里?

在项目的环境变量中设置,可通过 Vercel 仪表盘或 CLI 操作。Handler 通过 process.env 读取它,这样密钥留在服务器端,不会进入代码仓库。

发送邮件用 Edge 还是 Node 运行时?

两者都适用于 HTTP API 调用。Edge 冷启动更快;如果你的 handler 还使用了仅限 Node 的包,则需要 Node 运行时。

Vercel 与 HTTP 邮件 API 是天然的搭配。邮件产品概览和邮件发送指南涵盖了其余内容。

峰值流量和积压恢复决定了你的应用从事务性邮件服务所需的发送能力。

基于同一网络构建。

测试 API 密钥即刻获取。添加付款方式并验证发送者身份后,即可解锁生产环境。

你的下一个创意。 随时连接。