跳到内容
Yuva

适用于 Cloudflare 的 Yuva Email Worker

通过 Cloudflare 接收支持邮件。无需运行邮件服务器。

Cloudflare® Email Routing 接收你支持地址的邮件,开源的 Yuva Email Worker 为每封邮件签名后交给 Yuva。它会作为一个由你的团队回复的对话,出现在共享收件箱里。

是什么

前置 Email Routing

Cloudflare Email Routing 成为你域名的 MX 并接收邮件。Yuva 不监听 SMTP,所以无需安装或维护邮件服务器。

一个小巧的开源 Worker

Yuva Email Worker 读取原始邮件和信封,为请求签名并发给 Yuva。解析、线程归并和垃圾邮件判断都留在服务器上。

真实的对话

发到支持地址的邮件会在收件箱中开启或延续一个对话,团队在与聊天和应用内消息相同的面板中回复。

一封邮件如何从客户送达你的团队

  1. 1客户给你的某个支持地址发信,例如 support@example.com。
  2. 2Cloudflare Email Routing 接收邮件并交给 Yuva Email Worker。
  3. 3Worker 使用你与 Yuva 共享的密钥,以 HMAC-SHA256 对原始邮件、两个信封地址和时间戳签名,并发送到你 Yuva 服务器的 /ingress/email。
  4. 4在读取邮件之前,Yuva 会检查签名以及时间戳是否在 5 分钟之内。签名错误的请求会被拒绝。
  5. 5Yuva 根据收件地址找到邮件渠道,并按 In-Reply-To 和 References 把邮件归入它所属的对话。其他情况会开启新对话。回复会重新打开对话。
  6. 6你的团队在面板中回复。回复通过邮件渠道自己的 SMTP 账号发送,例如 Amazon SES、Postmark 或你自己的中继,使用同一个地址并在同一个线程中。回复不经过 Worker。

拒收会反馈给发件人

当 Yuva 永久拒绝一封邮件时,例如地址未知、发件人被屏蔽或邮件过大,Worker 会拒收它,发件人会收到带有 Yuva 所给原因的永久性 SMTP 错误。

如果无法访问 Yuva

如果 Yuva 返回服务器错误、20 秒内没有响应或无法访问,只要你设置了 FALLBACK_FORWARD,Worker 就可以把邮件转发到你选择的地址。该地址必须是 Email Routing 中已验证的目标地址。邮件会作为普通转发邮件送达,不会出现在 Yuva 中。没有 FALLBACK_FORWARD 时,投递会失败并报错,发送方服务器可能稍后重试。

几步即可完成设置

你需要一台 Yuva 服务器,以及一个管理该域名的 Cloudflare 账号。

  1. 1

    在 Yuva 中,打开设置 → 你的收件箱 → 渠道 → 邮件,添加支持地址。在服务器上设置一个密钥并重启:

    YUVA_INGRESS_SECRET=<openssl rand -hex 32>
    YUVA_INGRESS_AUTHSERV_ID=mx.cloudflare.net
  2. 2

    使用同一个密钥,将 Worker 部署到你的 Cloudflare 账号:

    cd edge
    bun install
    bunx wrangler login
    bunx wrangler secret put INGRESS_SECRET
    bunx wrangler deploy --var YUVA_URL:https://support.example.com
  3. 3

    在 Cloudflare 控制台中,打开你的域名 → Email → Email Routing 并启用。Cloudflare 会添加它的 MX 和 SPF 记录。

  4. 4

    在 Routing rules 下,把每个支持地址发送到名为 yuva-edge 的 Worker。对于兜底渠道,把兜底规则指向它。

  5. 5

    发送一条测试消息,看对话出现在面板中。

  6. 6

    可选:在部署命令中添加备用地址,以便在故障期间保留邮件:

    bunx wrangler deploy --var YUVA_URL:https://support.example.com --var FALLBACK_FORWARD:you@example.org

Email Routing 会成为域名的 MX,所以请使用没有其他邮件服务器处理的域名或子域名。

阅读设置指南 →

不与 Cloudflare 绑定

Worker 是调用 /ingress/email 的一种方式。任何邮件服务器或中继都可以用相同的签名标头发送原始邮件,而投递给命令的邮件服务器可以把邮件通过管道交给 yuva ingest-email。请求格式记录在 Worker 的 README 中。

问与答

我需要运行邮件服务器吗?

不适用于收件。Yuva 不监听 SMTP;邮件由 Cloudflare Email Routing 接收,再由 Worker 转交。回复需要邮件渠道的 SMTP 账号,例如 Amazon SES、Postmark 或你自己的中继。

Yuva 宕机时会怎样?

设置了 FALLBACK_FORWARD 后,邮件会改为转发到该地址。没有它则投递失败,发送方服务器可能会重试。Yuva 有意拒收的邮件,例如发往未知地址的邮件,会被拒收而不是转发。

我可以使用哪些域名和地址?

任何你在 Cloudflare 中管理、且没有其他服务器处理其邮件的域名,因为 Email Routing 会成为它的 MX。每个邮件渠道有一个地址,或者用兜底地址 *@example.com 接收该域名下所有没有渠道精确对应的地址。support+billing@example.com 这样的子地址会送到 support@example.com 的渠道。

邮件最大可以多大?

邮件连同附件最大 25 MiB,这是 Cloudflare Email Routing 的限制。Yuva 每封邮件最多保留 50 个附件,每个附件须在服务器的附件大小限制(默认 25 MiB)和允许的类型之内,其余的会被忽略。

有人能伪造发往我的 Yuva 服务器的邮件吗?

Yuva 会在读取正文之前,拒绝任何没有有效 HMAC 签名或时间戳偏差超过 5 分钟的请求。请妥善保管密钥。

Yuva 会使用 Cloudflare 的 DMARC 结果吗?

会,前提是你把 YUVA_INGRESS_AUTHSERV_ID 设为 mx.cloudflare.net。此时 Yuva 会读取 Email Routing 添加的 DMARC 结论。未通过 DMARC 的新对话会被标记为垃圾邮件。

Cloudflare、Cloudflare 徽标和 Cloudflare Workers 是 Cloudflare, Inc. 在美国和其他司法管辖区的商标和/或注册商标。Yuva 是独立的开源项目,与 Cloudflare 无关联,也未获其认可。