Rails 6 现在附带了 Action Mailbox。文档和社区没有关于如何集成 SendGrid 等最常见服务之外的各种服务的丰富资源。
假设一个人使用 Google 的 Gsuite Gmail:
他们如何将其与 Action Mailbox 集成?
会使用 Gmail 的 API,还是不适合 Action Mailbox?
如果 Gmail 不起作用,SendGrid 有什么不同之处可以使其适当集成?
Action Mailbox 是围绕实时接收来自邮件传输代理 (MTA) 的电子邮件而构建的,而不是定期从邮箱中获取电子邮件。也就是说,它接收通过 SMTP 发送的邮件,它不会从已接收邮件的另一台服务器获取邮件(使用 IMAP 或 POP3)。
为此,它依赖于外部(Rails)SMTP 服务接收电子邮件,然后将电子邮件发送到 Action Mailbox。这些外部服务称为“入口”,截至撰写本文时,有 5 个可用入口。
在这五个服务中,有四个是商业服务,它们将为您运行所需的 SMTP 服务器,然后将电子邮件“传送”到您的应用程序(通常通过 Webhook 作为 JSON 有效负载)。
您已经可以在 Rails 应用程序中使用这些服务并自行处理 Webhooks,但 Action Mailbox 在此基础上构建了一组标准化的功能。几乎就像一组导轨来引导和加速该过程。
另外,第五个入口是“Relay”入口。这允许您在同一台计算机上运行自己支持的 MTA(SMTP 服务器),并将收到的电子邮件中继到 Action Mailbox(通常是原始电子邮件)。目前支持的 MTA 有:
回答有关 Gmail 的具体问题:
- 他们如何将其与 Action Mailbox 集成?
他们不能直接。他们还需要设置上面列出的 7 个 MTA 之一,然后以某种方式将电子邮件发送到该 MTA。交付可以通过以下方式完成:
- 会使用 Gmail 的 API,还是不适合 Action Mailbox?
即使有办法让 Gmail 对传入的电子邮件触发 Webhook(我不知道上述高级路由规则之外有任何特殊的传递选项),目前也无法将该理论上的 Webhook 连接到 Action Mailbox。
- 如果 Gmail 不起作用,SendGrid 有什么不同之处可以使其适当集成?
Sendgrid(使用您的示例,其他的工作方式或多或少相同)提供了入站邮件处理 API。同样重要的是,Rails 团队构建了一个传入电子邮件控制器来与该 API 集成。
鉴于缺乏 Gmail API 和 Rails 入口控制器,我能想到的将 Action Mailbox 连接到现有 Gmail 邮箱的唯一方法是使用其他一些代码来检查邮箱,重新格式化获取的邮箱发送电子邮件,然后伪装成受支持的 MTA 之一将其发送到 Action Mailbox。
更新 正如 @stwienert 所提到的,该过程正是 mail_room gem 为您所做的...或者您可以独立使用它,无需 Action Mailbox。他们的自述文件中有一个关于 与 Action Mailbox 集成的部分。
另一种选择是让您的 example.com 域正常传送到 Gmail,并为您的 Action Mailbox 电子邮件设置另一个域。您可以使用单独的域 example.org 或子域 app.example.com。
这将涉及设置 7 个受支持的 SMTP 服务器之一,并将 example.org 或 app.example.com 的 MX 记录指向这些服务器。
额外知识: MTA 的另一个名称是 Mail eXchager,因此 DNS 邮件记录的名称是 MX 记录。
要将 IMAP 与 Rails 集成,请查看伟大的
mail_room
Gem
它是一个守护进程,您可以与您的应用程序一起启动,它监听几个 IMAP 收件箱,然后将它们转换为 Sidekiq Worker 或通过 http 将其推送到您的应用程序。
Gitlab 使用它进行邮件交互(回答话题、通过写入电子邮件创建问题)。
他们还有一个关于如何与 ActionMailbox 集成的部分。
如果您决心这样做,Gmail 从第一天起就提供了 IMAP IDLE(推送)支持。
编写一个小型守护进程来监视 Gmail 收件箱并使用格式正确的 JSON 负载调用 Rails 操作邮箱 Webhook 端点将非常容易。