Product

解决方案

资源

Company

Product

解决方案

资源

Company

本地到云端电子邮件迁移指南

2020年6月28日

电子邮件

1 min read

本地到云端电子邮件迁移指南

2020年6月28日

电子邮件

1 min read

本地到云端电子邮件迁移指南

很多次,我们会听到这样的问题,“您是否有某种剧本可以说明从内部安装迁移到Bird的过程”?

是的,我们确实有。请继续阅读。

首先,一些背景故事。Bird Cloud服务于2014年因On-Premises Momentum MTA解决方案的巨大成功而创建。Momentum是Bird Cloud的核心,为数千个客户提供高速传输和流量整形服务。因此,Momentum获得了我们大量的工程关注,但这项工作的结果往往埋藏在性能改进中,没有获得太多的宣传。 Momentum客户在每次发布新的Momentum公共版本时都可以看到这项工作的好处。

这并不意味着Bird只是“云中的Momentum”。MessageBird远不止于此,并且可以为选择迁移或以混合方式使用它们的客户带来额外的好处。这些好处来自我们的现代基于云的电子邮件API架构,提供了传统内部解决方案无法获得的功能。此外,我们还为PowerMTA客户提供了非常简单的迁移或以混合配置使用PowerMTA和Bird的方式。本文档的其余部分将详细描述如何将您的消息流从Momentum或PowerMTA迁移到Bird Cloud服务。

实际上,对于从Momentum或PowerMTA迁移到Bird时需要考虑两种不同的情况。

  1. 您已准备好完全离开内部世界,关闭您的物理数据中心,不再直接管理任何本地MTA。这意味着从您的部署中消除Momentum或PowerMTA,并直接向SparkPost发送消息以进行消息处理。在停止您的内部基础设施之前,确保您对所有关键系统进行了全面的数据库备份,尤其是如果您正在运行包含重要历史数据或配置的PostgreSQL数据库。

  2. 您有理由保留一些本地痕迹。可能的一些情况包括:

  • 需要在Momentum中进行预处理的特定传输流

  • 容量分配以应对突发或灾难恢复需求

  • 在PMTA中支持旧客户,同时将新客户转移到SparkPost

…然后您希望将其他消息转发给Bird以进行后续消息处理。

在任何情况下,您都需要知道Bird仅接受通过端口587或2525注入的SMTP消息,并使用具有特定用户名和密码的SMTP_Auth(查看SMTP文档)。我们还强烈建议使用TLS连接,但这并不是绝对必要的。如果您完全替换MTA层(情况1),那么您可能还需要考虑使用Transmissions REST API,该API可以通过HTTPS连接接受消息。有关该API的文档在这里

对于需要安全电子邮件功能的维护本地基础设施的组织,我们的PowerMTA和Momentum S/MIME实施指南提供了加密电子邮件传输的详细设置说明。

我应该选择哪个选项?

要确定你属于选项#1还是选项#2,请考虑以下因素:

  • 您是否使用Momentum的Lua脚本引擎来处理消息路由之外的复杂事务?

    • Lua是一种全面的脚本工具,可用于在线操作消息,但我们绝大多数用户仅使用它来选择交付绑定。如果是这样,您可以修改生成代码,在X-MSYS-API头中添加一个ip_pool属性,让Bird为您分配路由。

    • 如果您使用Lua进行更复杂的操作,如正文过滤、Mail_From重写或消息节奏计算,并且将这些逻辑移入注入应用程序中不可行,您可能需要考虑切换到选项#2。

  • 您的生成系统能够使用TLS和SMTP_Auth通过端口587发送消息吗?

    • 一些活动管理系统只能通过端口25以明文方式推送邮件。这对Bird造成安全问题,因此您可能需要考虑选项#2。

  • 您是否使用了PowerMTA替换语法或其他在线消息修改功能?

    • 如果您可以将此功能移动到生成器中或使用Bird 模板语言,那么您仍可以使用选项1,否则您可能需要考虑在线保持一个PMTA节点以进行消息修改,然后再交付给Bird。

  • 您是否需要在注入前进行入站AV/AS扫描?虽然在Momentum和PowerMTA中可以实现,但eBird假定您已完成所有这些检查。您可能需要考虑在注入前进行。

无论您选择哪种方式,都必定会影响您的商业关系。正如您所想,这不是我们的第一次操作。请务必让您的商业客户经理和客户成功经理参与其中,以便我们帮助您处理细节,确保您获得最佳的投资回报。

对于选项#1营地(彻底戒除):

假设您对选项1感到满意,并且您准备关闭本地的MTA,并决定继续使用SMTP注入方法,不改变您的消息创建系统。您的生成系统应该创建一个完全格式化的SMTP消息,然后通过TLS使用SMTP_AUTH推送到Bird,用户名和密码如此页面所述。请记住,“密码”是您在Bird账户中生成的API密钥,并开启SMTP投递选项。

如果您属于选项#1的阵营,考虑直接从您的生成系统切换到REST API。大多数情况下,我们发现客户的处理系统已经通过HTTP使用JSON,并且必须在注入前转换为SMTP。您可以跳过那一步,直接将其作为JSON格式的REST负载发送给我们。

如果您选择通过REST API进行注入,您可能需要稍微更改您的内容创建系统,但这可能值得。您可以在这里了解更多

大ESP最关注的一个问题是迁移时的IP预热。通常,他们花了多年时间精心培养IP地址库存,所以放弃所有这些工作是很痛苦的。Bird已制定出一套Bring Your Own IP(BYOIP)流程来解决这个问题。如果您至少有一个连续的/24 CIDR块,Bird可以使用那些现有的IP来交付,从而节省您重新预热它们的麻烦。如果您能利用该选项,您可以跳过关于IP预热的部分。

如果您觉得已准备好了,可以跳到“付诸实现”部分。

假设您对选项1感到满意,并且您准备关闭本地的MTA,并决定继续使用SMTP注入方法,不改变您的消息创建系统。您的生成系统应该创建一个完全格式化的SMTP消息,然后通过TLS使用SMTP_AUTH推送到Bird,用户名和密码如此页面所述。请记住,“密码”是您在Bird账户中生成的API密钥,并开启SMTP投递选项。

如果您属于选项#1的阵营,考虑直接从您的生成系统切换到REST API。大多数情况下,我们发现客户的处理系统已经通过HTTP使用JSON,并且必须在注入前转换为SMTP。您可以跳过那一步,直接将其作为JSON格式的REST负载发送给我们。

如果您选择通过REST API进行注入,您可能需要稍微更改您的内容创建系统,但这可能值得。您可以在这里了解更多

大ESP最关注的一个问题是迁移时的IP预热。通常,他们花了多年时间精心培养IP地址库存,所以放弃所有这些工作是很痛苦的。Bird已制定出一套Bring Your Own IP(BYOIP)流程来解决这个问题。如果您至少有一个连续的/24 CIDR块,Bird可以使用那些现有的IP来交付,从而节省您重新预热它们的麻烦。如果您能利用该选项,您可以跳过关于IP预热的部分。

如果您觉得已准备好了,可以跳到“付诸实现”部分。

假设您对选项1感到满意,并且您准备关闭本地的MTA,并决定继续使用SMTP注入方法,不改变您的消息创建系统。您的生成系统应该创建一个完全格式化的SMTP消息,然后通过TLS使用SMTP_AUTH推送到Bird,用户名和密码如此页面所述。请记住,“密码”是您在Bird账户中生成的API密钥,并开启SMTP投递选项。

如果您属于选项#1的阵营,考虑直接从您的生成系统切换到REST API。大多数情况下,我们发现客户的处理系统已经通过HTTP使用JSON,并且必须在注入前转换为SMTP。您可以跳过那一步,直接将其作为JSON格式的REST负载发送给我们。

如果您选择通过REST API进行注入,您可能需要稍微更改您的内容创建系统,但这可能值得。您可以在这里了解更多

大ESP最关注的一个问题是迁移时的IP预热。通常,他们花了多年时间精心培养IP地址库存,所以放弃所有这些工作是很痛苦的。Bird已制定出一套Bring Your Own IP(BYOIP)流程来解决这个问题。如果您至少有一个连续的/24 CIDR块,Bird可以使用那些现有的IP来交付,从而节省您重新预热它们的麻烦。如果您能利用该选项,您可以跳过关于IP预热的部分。

如果您觉得已准备好了,可以跳到“付诸实现”部分。

利用 Option #2(on-prem 预处理):

然而,如果您属于选项#2团队,那么您将需要对部署进行一些配置更改。最不痛苦的方法是从Momentum或PMTA迁移一些选择的消息流到Bird,同时仍使用您的生成系统的SMTP注入,是在您的配置中添加一个特殊路由。

对于Momentum:

  1. 设置Momentum版本> 3.6.23。

  2. 安装有效的SSL证书并打开出站端口587,以便Momentum可以与Bird通信。配置一个出站域,这样您就可以通过Momentum将消息路由到Bird。

  3. 根据以下配置,任何碰到该配置的消息都将通过端口587和SMTP_Auth以及在此定义的用户名和密码路由到smtp.sparkpostmail.com。

    outbound_smtp_auth { }
    Keep_Message_Dicts_In_Memory = true
    Domain "smtp.sparkpostmail.com" {
      Remote_SMTP_Port = "587"
      Outbound_SMTP_AUTH_Type = "LOGIN"
      Outbound_SMTP_AUTH_user = "SMTP_Injection"
      Outbound_SMTP_AUTH_pass = "17258redacted8bd6cd7a8redacted8c22bce"
    }
  4. 配置您希望通过MessageBird使用TLS中继的绑定,并将它们连接到您上面定义的域。

    注意:
    TLS不是严格要求的,但强烈推荐。如果由于某种原因不能使用TLS,那么IP白名单API密钥也是强烈建议的。


    binding "CustomerA-Outbound" {
      Gateway = "smtp-demo.sparkpostelite.com"
      TLS = "required"
      TLS_Certificate = "/etc/pki/tls/certs/trymsys.net.crt"
      TLS_Key = "/etc/pki/tls/certs/trymsys.net.key"
      TLS_Ciphers = "DEFAULT"
    }

对于PowerMTA:

  1. 设置PowerMTA版本> 4.5.0

  2. 安装有效的SSL证书并打开出站端口587,以便PowerMTA可以与Bird通信。

  3. 配置一个出站域路径,以便您可以通过PowerMTA将消息路由到Bird。根据以下配置,任何碰到该配置的消息都将通过端口587和SMTP_Auth以及在此定义的用户名和密码路由到smtp.sparkpostmail.com。 在PowerMTA中,这也是可以设置TLS的地方。注意这也有更详细的文档记录这里

<domain sparkpost.rollup>
  use-unencrypted-plain-auth yes
  auth-username SMTP_Injection
  auth-password YourAPIKeygoesherewhenyougenerateit
  route smtp.sparkpostmail.com:587
  use-starttls yes
  require-starttls yes
  max-smtp-out 10
</domain>

4. 配置您希望通过Bird中继的VMTAs使用您上面定义的{sparkpost}汇总配置。

<virtual-mta SparkPostRelay>
  <domain *>
    queue-to {sparkpost}
  </domain>
</virtual-mta>

一旦您做出这些配置更改,发送到选定的“binding”或“VMTA”的任何消息都应自动通过Bird传递。

实现它

当你开始走上这条路时,不要误以为这是一个一夜之间的操作。正确地完成这件事需要一些时间和细心。

  1. 设置你的Bird账户并使用开发子账户进行全面测试,以便稍后可以过滤掉该流量。无论选择哪种方式,你都需要这样做,因为无论如何都需要API密钥作为SMTP_Auth密码。

  2. 如果你使用SMTP注入,计划添加一个X-MSYS-API标头以整合所需的所有元数据和消息属性。任何X-Headers都应重写为元数据,并且你还应包括ip_pool和campaign属性。这里提供了示例。

  3. 如果你不使用BYOIP,那么你应该确保为MessageBird设置稍微不同的发送域,以便在需要时可以平行运行这两个环境。如果你当前的发送域是mycompany.com,可以专门为Bird传递设置sp.mycompany.com。这允许你在不妥协任何一个域的情况下慢慢小心地迁移。

  4. 确保启用了完整的域对齐和安全特性。在DNS中,设置DKIM, SPF, DMARC,退回和跟踪域,以便它们看起来都属于同一个组织。

  5. 在你定义的IP_Pools上配置自动IP预热。如果你使用前面提到的BYOIP选项,可以忽略预热步骤。

  6. 从一个消息流开始,然后从那里继续前进。就像IP预热一样,你不想一次性完成这件事。首先重定向几百条消息,然后重定向10%的流量,接着在第二天增加到20%,并不断增加直到你将所有流量转移完毕。如果你是一家ESP,选择一个可以合作的客户,并根据他们的反馈测试这个过程。如果一切顺利,继续下一个。如果遇到问题,花时间解决并将其融入到下一个过程。

  7. 尽可能通过API实现自动化。除DNS更改外,SparkPost配置大部分可以通过几个API调用自动化。

从 Bird 收集数据

MessageBird 报告在 webhooks 数据流或消息事件 API 中的消息传递。访问 Bird 纯文本日志是不可能的。您可以使用 webhooks 收集器或通过定期调用 Events API 并消费数据将此数据回传到您的环境中。我们建议使用 webhooks 并且在这里有一些关于如何正确使用的建议。以最基本的形式,一个 PHP webhook 收集器可以在几行代码中部署:

<?php
$verb = $_SERVER['REQUEST_METHOD'];
if ($verb === "POST") {
    $jsonStr = file_get_contents("php://input");
    http_response_code(200);
    $rnum = rand(1000, 9999);
    $timestamp = date("YmdHis") . $rnum;
    $filePath = './data/data_' . $timestamp . '.txt';
    // Handle duplicate filenames (edge case)
    if (file_exists($filePath)) {
        $baseName = basename($filePath, ".txt");
        $seq = 0;
        $ftail = substr($baseName, -2, 1);
        if ($ftail === "-") {
            $seq = (int)

当您正在试验时,您可以尝试使用诸如http://webhook.site/等免费收集器。

一旦您收集了所有的 webhook 数据,您可以将其读取到数据存储中进行额外处理。还有一些方法可以通过像 StitchData 和 Segment 这样的服务推送 Webhooks。

如果您需要提取数据且不能接受推送数据,则Events API中也提供了相同的信息。以下是一个示例 Event API 调用:
GET https://api.sparkpost.com/api/v1/events/message?/

recipients=recipient@example.com&templates=my-template&events

该 API 在此处提供完整的文档以及示例:https://developers.sparkpost.com/api/events/#events-get-search-for-message-events

如果您真的需要将事件数据返回到看起来像 PMTA 或 Momentum 记录的形式,那也是可能的,只要您使用一些额外的条件代码。好消息是已经有一些例子可以借鉴。

Recap

确保与您的销售和成功管理团队交流。我们以前做过这件事,可以快速且具有成本效益地帮助您。

  1. 找出您是属于营地 #1 (能够完全从 On-Prem 迁移) 还是营地 #2 (仍需要一些本地 MTA)。

  2. 注册一个免费测试账户以评估集成细节。

  3. 决定使用SMTPREST API 注入方法。

  4. 如果您使用 SMTP 注入,请弄清楚如何将头数据和消息属性放入 X-MSYS-API 头中。

  5. 确认您是否可以使用我们的 BYOIP 过程。

  6. 如有必要,用新域更新您的 DNS。

  7. 构建一个小样本以测试您的迁移。您可能需要调整配置。

  8. 增加流量,以便所有流量都迁移完毕。

  9. 如果您属于营地 #1,流量迁移完成后,您可以最终关闭本地 MTA。

在计划高容量电子邮件系统的 DNS 更改时,请注意可能会影响大规模电子邮件交付性能的 AWS DNS 扩展挑战

一个人在办公桌前站着,一边在笔记本电脑上打字。

这个完整的AI原生平台可以随着您的业务进行扩展。

Product

解决方案

资源

Company

隐私设置

社交

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

Signup

© 2025 Bird

一个人在办公桌前站着,一边在笔记本电脑上打字。

这个完整的AI原生平台可以随着您的业务进行扩展。

Product

解决方案

资源

Company

隐私设置

社交

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

Signup

© 2025 Bird