经常问的问题

电子邮件平均在 5 秒内送达。与其他依赖延迟队列的供应商不同,我们实时运作。我们在任何时候都不会写入磁盘或存储电子邮件——一切都在内存中完成。

预计设置时间: 不到 10 分钟
增强的隐私保护: 如果您想隐藏您的信息以防止在 Internet 上公开搜索,请访问 我的帐户 并在开始本指南之前将您的域升级到付费计划。 免费计划的可公开搜索信息包括但不限于:别名、转发地址、收件人和自定义端口转发等高级设置。 如果您想了解有关付费计划的更多信息,请参阅我们的 价钱 页 - 否则请继续阅读! 所有计划都遵守我们的 隐私 严格不存储 SMTP 日志、元数据或电子邮件的政策。 我们不会像其他服务那样跟踪您。
入门: 仔细阅读并按照下面列出的步骤 1 到 8 进行操作。请务必更换电子邮件地址 user@gmail.com 使用您要将电子邮件转发到的电子邮件地址(如果它还不准确)。同样一定要更换 o3o.ca 使用您的自定义域名(如果它还不准确)。
  1. 如果您已经在某处注册了您的域名,那么您必须完全跳过这一步,进入第二步!否则你可以 点击这里注册您的域名.
  2. 你还记得你在哪里注册你的域名吗?记住这一点后,请按照以下说明进行操作:
    重要的: 您必须打开一个新选项卡并登录到您的域注册商。您可以轻松地单击下面的“注册商”来自动执行此操作。在这个新选项卡中,您必须导航到注册商的 DNS 管理页面——我们在下面的“配置步骤”列下提供了逐步导航步骤。在新选项卡中导航到此页面后,您可以返回此选项卡并继续执行下面的第三步。 不要关闭打开的标签页;您将需要它来完成未来的步骤!
    注册商 配置步骤
    1&1 登录 域中心 (选择您的域名) 编辑 DNS 设置
    亚马逊 53 号公路 登录 托管区域 (选择您的域名)
    Aplus.net 登录 我的服务器 域管理 DNS 管理器
    蓝主机 对于摇滚:登录 (点击管理旁边的▼图标) DNS
    对于传统:登录 区域编辑器 (选择您的域名)
    云耀斑 登录 DNS
    轻松实现 DNS 登录 DNS (选择您的域名)
    DNS简单 登录 (选择您的域名) DNS 管理
    数字海洋 登录 联网 (选择您的域名) 更多的 管理域
    域名.com 登录 在卡片视图中,单击域上的管理 在列表视图中,单击 齿轮图标 DNS 和域名服务器 DNS 记录
    Domains.com
    手表
    登录 (选择您的域名) 管理 (点击齿轮图标) 单击左侧菜单中的 DNS 和名称服务器
    梦想主机 登录 控制板 管理域 DNS
    男人 登录 概述 管理 简单的编辑器 记录
    思考 登录 (选择您的域名) 管理 编辑区域
    去吧爸爸
    手表
    登录 管理我的域 (选择您的域名) 管理 DNS
    谷歌域名
    手表
    登录 (选择您的域名) 配置 DNS
    名不虚传
    手表
    登录 域列表 (选择您的域名) 管理 高级 DNS
    网络化 登录 (选择您的域名) 设置 Netlify DNS
    网络解决方案 登录 客户经理 我的域名 (选择您的域名) 管理 更改域指向的位置 高级 DNS
    Shopify
    手表
    登录 托管域 (选择您的域名) DNS 设置
    广场空间 登录 主菜单 设置 (选择您的域名) 高级设置 自定义记录
    维塞尔的现在 使用“现在”CLI now dns add [domain] '@' MX [record-value] [priority]
    蹑手蹑脚 登录 域页面 (选择您的域名) DNS
    登录 域页面 (点击 图标) 选择管理 DNS 记录
    初级 登录 我的域名
    其他
    重要的: 此处未列出您的注册商名称?只需在 Internet 上搜索“如何更改 $REGISTRAR 上的 DNS 记录”(将 $REGISTRAR 替换为您的注册商的名称 - 例如,如果您使用 GoDaddy,则“如何更改 GoDaddy 上的 DNS 记录”)。
  3. 使用您的注册商的 DNS 管理页面(您打开的另一个选项卡),设置以下“MX”记录:
    重要的: 请注意,应该没有其他 MX 记录集。下面显示的两个记录都必须存在。确保没有错别字;并且您的 mx1 和 mx2 都拼写正确。如果已经存在 MX 记录,请彻底删除。 “TTL”值不需要是 3600,如果需要,它可以是更低或更高的值。
    名称/主机/别名 TTL 类型 优先 答案/值
    “@”、“.”或空白 3600 MX 10 mx1.forwardemail.net
    “@”、“.”或空白 3600 MX 10 mx2.forwardemail.net
  4. 使用您的注册商的 DNS 管理页面(您打开的另一个选项卡),设置以下内容 TXT 记录):
    重要的: 如果您使用的是付费计划,那么您必须完全跳过此步骤并转到第五步!如果您不在付费计划中,那么您转发的地址将是可公开搜索的——请访问 我的帐户 并根据需要将您的域升级到付费计划。如果您想了解有关付费计划的更多信息,请参阅我们的 价钱 页。否则,您可以继续从下面列出的选项 A 到选项 F 中选择一种或多种组合。

    选项 A: 如果您要将域中的所有电子邮件(例如“all@o3o.ca”、“hello@o3o.ca”等)转发到特定地址“user@gmail.com”:
    名称/主机/别名 TTL 类型 答案/值
    “@”、“.”或空白 3600 TXT forward-email=user@gmail.com
    小费: 确保将“值”列中的上述值替换为您自己的电子邮件地址。 “TTL”值不需要是 3600,如果需要,它可以是更低或更高的值。较低的生存时间 (“TTL”) 值将确保对您的 DNS 记录所做的任何未来更改更快地传播到整个 Internet - 将其视为它将在内存中缓存多长时间(以秒为单位)。您可以了解更多关于 维基百科上的 TTL,免费的百科全书.

    选项 B: 如果您只需要转发一个电子邮件地址(例如“hello@o3o.ca”到“user@gmail.com”;这也会将“hello+test@o3o.ca”转发到“user+test@gmail.com” “ 自动地):
    名称/主机/别名 TTL 类型 答案/值
    “@”、“.”或空白 3600 TXT forward-email=hello:user@gmail.com

    选项 C: 如果您要转发多封电子邮件,那么您需要用逗号分隔它们:
    名称/主机/别名 TTL 类型 答案/值
    “@”、“.”或空白 3600 TXT forward-email=hello:user@gmail.com,support:user@gmail.com

    选项 D: 您可以设置无限数量的转发电子邮件 - 只需确保在单行中不包含超过 255 个字符,并以“forward-email =”开始每一行。下面提供了一个示例:
    名称/主机/别名 TTL 类型 答案/值
    “@”、“.”或空白 3600 TXT forward-email=hello:user@gmail.com,support:user@gmail.com
    “@”、“.”或空白 3600 TXT forward-email=help:user@gmail.com,foo:user@gmail.com
    “@”、“.”或空白 3600 TXT forward-email=orders:user@gmail.com,baz:user@gmail.com
    “@”、“.”或空白 3600 TXT forward-email=info:user@gmail.com,beep:user@gmail.com
    “@”、“.”或空白 3600 TXT forward-email=errors:user@gmail.com,boop:user@gmail.com

    选项 E: 您还可以在您的 TXT 记录具有全局别名转发(例如“user@o3o.ca”将被转发到“user@example.net”):
    名称/主机/别名 TTL 类型 答案/值
    “@”、“.”或空白 3600 TXT forward-email=example.net

    选项 F: 您甚至可以使用 webhook 作为全局或个人别名来转发电子邮件。请参阅标题为 webhook 的示例和完整部分 你支持网络钩子吗 以下。
    名称/主机/别名 TTL 类型 答案/值
    “@”、“.”或空白 3600 TXT forward-email=alias:https://requestbin.com/r/en8pfhdgcculn

    选项 G: 您甚至可以使用正则表达式(“regex”)来匹配别名并处理替换以将电子邮件转发到。请参阅标题为正则表达式的示例和完整部分 你支持正则表达式还是正则表达式 以下。
    名称/主机/别名 TTL 类型 答案/值
    “@”、“.”或空白 3600 TXT forward-email=alias:https://requestbin.com/r/en8pfhdgcculn

  5. 使用您的注册商的 DNS 管理页面(您打开的另一个选项卡),另外设置以下内容 TXT 记录:
    名称/主机/别名 TTL 类型 答案/值
    “@”、“.”或空白 3600 TXT v=spf1 a mx include:spf.forwardemail.net -all
    重要的: 如果您使用的是 Gmail(例如 Send Mail As)或 G Suite,那么您需要附加 include:_spf.google.com 到上面的值,例如:

    v=spf1 a mx include:spf.forwardemail.net include:_spf.google.com -all
    小费: 如果您已经有类似的“v=spf1”行,那么您需要追加 include:spf.forwardemail.net 就在任何现有的“include:host.com”记录之前和同一行中的“-all”之前,例如:

    v=spf1 a mx include:spf.forwardemail.net include:host.com -all

    请注意,“-all”和“~all”之间是有区别的。 “-”表示如果不匹配则 SPF 检查应该失败,“~”表示 SPF 检查应该 SOFTFAIL。我们建议使用“-all”方法来防止域伪造。

    您可能还需要包含您发送邮件的主机的 SPF 记录(例如 Outlook)。
  6. 使用我们的“验证记录”工具验证您的 DNS 记录,网址为 我的帐户 设置。
  7. 发送测试电子邮件以确认它有效。请注意,您的 DNS 记录可能需要一些时间才能传播。
    小费: 如果您没有收到测试电子邮件,或者收到一封测试电子邮件,上面写着“请注意此消息”,请查看以下内容的答案 为什么我收不到测试邮件为什么我在 Gmail 中发送给自己的测试电子邮件显示为“可疑” 分别。
  8. 如果您希望从 Gmail “发送邮件”,那么您需要 看这个视频,或按照以下步骤操作 如何使用 Gmail 发送邮件 以下。
恭喜! 您已成功完成所有步骤。
小费: 下面列出了可选的附加组件。请注意,这些附加组件是完全可选的,可能不是必需的。如有必要,我们希望至少为您提供更多信息。
可选插件: 如果您正在使用 如何使用 Gmail 发送邮件 功能,那么您可能想将自己添加到白名单中。看 Gmail 的这些说明 关于这个话题。

预计设置时间: 不到 10 分钟
入门: 完成上述步骤后 如何开始和设置电子邮件转发 您可以按照上面的视频或下面的步骤进行操作 - 以便使用您的自定义域“发送邮件”。
  1. 你需要有 Gmail 的两步验证 启用此功能。访问 https://www.google.com/landing/2step/ 如果您没有启用它。

  2. 一旦启用了双因素身份验证(或者如果您已经启用了它),然后访问 https://myaccount.google.com/apppasswords.

  3. 当提示“选择要为其生成应用密码的应用和设备”时:

    • 在“选择应用程序”下拉菜单下选择“邮件”
    • 在“选择设备”下拉菜单下选择“其他”
    • 当系统提示输入文本时,输入您要转发的自定义域的电子邮件地址(例如“你好@o3o.ca" - 这将帮助您跟踪您为多个帐户使用此服务的情况)
  4. 将密码复制到自动生成的剪贴板

    重要的: 如果您使用 G Suite,请访问您的管理面板 应用 G 套件 Gmail 设置 高级设置 并确保选中“允许用户通过外部 SMTP 服务器发送邮件...”。激活此更改会有一些延迟,因此请等待几分钟。
  5. Gmail 和下 设置 账户和进口 发送邮件为,点击“添加另一个电子邮件地址”

  6. 当提示输入“姓名”时,输入您希望电子邮件显示为“发件人”的姓名(例如“Linus Torvalds”)

  7. 当提示输入“电子邮件地址”时,输入您在上面使用的自定义域的电子邮件地址(例如“你好@o3o.ca")

  8. 取消选中“视为别名”

    小费: 如果您希望收件人直接回复您的 Gmail 地址,请选中此项。了解更多, 按照 Gmail 的这些说明进行操作 关于这个话题。
  9. 点击“下一步”继续

  10. 当提示输入“SMTP 服务器”时,输入 smtp.gmail.com 并离开港口 587

  11. 当提示输入“用户名”时,输入您的 Gmail 地址中不带 gmail.com 部分(例如,如果我的电子邮件是“用户” 用户@gmail.com)

    重要的: 如果“用户名”部分是自动填充的,那么 你需要改变这个 改为您的 Gmail 地址的用户名部分。
  12. 当提示输入“密码”时,从剪贴板粘贴您在上述第 2 步中生成的密码

  13. 将单选按钮选中为“使用 TLS 的安全连接”

  14. 单击“添加帐户”继续

  15. 打开一个新选项卡以 Gmail 并等待您的验证电子邮件到达(您将收到一个验证码,确认您是您尝试“发送邮件”的电子邮件地址的所有者)

  16. 到达后,根据您在上一步中收到的提示复制并粘贴验证码

  17. 完成后,返回电子邮件并单击“确认请求”链接。您需要执行此步骤和上一步才能正确配置电子邮件。

恭喜! 您已成功完成所有步骤。

如果您使用“发送邮件为”功能向自己发送测试电子邮件,那么它不会显示在您的收件箱中,因为 这个广为人知的官方 Gmail 答案.

如果您仍然遇到问题,则很可能是 DNS 传播问题。您需要稍等片刻再试一次(或尝试在您的 TXT 记录)。

还是有问题? 请提交一份 帮助请求 因此我们可以帮助调查问题并找到快速解决方案。

电子邮件依赖于 SMTP 协议.该协议由发送到服务器的命令组成(最常在端口 25 上运行)。有一个初始连接,然后发件人指示邮件来自谁(“MAIL FROM”),然后是它要去的地方(“RCPT TO”),最后是邮件本身的标题和正文(“DATA” )。我们的电子邮件转发系统的流程相对于下面的每个 SMTP 协议命令进行了描述:

  • 初始连接(无命令名称,例如 telnet o3o.ca 25) - 这是初始连接。我们检查不在我们的发件人 白名单 反对我们的 拒绝名单.最后,如果发件人不在我们的许可名单中,那么我们会检查他们是否已经加入 列入灰名单.

  • HELO - 这表示用于识别发件人的 FQDN、IP 地址或邮件处理程序名称的问候语。这个值可以被欺骗,所以我们不依赖这个数据,而是使用连接 IP 地址的反向主机名查找。

  • MAIL FROM - 这表示来自电子邮件地址的信封邮件。如果输入了值,则它必须是有效的 RFC 5322 电子邮件地址。允许使用空值。我们 检查反向散射 在这里,我们还对照我们的 MAIL FROM 拒绝名单.我们最终会检查不在允许列表中的发件人以进行速率限制(请参阅有关 速率限制白名单 了解更多信息)。

  • RCPT TO - 这表示电子邮件的收件人。这些必须是有效的 RFC 5322 电子邮件地址。我们只允许每封邮件最多 100 个信封收件人(这与电子邮件中的“收件人”标头不同)。我们还检查一个有效的 发件人重写方案 (“SRS”)地址在此处,以防止使用我们的 SRS 域名进行欺骗。提供的包含“无回复”地址的收件人将收到 553 错误。见 以下“无回复”地址的完整列表.我们还会对照我们的 拒绝名单.

  • DATA - 这是我们处理电子邮件的服务的核心部分。见章节 您如何处理电子邮件以进行转发 下面以获得更多见解。

本节介绍我们与 SMTP 协议命令相关的流程 DATA 在该部分 您的电子邮件转发系统如何工作 上面——它是我们如何处理电子邮件的标题、正文、安全性,确定它需要传递到哪里,以及我们如何处理连接。

  1. 如果消息超过 50mb 的最大大小,则会被拒绝并返回 552 错误代码。

  2. 如果消息没有任何标头,或者标头无法解析,则会被拒绝并返回 421 错误代码。

  3. 如果邮件不包含“发件人”标头,或者“发件人”标头中的任何值不是有效的 RFC 5322 电子邮件地址,则该邮件将被拒绝并显示 550 错误代码。

  4. 如果邮件有超过 25 个“已接收”标头,则确定它已陷入重定向循环,并以 550 错误代码被拒绝。

  5. 使用电子邮件的指纹(请参阅 指纹识别),我们将检查该消息是否已尝试重试超过 500 次,如果是这样,则会以 550 错误代码拒绝该消息。

  6. 如果邮件有一个“To”标头,并且如果邮件的任何“To”标头使用我们的域名指向 SRS 重写地址,那么我们将重写它们(这即适用于假期响应者)。

  7. 如果邮件缺少“Message-ID”标头,那么我们将使用信封 MAIL FROM 解析的 FQDN 或我们的域名添加一个。

  8. 如果消息缺少有效的“日期”标头,那么我们将使用消息初始连接的到达时间添加一个。

  9. 我们将扫描电子邮件的结果存储在内存中 垃圾邮件扫描器.

  10. 如果 Spam Scanner 有任何任意结果,则会以 554 错误代码拒绝它。在撰写本文时,任意结果仅包括 GTUBE 测试。看 https://spamassassin.apache.org/gtube/ 以获得更多洞察力。

  11. 我们将在消息中添加以下标头以进行调试和防止滥用:

    • X-Original-To - 原本的 RCPT TO 消息的电子邮件地址。
      • 这对于确定电子邮件最初发送到的位置很有用。
      • 转发邮件 v10.0.0 新增。
      • 现有值(如果有)保留为 X-Original-Preserved-To.
    • X-ForwardEmail-Version - 当前 半版本 版本来自 package.json 我们的代码库。
    • X-ForwardEmail-Session-ID - 用于调试目的的会话 ID 值(仅适用于非生产环境)。
    • X-ForwardEmail-Sender - 一个逗号分隔的列表,包含原始信封 MAIL FROM 地址(如果不是空白)、反向 PTR 客户端 FQDN(如果存在)和发件人的 IP 地址。
    • X-Report-Abuse - 值为 abuse@forwardemail.net.
      • 现有值(如果有)保留为 X-Original-Report-Abuse.
    • X-Report-Abuse-To - 值为 abuse@forwardemail.net.
      • 现有值(如果有)保留为 X-Original-Report-Abuse-To.
  12. 然后我们检查消息 DKIM, SPF, ARC, 和 DMARC.

    • 如果消息未通过 DMARC 并且域具有拒绝策略(例如 p=reject 在 DMARC 政策中),然后以 550 错误代码拒绝它。通常,域的 DMARC 策略可以在 _dmarc 子域 TXT 记录,(例如 dig _dmarc.o3o.ca txt).
    • 如果消息未能通过 SPF 并且域具有硬失败策略(例如 -all 在 SPF 政策中,而不是 ~all 或根本没有策略),然后它会被拒绝并显示 550 错误代码。通常,域的 SPF 策略可以在 TXT 根域的记录(例如 dig o3o.ca txt)。有关更多信息,请参阅本节 像使用 Gmail 一样发送邮件 关于 SPF。
  13. 现在我们处理从 RCPT TO 部分中的命令 您的电子邮件转发系统如何工作 以上。对于每个收件人,我们执行以下操作:

    • 我们查找 TXT 域名记录(后面的部分 @ 符号,例如 o3o.ca 如果电子邮件地址是 test@o3o.ca)。例如,如果域是 o3o.ca 我们进行 DNS 查找,例如 dig o3o.ca txt.
    • 我们解析所有 TXT 以任一开头的记录 forward-email= (免费计划)或 forward-email-site-verification= (付费计划)。请注意,我们会解析两者,以便在用户升级或降级计划时处理电子邮件。
    • 从这些解析 TXT 记录,我们遍历它们以提取转发配置(如 部分所述 如何开始和设置电子邮件转发 以上)。请注意,我们只支持一个 forward-email-site-verification= 值,如果提供了多个值,则会发生 550 错误,并且发件人将收到此收件人的退回邮件。
    • 我们递归地遍历提取的转发配置以确定全局转发、基于正则表达式的转发和所有其他支持的转发配置——现在称为我们的“转发地址”。
    • 对于每个转发地址,我们支持一个递归查找(它将在给定地址上开始这一系列操作)。如果找到递归匹配,则父结果将从转发地址中删除,并添加子结果。
    • 转发地址被解析为唯一性(因为我们不想将重复发送到一个地址或产生额外的不必要的 SMTP 客户端连接)。
    • 对于每个转发地址,我们根据 API 端点查找其域名 /v1/max-forwarded-addresses (为了确定允许域将电子邮件转发到每个别名的地址数量,例如,默认情况下为 10 - 请参阅关于 每个别名的最大转发限制)。如果超出此限制,则会发生 550 错误,并且发件人将收到此收件人的退回邮件。
    • 我们根据我们的 API 端点查找原始收件人的设置 /v1/settings,它支持对付费用户的查找(免费用户的后备)。这将返回一个用于高级设置的配置对象 port (数字,例如 25), has_adult_content_protection (布尔), has_phishing_protection (布尔), has_executable_protection (布尔),和 has_virus_protection (布尔)。
    • 根据这些设置,我们会检查垃圾邮件扫描器的结果,如果出现任何错误,则邮件将被拒绝并显示 554 错误代码(例如,如果 has_virus_protection 已启用,然后我们将检查垃圾邮件扫描程序的结果是否有病毒)。请注意,所有免费计划用户都将选择加入对成人内容、网络钓鱼、可执行文件和病毒的检查。默认情况下,所有付费计划用户也都选择加入,但可以在转发电子邮件仪表板中域的“设置”页面下更改此配置)。
  14. 对于每个已处理的收件人的转发地址,我们然后执行以下操作:

    • 该地址已根据我们的检查 拒绝名单,如果已列出,则会出现 554 错误代码,并且发件人将收到此收件人的退回邮件。
    • 如果地址是一个 webhook,那么我们为未来的操作设置一个布尔值(见下文——我们将相似的 webhook 组合在一起以发出一个 POST 请求,而不是多个用于交付)。
    • 如果地址是电子邮件地址,那么我们会解析主机以供将来操作(见下文 - 我们将相似的主机组合在一起以建立一个连接,而不是多个单独的连接以进行交付)。
  15. 如果没有收件人且没有退回邮件,我们会以“收件人无效”的 550 错误响应。

  16. 如果有收件人,那么我们遍历它们(由同一主机组合在一起)并传递电子邮件。见章节 您如何处理电子邮件发送问题 下面以获得更多见解。

    • 如果在发送电子邮件时发生任何错误,我们会将它们存储在内存中以供以后处理。
    • 我们将从发送电子邮件中获取最低的错误代码(如果有) - 并将其用作响应代码 DATA 命令。这意味着未发送的电子邮件通常会由原始发件人重试,但已发送的电子邮件将不会在下次发送邮件时重新发送(正如我们使用 指纹识别).
    • 如果没有发生错误,那么我们将发送一个 250 成功的 SMTP 响应状态码。
    • 退回被确定为任何导致状态代码 >= 500(永久失败)的交付尝试。
  17. 如果没有发生退回(永久失败),那么我们将返回非永久失败中最低错误代码的 SMTP 响应状态代码(如果没有,则返回 250 成功状态代码)。

  18. 如果确实发生了退回邮件,我们将在将所有错误代码中最低的一个返回给发件人后在后台发送退回邮件。但是,如果最低错误代码 >= 500,则我们不会发送任何退回电子邮件。这是因为如果我们这样做了,那么发件人会收到一封重复退回的电子邮件(例如,一封来自他们的出站 MTA,例如 Gmail,还有一封来自我们)。请参阅关于 如何防止反向散射 下面以获得更多见解。

请注意,当且仅当发件人的 DMARC 政策为 p=reject,并且它有一个通过的 SPF,并且没有 DKIM 签名与“发件人”标头对齐。这意味着我们将更改消息上的“From”标头,设置“X-Original-From”,如果尚未设置,还设置“Reply-To”。我们还将在更改这些标头后重新密封消息上的 ARC 密封。

我们还在堆栈的每个级别使用错误消息的智能解析——在我们的代码中,DNS 请求、Node.js 内部、HTTP 请求(例如,如果接收者将 408、413 和 429 映射到 SMTP 响应代码 421是一个 webhook)和邮件服务器响应(例如,带有“defer”或“slowdown”的响应将作为 421 错误重试)。

我们的逻辑是防伪的,它还会重试 TLS/SSL 错误、连接问题等。虚拟打样的目标是最大限度地提高转发配置对所有收件人的可传递性。

如果接收者是 webhook,那么我们将允许 60 秒的超时时间来完成请求,最多重试 3 次(因此在失败之前总共有 4 个请求)。请注意,我们正确解析了错误代码 408、413 和 429,并将它们映射到 SMTP 响应代码 421。

否则,如果收件人是电子邮件地址,那么我们将尝试使用机会性 TLS 发送电子邮件(如果收件人邮件服务器上可用,我们将尝试使用 STARTTLS)。如果在尝试发送电子邮件时发生 SSL 或 TLS 错误,那么我们将尝试在不使用 TLS 的情况下发送电子邮件(不使用 STARTTLS)。

如果发生任何 DNS 或连接错误,我们将返回 DATA 命令 SMTP 响应代码 421,否则如果有 >= 500 级错误,则将发送退回邮件。

如果我们检测到我们尝试投递的电子邮件服务器有一个或多个我们的邮件交换 IP 地址被阻止(例如,通过他们用于延迟垃圾邮件发送者的任何技术),那么我们将向发件人发送一个 421 的 SMTP 响应代码到稍后重试他们的消息(我们会收到有关该问题的警报,因此我们希望在下一次尝试之前解决它)。

我们定期监控所有主要的 DNS 拒绝名单,如果我们的任何邮件交换 (“MX”) IP 地址被列在主要拒绝名单中,我们将尽可能将其从相关的 DNS A 记录循环中移除,直到问题得到解决。

在撰写本文时,我们也在多个 DNS 白名单中列出,并且我们非常重视监控黑名单。如果您在我们有机会解决之前发现任何问题,请通过以下方式书面通知我们 支持@forwardemail.net.

我们不会将电子邮件转发到“无回复”地址,任何尝试转发的发件人都会收到 553 错误。

等于以下任何一项(不区分大小写)的电子邮件用户名被视为无回复地址:

  • no-reply@
  • no_reply@
  • nobody@
  • noreplies@
  • noreply@

是的,我们每天根据在 DNS 级别使用的最流行的根 FQDN 更新许可名单。该列表包含大约 200,000 到 300,000 个唯一的根域名。

包括流行的提供商,例如 Google (Gmail)、Yahoo、Microsoft (Outlook)、Amazon (Amazon SES)、Meta (Facebook)、Twitter、Netflix、Spotify 等。

如果您是发件人或使用的发件人不在我们的允许列表中,那么您的 FQDN 根域或 IP 地址第一次发送电子邮件时,您将 限速列入灰名单.

白名单请求可以发送到 allowlist@forwardemail.net (请提供完整的描述和添加到白名单的原因、网站链接以及您的企业的成立证书以列入我们的白名单)。

是的,我们有一个非常松懈的 电子邮件灰名单 使用的策略。灰名单仅适用于不在我们许可名单上的发件人,并在我们的缓存中持续 30 天。

对于任何新的发件人,我们在 Redis 数据库中存储一个密钥 30 天,其值设置为他们第一次请求的初始到达时间。然后,我们以 450 的重试状态代码拒绝他们的电子邮件,并仅在 5 分钟过去后允许它通过。

如果他们从这个初始到达时间成功等待了 5 分钟,那么他们的电子邮件将被接受,他们将不会收到这个 450 状态代码。

密钥由 FQDN 根域或发件人的 IP 地址组成。这意味着通过灰名单的任何子域也将通过根域,反之亦然(这就是我们所说的“非常宽松”的策略)。

例如,如果一封电子邮件来自 test.o3o.ca 在我们看到一封电子邮件来自之前 o3o.ca,然后是来自 test.o3o.ca 和/或 o3o.ca 从连接的初始到达时间起必须等待 5 分钟。我们不做两者 test.o3o.cao3o.ca 每个人都等待自己的 5 分钟时间(我们的灰名单政策适用于根域级别)。

请注意,灰名单不适用于我们的任何发件人 白名单 (例如撰写本文时的 Meta、Amazon、Netflix、Google、Microsoft)。

是的,我们运营自己的私人黑名单,并根据检测到的垃圾邮件和恶意活动实时和手动自动更新。被拒绝的发件人将收到 554 错误消息。

我们还从 UCEPROTECT 级别 1 拒绝列表中删除 http://wget-mirrors.uceprotect.net/rbldnsd-all/dnsbl-1.uceprotect.net.gz 每小时一次,并将其输入到我们的 Redis 数据库中,有效期为 7 天。

允许列表请求(或拒绝列表删除请求)可以发送到 allowlist@forwardemail.net (请提供完整的描述和添加到白名单的原因、网站链接以及您的企业的成立证书以列入我们的白名单)。

是的,我们有速率限制,仅适用于不在 白名单.

对于每个发件人解析的 FQDN 根域(或)发件人远程 IP 地址(如果没有可用的反向 PTR)和每个信封收件人,我们每小时最多允许 100 个连接。我们将用于速率限制的密钥作为加密哈希存储在我们的 Redis 数据库中。

如果您通过我们的系统发送电子邮件,请确保您为所有 IP 地址设置了反向 PTR(否则您发送的每个唯一 FQDN 根域或 IP 地址将受到速率限制)。

请注意,如果您通过流行的系统(如 Amazon SES)发送,那么您将不会受到速率限制,因为(在撰写本文时)Amazon SES 已列在我们的白名单中。

如果您从域发送,例如 test.abc.123.o3o.ca,那么速率限制将被施加于 o3o.ca.许多垃圾邮件发送者使用数百个子域来解决常见的垃圾邮件过滤器,这些过滤器仅对唯一主机名进行速率限制,而不是唯一的 FQDN 根域。

超过速率限制的发件人将被拒绝并出现 421 错误。

误导性退回或退回垃圾邮件(称为“后向散射") 可能会对发件人 IP 地址造成负面声誉。

我们采取两个步骤来防止反向散射,这将在以下部分中详细介绍 防止来自已知的 MAIL FROM 垃圾邮件发送者的退回防止不必要的反弹以防止反向散射 以下。

防止来自已知的 MAIL FROM 垃圾邮件发送者的退回

我们从 反向散射.org (供电 UCEPROTECT) 在 http://wget-mirrors.uceprotect.net/rbldnsd-all/ips.backscatterer.org.gz 每小时并将其输入到我们的 Redis 数据库中(我们还会提前比较差异;以防任何需要兑现的 IP 被删除)。

如果 MAIL FROM 为空白或包含(不区分大小写)以下用户名之一(电子邮件中 @ 之前的部分),则我们检查发件人 IP 是否与此列表中的一个匹配:

  • abuse@
  • ftp@
  • hostmaster@
  • mailer-daemon@
  • mailer_daemon@
  • mailerdaemon@
  • news@
  • no-reply@
  • no_reply@
  • nobody@
  • noreplies@
  • noreply@
  • postmaster@
  • root@
  • security@
  • usenet@
  • webmaster@
  • www@

如果发件人的 IP 被列出(而不是在我们的 白名单),然后我们发送一个 554 错误消息 The IP ${session.remoteAddress} is blocked by https://www.backscatterer.org/index.php?target=test&ip=${session.remoteAddress}.如果发件人同时在反向散射者列表和我们的白名单中,我们将收到提醒,以便我们在必要时解决问题。

本节中描述的技术遵循“安全模式”建议 https://www.backscatterer.org/?target=usage – 如果某些条件已经满足,我们只检查发件人 IP。

防止不必要的反弹以防止反向散射

退回邮件是指将电子邮件转发给收件人完全失败且不会重试的电子邮件。

被列入 Backscatterer 列表的一个常见原因是被误导的退回邮件或退回垃圾邮件,因此我们必须通过以下几种方式来防范这种情况:

  1. 我们仅在发生 >= 500 状态代码错误时发送退回邮件(当尝试转发的电子邮件失败时,例如 Gmail 以 500 级错误响应)。

  2. 我们只发送一次退回邮件(我们使用计算的退回指纹密钥并将其存储在缓存中以防止发送重复)。退回指纹是一个密钥,它是消息的指纹与退回地址及其错误代码的哈希值的组合)。请参阅关于 指纹识别 以更深入地了解如何计算消息指纹。成功发送的退回指纹将在我们的 Redis 缓存中 7 天后过期。

  3. 仅当 MAIL FROM 不为空白且不包含(不区分大小写)以下用户名之一(电子邮件中 @ 之前的部分)时,我们才会发送退回邮件。请注意,此列表比 MAIL FROM 检查中的上述列表要短一些,因为我们不希望出现误报(例如,security@ 是您可能想要退回的有效地址;很多人将 security@ 用于他们的漏洞赏金计划)。

    • abuse@
    • mailer-daemon@
    • mailer_daemon@
    • mailerdaemon@
  4. 如果原始邮件具有以下任何标头(不区分大小写),我们不会发送退回邮件:

    • Auto-Submitted (值为 no)
    • X-Auto-Response-Suppress (值为 dr, autoreply, auto-reply, auto_reply, 或者 all)
    • List-Id
    • List-Unsubscribe
    • Feedback-ID
    • X-Auto-Reply
    • X-Autoreply
    • X-Auto-Respond
    • X-Autorespond
    • Precedence (值为 bulk, autoreply, auto-reply, auto_reply, 或者 list)

电子邮件的指纹用于确定电子邮件的唯一性并防止重复消息被传递和 重复反弹 从被发送。

指纹是一系列以冒号分隔的密码计算哈希,在我们的代码库内部使用。

当且仅当它们的值存在时,这些计算的哈希值才会被推送到数组(列表):

  • 客户端解析的 FQDN 主机名或 IP 地址
  • Message-ID 标头值
  • Date 标头值(当且仅当 Message-ID 不存在)
  • From 标头值(当且仅当 Message-ID 不存在)
  • To 标头值(当且仅当 Message-ID 不存在)
  • Cc 标头值(当且仅当 Message-ID 不存在)
  • Subject 标头值(当且仅当 Message-ID 不存在)
  • Body 价值(当且仅当 Message-ID 不存在)

如果您在向自己发送测试时在 Gmail 中看到此错误消息,或者当您使用别名发送电子邮件的人第一次看到您的电子邮件时,那么 请不要担心 – 因为这是 Gmail 的内置安全功能。

您只需单击“看起来很安全”即可。例如,如果您使用发送邮件作为功能发送测试消息(给其他人),那么他们将看不到此消息。

但是,如果他们确实看到了这条消息,那是因为他们通常习惯于看到您的电子邮件来自 约翰@gmail.com 代替 约翰@customdomain.com (只是一个例子)。 Gmail 会提醒用户确保一切安全,以防万一,没有解决方法。

这仅适用于您使用 如何使用 Gmail 发送邮件 特征。目前没有解决方法,它会影响所有服务提供商(不仅仅是我们)。解决方法是使用自定义 SMTP 服务器。但是我们还没有提供 SMTP。

我们计划发布我们自己的 SMTP 服务(不仅仅是转发,还有一般的电子邮件),这将缓解这种情况。 Gmail 会自动添加此项,目前没有解决方法。具有与我们类似功能的其他电子邮件转发服务仍然会遇到同样的问题(并且其他电子邮件转发解决方案根本不提供我们所做的隐私级别)。

如果您想在发布时收到通知,您可以发送电子邮件 smtp@forwardemail.net 我们会在发布后向您发送通知。或者,如果您还没有,请在此处注册一个帐户!

是的,自 2020 年 5 月 5 日起,我们已添加此功能。现在该功能是特定于域的,而不是特定于别名的。如果您要求它是特定于别名的,请联系我们让我们知道您的需求。

增强的隐私保护: 如果您使用的是付费计划(具有增强的隐私保护功能),请访问 我的帐户 ,点击您的域旁边的“设置”,然后点击“设置”。如果您想了解有关付费计划的更多信息,请参阅我们的 价钱 页。否则,您可以继续按照以下说明进行操作。

如果您使用的是免费计划,那么只需添加一个新的 DNS TXT 如下所示记录,但将端口从 25 更改为您选择的端口。

例如,如果我想要所有发往 o3o.ca 转发到别名收件人的 SMTP 端口 1337 而不是 25:

名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email-port=1337
小费: 自定义端口转发设置的最常见场景是,当您希望将所有发往 o3o.ca 的电子邮件转发到 o3o.ca 上的不同端口,而不是端口 25 的 SMTP 标准。要设置它,只需添加以下内容 TXT 包罗万象的记录。
名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=o3o.ca

是的!当您在计划首次开始后的 30 天内升级、降级或取消帐户时,会自动退款。这仅适用于首次使用的客户。

当您切换计划时,我们不会按比例计算或退还差价。相反,我们会将您现有计划的到期日期的剩余期限转换为新计划的最接近的相对期限(按月四舍五入)。

请注意,如果您在首次启动付费计划后的 30 天内升级或降级付费计划,那么我们将自动从您现有的计划中退还全部金额。

是的,自 2020 年 5 月 15 日起,我们已添加此功能。您可以像添加任何收件人一样简单地添加 webhook!请确保您在 webhook 的 URL 中有前缀“http”或“https”协议。

增强的隐私保护: 如果您使用的是付费计划(具有增强的隐私保护功能),请访问 我的帐户 并单击您的域旁边的“别名”以配置您的 webhook。如果您想了解有关付费计划的更多信息,请参阅我们的 价钱 页。否则,您可以继续按照以下说明进行操作。

如果您使用的是免费计划,那么只需添加一个新的 DNS TXT 记录如下图:

例如,如果我想要所有发往 alias@o3o.ca 转发到一个新的 请求箱 测试端点:

名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=alias:https://requestbin.com/r/en8pfhdgcculn

或者,也许您想要所有发送到 o3o.ca 转发到此端点:

名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=https://requestbin.com/r/en8pfhdgcculn

以下是有关 webhook 的附加说明:

  • Webhook HTTP 请求将在每次 SMTP 连接尝试时最多重试 3 次,每个端点 POST 请求的最大超时时间为 60 秒。 请注意,这并不意味着它只重试 3 次,它实际上会在第三次 HTTP POST 请求尝试失败后通过发送 421 的 SMTP 代码(向发件人表示稍后重试)来连续重试。这意味着电子邮件将连续重试几天,直到达到 200 状态代码。

  • 我们将根据中使用的默认状态和错误代码自动重试 superagent的重试方法 (我们是维护者)。

  • 我们将向同一个端点发送的 webhook HTTP 请求组合在一个请求中,而不是多个),以节省资源并加快响应时间。例如,如果您向 webhook1@o3o.ca, webhook2@o3o.ca, 和 webhook3@o3o.ca,并且所有这些都配置为命中相同 精确的 端点 URL,则只会发出一个请求。我们通过严格相等的精确端点匹配分组在一起。

  • 请注意,我们使用 邮件解析器 库的“simpleParser”方法将消息解析为 JSON 友好对象。

  • 作为字符串的原始电子邮件值作为属性“raw”给出。

  • 身份验证结果以属性“dkim”、“spf”、“arc”、“dmarc”和“bimi”的形式给出。

  • 解析后的电子邮件标题以属性“headers”的形式给出——但还请注意,您可以使用“headerLines”来更轻松地进行迭代和解析。

  • 此 webhook 的分组接收者被分组在一起,并作为属性“接收者”给出。

  • SMTP 会话信息作为属性“会话”给出。这包含有关消息发送者、消息到达时间、HELO 和客户端主机名的信息。客户端主机名值为 session.clientHostname 是 FQDN(来自反向 PTR 查找)或者是 session.remoteAddress 括在括号中(例如 "[127.0.0.1]").

  • 如果有附件,它们将被附加到 attachments 带有缓冲区值的数组。您可以使用 JavaScript 方法将它们解析回内容,例如:

    const data = [
      104,
      101,
      108,
      108,
      111,
      32,
      119,
      111,
      114,
      108,
      100,
      33
    ];
    

    // // outputs "hello world!" to the console // (this is the content from the filename "text1.txt" in the example JSON request payload above) // console.log(Buffer.from(data).toString());

小费: 好奇转发的电子邮件中的 webhook 请求是什么样的?我们在下面为您提供了一个示例!
{
  "attachments": [
    {
      "type": "attachment",
      "content": {
        "type": "Buffer",
        "data": [
          104,
          101,
          108,
          108,
          111,
          32,
          119,
          111,
          114,
          108,
          100,
          33
        ]
      },
      "contentType": "text/plain",
      "partId": "2",
      "release": null,
      "contentDisposition": "attachment",
      "filename": "text1.txt",
      "headers": {},
      "checksum": "fc3ff98e8c6a0d3087d515c0473f8677",
      "size": 12
    }
  ],
  "headers": "ARC-Seal: i=1; a=rsa-sha256; t=1653506802; cv=none; d=forwardemail.net;\r\n s=default;\r\n b=R6QJ0tGwwjg2VPxiAlVIKxsg3jEPtRGKPTIOdZNWuhWrbssttFdOYzRRqvacDyN5SLoyDhVye\r\n DUA/64IxANXdHVFlpR258Yp7WxLDv2gtJD5vNSKYmUJZOWk1TynmlqTYrp0Vuqg2xIUjIlPBWAJ\r\n PPNx4JvOLjJuWYynU2qIWz0=\r\nARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed;\r\n d=forwardemail.net; h=MIME-Version: Date: Message-ID: From: Content-Type;\r\n q=dns/txt; s=default; t=1653506802;\r\n bh=cEYDoyTy+Ub29XZt/zXR+sprfUE6BW0y5cHfah01PT4=;\r\n b=F/t56AAXr2Kv3G6VsbdT5OKDVJf2ulhwLiTM18Ra4tDPUKPSGSLKrWvxiXEg5NMWwdWnsOYrL\r\n r3YSm4uMxVMhHZbHm/sUu4QZq5/18hQsAkCv6fI9ifTjDwBrN5zpLOhPoZFFo+TyvHxiII3Xv3L\r\n UEzmUIIaJRX6tboQ160tino=\r\nARC-Authentication-Results: i=1; mx1.forwardemail.net;\r\n dkim=none (message not signed);\r\n spf=none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) smtp.mailfrom=test@example.net smtp.helo=user.oem.local;\r\n dmarc=none header.from=o3o.ca;\r\n bimi=skipped (DMARC not enabled)\r\nReceived-SPF: none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) client-ip=127.0.0.1;\r\nAuthentication-Results: mx1.forwardemail.net;\r\n dkim=none (message not signed);\r\n spf=none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) smtp.mailfrom=test@example.net smtp.helo=user.oem.local;\r\n dmarc=none header.from=o3o.ca;\r\n bimi=skipped (DMARC not enabled)\r\n",
  "headerLines": [
    {
      "key": "arc-seal",
      "line": "ARC-Seal: i=1; a=rsa-sha256; t=1653506802; cv=none; d=forwardemail.net;\r\n s=default;\r\n b=R6QJ0tGwwjg2VPxiAlVIKxsg3jEPtRGKPTIOdZNWuhWrbssttFdOYzRRqvacDyN5SLoyDhVye\r\n DUA/64IxANXdHVFlpR258Yp7WxLDv2gtJD5vNSKYmUJZOWk1TynmlqTYrp0Vuqg2xIUjIlPBWAJ\r\n PPNx4JvOLjJuWYynU2qIWz0="
    },
    {
      "key": "arc-message-signature",
      "line": "ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed;\r\n d=forwardemail.net; h=MIME-Version: Date: Message-ID: From: Content-Type;\r\n q=dns/txt; s=default; t=1653506802;\r\n bh=cEYDoyTy+Ub29XZt/zXR+sprfUE6BW0y5cHfah01PT4=;\r\n b=F/t56AAXr2Kv3G6VsbdT5OKDVJf2ulhwLiTM18Ra4tDPUKPSGSLKrWvxiXEg5NMWwdWnsOYrL\r\n r3YSm4uMxVMhHZbHm/sUu4QZq5/18hQsAkCv6fI9ifTjDwBrN5zpLOhPoZFFo+TyvHxiII3Xv3L\r\n UEzmUIIaJRX6tboQ160tino="
    },
    {
      "key": "arc-authentication-results",
      "line": "ARC-Authentication-Results: i=1; mx1.forwardemail.net;\r\n dkim=none (message not signed);\r\n spf=none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) smtp.mailfrom=test@example.net smtp.helo=user.oem.local;\r\n dmarc=none header.from=o3o.ca;\r\n bimi=skipped (DMARC not enabled)"
    },
    {
      "key": "received-spf",
      "line": "Received-SPF: none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) client-ip=127.0.0.1;"
    },
    {
      "key": "authentication-results",
      "line": "Authentication-Results: mx1.forwardemail.net;\r\n dkim=none (message not signed);\r\n spf=none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) smtp.mailfrom=test@example.net smtp.helo=user.oem.local;\r\n dmarc=none header.from=o3o.ca;\r\n bimi=skipped (DMARC not enabled)"
    },
    {
      "key": "x-forwardemail-sender",
      "line": "X-ForwardEmail-Sender: rfc822; test@example.net"
    },
    {
      "key": "x-forwardemail-session-id",
      "line": "X-ForwardEmail-Session-ID: w2czxgznghn5ryyw"
    },
    {
      "key": "x-forwardemail-version",
      "line": "X-ForwardEmail-Version: 9.0.0"
    },
    {
      "key": "content-type",
      "line": "Content-Type: multipart/mixed; boundary=\"--_NmP-179a735428ca7575-Part_1\""
    },
    {
      "key": "from",
      "line": "From: some <random@o3o.ca>"
    },
    {
      "key": "message-id",
      "line": "Message-ID: <69ad5fc2-91cb-728f-ae5c-eeedc5f267b6@example.net>"
    },
    {
      "key": "date",
      "line": "Date: Wed, 25 May 2022 19:26:41 +0000"
    },
    {
      "key": "mime-version",
      "line": "MIME-Version: 1.0"
    }
  ],
  "html": "<strong>some random text</strong>",
  "text": "some random text",
  "textAsHtml": "<p>some random text</p>",
  "date": "2022-05-25T19:26:41.000Z",
  "from": {
    "value": [
      {
        "address": "random@o3o.ca",
        "name": "some"
      }
    ],
    "html": "<span class=\"mp_address_group\"><span class=\"mp_address_name\">some</span> &lt;<a href=\"mailto:random@o3o.ca\" class=\"mp_address_email\">random@o3o.ca</a>&gt;</span>",
    "text": "some <random@o3o.ca>"
  },
  "messageId": "<69ad5fc2-91cb-728f-ae5c-eeedc5f267b6@example.net>",
  "raw": "ARC-Seal: i=1; a=rsa-sha256; t=1653506802; cv=none; d=forwardemail.net;\r\n s=default;\r\n b=R6QJ0tGwwjg2VPxiAlVIKxsg3jEPtRGKPTIOdZNWuhWrbssttFdOYzRRqvacDyN5SLoyDhVye\r\n DUA/64IxANXdHVFlpR258Yp7WxLDv2gtJD5vNSKYmUJZOWk1TynmlqTYrp0Vuqg2xIUjIlPBWAJ\r\n PPNx4JvOLjJuWYynU2qIWz0=\r\nARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed;\r\n d=forwardemail.net; h=MIME-Version: Date: Message-ID: From: Content-Type;\r\n q=dns/txt; s=default; t=1653506802;\r\n bh=cEYDoyTy+Ub29XZt/zXR+sprfUE6BW0y5cHfah01PT4=;\r\n b=F/t56AAXr2Kv3G6VsbdT5OKDVJf2ulhwLiTM18Ra4tDPUKPSGSLKrWvxiXEg5NMWwdWnsOYrL\r\n r3YSm4uMxVMhHZbHm/sUu4QZq5/18hQsAkCv6fI9ifTjDwBrN5zpLOhPoZFFo+TyvHxiII3Xv3L\r\n UEzmUIIaJRX6tboQ160tino=\r\nARC-Authentication-Results: i=1; mx1.forwardemail.net;\r\n dkim=none (message not signed);\r\n spf=none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) smtp.mailfrom=test@example.net smtp.helo=user.oem.local;\r\n dmarc=none header.from=o3o.ca;\r\n bimi=skipped (DMARC not enabled)\r\nReceived-SPF: none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) client-ip=127.0.0.1;\r\nAuthentication-Results: mx1.forwardemail.net;\r\n dkim=none (message not signed);\r\n spf=none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) smtp.mailfrom=test@example.net smtp.helo=user.oem.local;\r\n dmarc=none header.from=o3o.ca;\r\n bimi=skipped (DMARC not enabled)\r\nX-ForwardEmail-Sender: rfc822; test@example.net\r\nX-ForwardEmail-Session-ID: w2czxgznghn5ryyw\r\nX-ForwardEmail-Version: 9.0.0\r\nContent-Type: multipart/mixed; boundary=\"--_NmP-179a735428ca7575-Part_1\"\r\nFrom: some <random@o3o.ca>\r\nMessage-ID: <69ad5fc2-91cb-728f-ae5c-eeedc5f267b6@example.net>\r\nDate: Wed, 25 May 2022 19:26:41 +0000\r\nMIME-Version: 1.0\r\n\r\n----_NmP-179a735428ca7575-Part_1\r\nContent-Type: multipart/alternative;\r\n boundary=\"--_NmP-179a735428ca7575-Part_2\"\r\n\r\n----_NmP-179a735428ca7575-Part_2\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Transfer-Encoding: 7bit\r\n\r\nsome random text\r\n----_NmP-179a735428ca7575-Part_2\r\nContent-Type: text/html; charset=utf-8\r\nContent-Transfer-Encoding: 7bit\r\n\r\n<strong>some random text</strong>\r\n----_NmP-179a735428ca7575-Part_2--\r\n\r\n----_NmP-179a735428ca7575-Part_1\r\nContent-Type: text/plain; name=text1.txt\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=text1.txt\r\n\r\naGVsbG8gd29ybGQh\r\n----_NmP-179a735428ca7575-Part_1--\r\n",
  "dkim": {
    "headerFrom": [
      "random@o3o.ca"
    ],
    "envelopeFrom": "test@example.net",
    "results": [
      {
        "status": {
          "result": "none",
          "comment": "message not signed"
        },
        "info": "dkim=none (message not signed)"
      }
    ]
  },
  "spf": {
    "domain": "example.net",
    "client-ip": "127.0.0.1",
    "helo": "user.oem.local",
    "envelope-from": "test@example.net",
    "status": {
      "result": "none",
      "comment": "mx1.forwardemail.net: example.net does not designate permitted sender hosts",
      "smtp": {
        "mailfrom": "test@example.net",
        "helo": "user.oem.local"
      }
    },
    "header": "Received-SPF: none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) client-ip=127.0.0.1;",
    "info": "spf=none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) smtp.mailfrom=test@example.net smtp.helo=user.oem.local",
    "lookups": {
      "limit": 50,
      "count": 1
    }
  },
  "arc": {
    "status": {
      "result": "none"
    },
    "i": 0,
    "authResults": "mx1.forwardemail.net;\r\n dkim=none (message not signed);\r\n spf=none (mx1.forwardemail.net: example.net does not designate permitted sender hosts) smtp.mailfrom=test@example.net smtp.helo=user.oem.local;\r\n dmarc=none header.from=o3o.ca;\r\n bimi=skipped (DMARC not enabled)"
  },
  "dmarc": {
    "status": {
      "result": "none",
      "header": {
        "from": "o3o.ca"
      }
    },
    "domain": "o3o.ca",
    "info": "dmarc=none header.from=o3o.ca"
  },
  "bimi": {
    "status": {
      "header": {},
      "result": "skipped",
      "comment": "DMARC not enabled"
    },
    "info": "bimi=skipped (DMARC not enabled)"
  },
  "recipients": [
    "webhook1@webhooks.net"
  ],
  "session": {
    "remoteAddress": "127.0.0.1",
    "remotePort": 65138,
    "clientHostname": "[127.0.0.1]",
    "hostNameAppearsAs": "user.oem.local",
    "sender": "test@example.net",
    "mta": "mx1.forwardemail.net",
    "arrivalDate": "2022-05-25T19:26:41.423Z",
    "arrivalTime": 1653506801423
  }
}

是的,自 2021 年 9 月 27 日起,我们已添加此功能。您可以简单地编写正则表达式(“regex”)来匹配别名和执行替换。

正则表达式支持的别名是以 a 开头的别名 / 并以 / 他们的收件人是电子邮件地址或 webhook。收件人还可以包括正则表达式替换支持(例如 $1, $2).

我们支持两个正则表达式标志,包括 ig.不区分大小写的标志 i 是永久默认值,并且始终强制执行。全球旗帜 g 可以通过添加结尾来添加 //g.

请注意,我们也支持我们的 禁用别名功能 对于我们的正则表达式支持的收件人部分。

不支持正则表达式 全局虚域 (因为这可能是一个安全漏洞)。

增强的隐私保护: 如果您使用的是付费计划(具有增强的隐私保护功能),请访问 我的帐户 并单击您的域旁边的“别名”以配置正则表达式。如果您想了解有关付费计划的更多信息,请参阅我们的 价钱 页。否则,您可以继续按照以下说明进行操作。

如果您使用的是免费计划,那么只需添加一个新的 DNS TXT 使用以下提供的一个或多个示例进行记录:

简单示例: 如果我希望所有发送到 `linus@o3o.ca` 或 `torvalds@o3o.ca` 的电子邮件都转发到 `user@gmail.com`:
名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=/^(linus|torvalds)$/:user@gmail.com
名字姓氏替换示例: 想象一下,您公司的所有电子邮件地址都是“firstname.lastname@o3o.ca”模式。如果我希望所有使用 `firstname.lastname@o3o.ca` 模式的电子邮件转发到 `firstname.lastname@company.com` 并支持替换(在 RegExr 上查看测试):
名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=/^([A-Za-z]+)+\.([A-Za-z]+)+$/:$1.$2@company.com
加号过滤替换示例: 如果我希望所有发往 `info@o3o.ca` 或 `support@o3o.ca` 的电子邮件分别转发到 `user+info@gmail.com` 或 `user+support@gmail.com`(支持替换) (在 RegExr 上查看测试):
名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=/^(support|info)$/:user+$1@gmail.com
Webhook 查询字符串替换示例: 也许您希望发送到“o3o.ca”的所有电子邮件都发送到 网络钩子 并有一个动态查询字符串键“to”,其值为电子邮件地址的用户名部分(在 RegExr 上查看测试):
名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=/^(.*?)$/:https://o3o.ca/webhook?username=$1
禁用示例: 如果您希望禁用与特定模式匹配的所有电子邮件(请参阅 我可以禁用特定的别名吗),然后只需使用带有感叹号“!”的相同方法:
名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=/^(linus|torvalds)$/:!
小费: 好奇如何编写正则表达式或需要测试您的替换?你可以去免费的正则表达式测试网站 正则表达式https://regexr.com.

不,不建议这样做,因为您一次只能使用一个邮件交换服务器。由于优先级错误配置和邮件服务器不遵守 MX 交换优先级检查,通常不会重试回退。

重要的: If you are on a paid plan, then you must go to 我的帐户 别名 编辑别名 Uncheck "Active" checkbox Continue.

是的!自 2020 年 2 月 6 日起,我们已添加此功能。只需编辑您的 DNS TXT 记录并在别名前加上感叹号。请注意,您必须保留“:”映射,因为如果您决定关闭它(并且它也用于在我们的付费计划中导入),这是必需的。

如果在别名前加上“!” (感叹号)然后它仍然会向尝试发送到此地址的发件人返回成功的响应代码,但电子邮件本身将无处可去;到一个黑洞。

发送到禁用地址的电子邮件将以 SMTP 响应状态代码 250(已接受)进行响应,但电子邮件实际上不会传递给收件人。

例如,如果我想要所有发往 alias@o3o.ca 停止流过 user@gmail.com:

名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=!alias:user@gmail.com
小费: 您还可以将转发收件人的地址重写为简单的“nobody@forwardemail.net”,这会将其路由到任何人,如下例所示。
名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=!alias:nobody@forwardemail.net
小费: 如果您想提高安全性,您还可以删除“:user@gmail.com”(或“:nobody@forwardemail.net”)部分,只留下“!alias”,如下例所示。
名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=!alias

是的,一点没错。只需在您的 TXT 记录。

例如,如果我想要一封电子邮件 hello@o3o.ca 转发给 user+a@gmail.comuser+b@gmail.com,那么我的 TXT 记录看起来像这样:

名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=hello:user+a@gmail.com,hello:user+b@gmail.com

或者,您可以在两个单独的行中指定它们,例如:

名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=hello:user+a@gmail.com
“@”、“.”或空白 3600 TXT forward-email=hello:user+b@gmail.com

由你决定!

是的你可以。只需在您的 TXT 记录。

例如,如果我想要每封电子邮件 *@o3o.ca (星号表示它是通配符,又名包罗万象)被转发到 user+a@gmail.comuser+b@gmail.com,那么我的 TXT 记录看起来像这样:

名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=user+a@gmail.com,user+b@gmail.com

或者,您可以在两个单独的行中指定它们,例如:

名称/主机/别名 TTL 类型 答案/值
“@”、“.”或空白 3600 TXT forward-email=user+a@gmail.com
@、“.”或空白 3600 TXT forward-email=user+b@gmail.com

由你决定!

是的,默认限制为 10。这并不意味着您的域名只能有 10 个别名。您可以拥有任意数量的别名(数量不限)。这意味着您只能将一个别名转发给 10 个唯一的电子邮件地址。你可以有 hello:user+1@gmail.com, hello:user+2@gmail.com, hello:user+3@gmail.com, … (从 1-10) – 以及任何发往 hello@o3o.ca 会被转发到 user+1@gmail.com, user+2@gmail.com, user+3@gmail.com, ...(从 1-10)。

小费: 每个别名需要超过 10 个收件人?给我们发送电子邮件,我们很乐意增加您的帐户限额。

是的,您可以,但是您仍然必须遵守最高限额。如果你有 hello:linus@o3o.calinus:user@gmail.com,然后发送电子邮件至 hello@o3o.ca 会被转发到 linus@o3o.causer@gmail.com.请注意,如果您尝试递归转发电子邮件,则会引发错误。

我们使用 MX 和 TXT 记录验证,因此如果您添加此服务的相应 MX 和 TXT 记录,然后你就注册了。如果您删除它们,那么您将被取消注册。您拥有您的域和 DNS 管理的所有权,所以如果有人可以访问它,那就是个问题。

由于升级到付费计划的用户,该服务继续运行。我们希望为使用闭源转发服务(并随后冒着隐私和安全风险)的人们提供免费的替代方案。

我们默认为 50MB 大小限制,其中包括内容、标题和附件。请注意,Gmail 和 Outlook 等服务仅允许 25MB 的大小限制,如果您在向这些提供商的地址发送邮件时超出限制,您将收到一条错误消息。

如果超出文件大小限制,则会返回带有正确响应代码的错误。

不,绝对不是。查看我们的 隐私政策.

不,绝对不是。查看我们的 隐私政策.

不,绝对不是。我们不存储 SMTP 日志。查看我们的 隐私政策.

许多其他电子邮件转发服务存储并可能阅读您的电子邮件。转发的电子邮件没有理由需要存储到磁盘存储中——因此我们构建了第一个在内存中完成所有操作的开源解决方案。

我们认为您应该拥有隐私权,我们严格尊重它。部署到服务器的代码是 GitHub 上的开源软件 透明度和建立信任。

是的,一点没错。

是的,一点没错。而不是使用“@”、“.”或空白作为名称/主机/别名,您只需使用子域名作为值。

如果你想 foo.o3o.ca 转发电子邮件,然后输入 foo 作为 DNS 设置中的名称/主机/别名值(对于 MX 和 TXT 记录)。

是的,一点没错。

是的,它有编写的测试 阿瓦 并且还具有代码覆盖率。

是的,一点没错。例如,如果您要发送电子邮件至 hello@o3o.ca 它已注册转发到 user@gmail.com,然后将返回来自“gmail.com”SMTP 服务器的 SMTP 响应消息和代码,而不是“mx1.forwardemail.net”或“mx2.forwardemail.net”的代理服务器。

您应该取消订阅电子邮件列表(如果可能)并阻止发件人。

请不要将邮件报告为垃圾邮件,而是将其转发到我们手动策划和以隐私为中心的滥用预防系统。

将垃圾邮件转发到的电子邮件地址是: 滥用@forwardemail.net

是的!自 2018 年 10 月 2 日起,我们已添加此功能。看 如何使用 Gmail 发送邮件 以上!

您还应该在 DNS 配置中为 Gmail 设置 SPF 记录 TXT 记录。

重要的: 如果您使用的是 Gmail(例如 Send Mail As)或 G Suite,那么您需要附加 include:_spf.google.com 到你的 SPF TXT 记录,例如:

v=spf1 a mx include:spf.forwardemail.net include:_spf.google.com -all

是的!自 2018 年 10 月 2 日起,我们已添加此功能。只需查看下面来自 Microsoft 的这两个链接:

您还应该在 DNS 配置中为 Outlook 设置 SPF 记录 TXT 记录。

重要的: 如果您使用的是 Microsoft Outlook 或 Live.com,则需要附加 include:spf.protection.outlook.com 到你的 SPF TXT 记录,例如:

v=spf1 a mx include:spf.forwardemail.net include:spf.protection.outlook.com -all

不幸的是,无论您使用哪种服务,Apple 都不允许这样做。但是,您可以将邮件应用程序与您域的电子邮件帐户一起使用。

是的,但是“相对未知”的发件人的速率限制为每个主机名或 IP 每小时 1,000 个连接。请参阅关于 速率限制灰名单 以上。

“相对未知”是指未出现在 白名单.

如果超出此限制,我们将发送“421”响应代码,告知发件人邮件服务器稍后重试。

如果您使用的是 Gmail,请按照以下步骤操作:

  1. https://google.com 并退出所有电子邮件帐户
  2. 单击“登录”,然后在下拉菜单中单击“其他帐户”
  3. 选择“使用另一个帐户”
  4. 选择“创建帐户”
  5. 选择“改用我当前的电子邮件地址”
  6. 输入您的自定义域名电子邮件地址
  7. 检索发送到您的电子邮件地址的验证电子邮件
  8. 输入此电子邮件中的验证码
  9. 为您的新 Google 帐户填写完整的个人资料信息
  10. 同意所有隐私和使用条款政策
  11. https://google.com 在右上角,单击您的个人资料图标,然后单击“更改”按钮
  12. 为您的帐户上传新照片或头像
  13. 更改大约需要 1-2 小时才能传播,但有时可能会很快。
  14. 发送测试电子邮件,个人资料照片应该会出现。

免费计划要求您使用公共 DNS 记录来存储您的转发配置。如果您使用的是免费计划,任何拥有计算机的人都可以在终端中查找您的转发配置。与免费计划不同,增强保护计划使用加密生成的随机字符串来私下存储您的转发配置。

免费计划加强保障计划
forward-email=user@gmail.comforward-email-site-verification=m8d7o8K4Il

是的。我们在所有计划中都内置了对 SPF、DKIM、DMARC、ARC 和 SRS 的支持。我们还与这些规范的原作者和其他电子邮件专家进行了广泛的合作,以确保完美和高可交付性。

是的。无论您采用哪种计划,您只需支付一个月费率——涵盖您的所有域。

我们接受使用卡、钱包和银行转账 条纹贝宝 – 一次性付款或按月、按季或按年订阅。

不会。价格永远不会上涨。与其他公司不同,我们也永远不会关闭我们的服务。

我们使用 CloudFlare 的隐私优先消费者 DNS 服务(请参阅 公告在这里)。我们设置 1.1.1.31.0.0.3 作为 DNS 服务器(请参阅 https://developers.cloudflare.com/1.1.1.1/1.1.1.1-for-families/) 使用 /etc/resolv.conf 在我们的服务器和测试环境上。