Cloudflare
Email Workers
MIME
Automação
Serverless

电子邮件路由+工作人员:在边缘以编程方式处理电子邮件

将电子邮件路由到工作人员而不是目标地址完全改变了您对入站电子邮件的处理方式。

电子邮件路由+工作人员:在边缘以编程方式处理电子邮件

大多数 Cloudflare 电子邮件路由教程都会展示如何将 2 转发到 Gmail。这解决了最简单的用例,但隐藏了服务中最有趣的部分。当您将电子邮件路由到 Worker 而不是目标地址时,电子邮件就变成了数据:您读取发件人、主题、标头、全文,并在边缘运行的 JavaScript 函数内决定如何处理所有这些内容。这极大地改变了无需您自己的电子邮件基础设施即可构建的可行方案。

电子邮件处理程序和您收到的内容

电子邮件工作器的基本结构在默认对象中使用名为 3 的导出:

0

4 和 5 是带有地址的字符串。 6 是一个标准的 Web API 标头对象 — 您可以像在获取处理程序中一样访问 7 或 8 。 9 是一个包含整个 RFC 2822 消息(包括标头和正文)的 ReadableStream,支持最大 25MB 的消息。

有四种可用的操作:10 转发到已验证的地址,11 回复,1212 拒绝带有错误消息的消息,或者只是返回而不调用任何内容 - 这会默默地丢弃该消息。您可以组合:按发件人过滤、转发某些内容、拒绝其他内容并处理其余内容。

MIME 解析差距

文档中谨慎提及的一点是:没有内置的 MIME 解析器。 13 为您提供原始流。如果您想提取 UTF-8 编码的主题、纯文本正文、替代 HTML 或附件,您需要自己解析 MIME — 或使用库。

14 在 Workers 环境中运行良好。默认是使用流,将其转换为 ArrayBuffer,并将其传递给解析器:

1

15 是一个由16、17 和18 (ArrayBuffer) 组成的对象数组。您可以将内容保存在 R2 存储桶中,从 XML 格式的 NF-e 中提取元数据,或将 PDF 传递到提取 API。 Workers 运行时支持此功能,除了导入库之外无需任何其他配置。

消耗整个流的成本是内存。对于带有接近 25MB 限制的大附件的邮件,您会将所有内容加载到 Worker 的内存中。在大多数情况下,这不是问题,但在大容量管道中,值得监控。

在这里构建有意义的模式

自动创建支持票证。 电子邮件到达后,您提取发件人、主题和正文,组装有效负载并将其发布到 Linear API、Zendesk、Notion 或您的团队使用的任何工具。现在,票证会显示完整的上下文,无需任何人复制和粘贴。对于接收电子邮件请求但使用问题跟踪工具的团队来说,这消除了持续的手动步骤。

捕获发票和税务文件。 您创建一个专用地址 - nfe@seudominio.com - 任何通过电子邮件发送 NF-e 的供应商都会自动处理 XML 或 PDF 附件:提取元数据、在 R2 中保存文件、在 D1 中创建记录。工作人员可以做人类会做的事情,但无需打开电子邮件。

转发前过滤。 启用捕获所有功能后,20 会捕获发送到您域中随机地址的垃圾邮件。工作人员可以根据 KV 中存储的已知问题域列表检查发件人,检查主题是否包含典型的垃圾邮件模式,并在转发到您的收件箱之前致电 21 。它不是一个完整的垃圾邮件过滤器,但它可以减少噪音而无需额外费用。

重新格式化警报和通知。 监控工具 - Grafana、PagerDuty、CI 工具 - 以手机上并不总是可读的格式发送电子邮件警报。 Worker 拦截这些电子邮件,从正文中提取相关信息,并通过 Webhook 将格式化消息发布到 Slack 或 Discord 通道。原始电子邮件可以被丢弃或作为存档转发。

什么不像你想象的那样有效

22存在并且有效,但答案来自23。如果您希望收件人收到看似来自 24° 的自动响应,则工作器需要调用出站 SMTP 服务 — 重新发送、Mailgun、SES — 传递必要的标头。电子邮件路由无权访问您域的出站流。

如果 Worker 抛出未捕获的异常,则电子邮件将被拒绝并显示错误 500。没有自动重试,也没有死信队列。任何可能失败的逻辑都需要带有显式回退的 try/catch——当处理过程中出现问题时,通常需要 25% 的手动分类地址。在生产中发现这种行为并拒绝客户电子邮件是一种不愉快的经历。

除了转发之外还有什么意义

如果电子邮件路由对您来说只是 Gmail 的别名,那么您将永远不会接触 Workers,也不需要这样做。但是,如果您的团队已经将 Workers 用于其他目的(API、cron 作业、集成),则 Email Worker 适合具有相同 KV、D1、R2 绑定和外部服务的相同基础设施。您不是在堆栈中添加新的块;而是在堆栈中添加新的块。您正在向已存在的环境添加触发器类型。

停止简单转发的正确时机是当您注意到团队中的某人每周打开电子邮件将信息复制到另一个系统超过一两次时。如果该模式是可重复的并且数据位于电子邮件中,那么工作人员解决该问题所需的时间比手动任务一个月内消耗的时间还要短。

另请阅读

  • [Cloudflare Durable Objects:边缘的一致状态 - 真正改变的是什么26
  • [Cloudflare Workers 与 Pages:选择之前最重要的区别27
  • [页面功能:何时使用而不是纯Workers28
  • [Cloudflare KV:当你需要写时,全球分布式意味着什么29
  • [Cloudflare 电子邮件路由:在您的域上接收电子邮件 - 以及不包括的内容30
  • [教程中没有提到的 Cloudflare Email Routing 的局限性31