从您客户的域名发送电子邮件
如果你正在构建一个多租户应用(服务台、CRM 或任何代表客户发送电子邮件的平台),你最终会遇到一个问题:邮件应该从你的域还是他们的域发出?处理不当,邮件会以550 sender is unacceptable的错误退回。以下是在 MailerToGo 上行之有效的模型。
两种方法
1. 平台发件人(推荐的起点)
从你自己的域发送(例如support@yourapp.com),并将客户地址放在Reply-To字段中。它立即生效,不需要客户进行任何 DNS 设置,并且让你完全控制可送达性。这是 Zendesk、Intercom 和大多数 SaaS 服务台默认采用的方式。
- From:
support@yourapp.com(或每个租户专属的support@acme.yourapp.com) - Reply-To:
support@customerdomain.com - 权衡: 收件人在发件人行中看到的是你的品牌,而不是客户的。
2. 客户域(更好的品牌和可送达性)
为客户的域配置一个 DKIM 密钥,以便邮件以他们的身份签名。这需要客户添加 DNS 记录,但它提供品牌一致性,一旦 DKIM 和 DMARC 在其自己的域上对齐,可送达性也会更好。
- From:
support@customerdomain.com,使用其 DKIM 密钥签名 - 权衡: 需要客户在你能够发送之前采取 DNS 操作。
大多数平台提供两者:让每个新租户从平台发件人开始,当他们准备好时,允许客户升级到自己的域。
如果你跳过 DKIM 配置会发生什么
这是陷阱所在。如果你的应用从一个在 MailerToGo 上没有配置 DKIM 密钥的客户域发送,会发生以下两件事之一:邮件被拒绝(550 sender is unacceptable),或者信封发件人被重写到你的默认域作为后备。
这两种情况都不是可以构建的基础。拒绝意味着客户邮件被丢弃。无声的信封重写意味着你的 DMARC 对齐会悄悄破裂。我们在实际情况中看到过这个确切的失败:一个应用以info@customerdomain.com发送,没有配置 DKIM,每条邮件都以550 sender is unacceptable退回。
不要依赖后备方案。在你自己的代码中决定发件人。
推荐的模式:自己选择发件人
跟踪每个客户其发送域是否在 MTG 上验证。相应地选择MAIL FROM,未验证时回退到你的平台域:
# Ruby
PLATFORM_DOMAIN = "yourapp.com"
def sender_for(customer)
if customer.sending_domain_verified?
{ from: "support@#{customer.domain}" } # 以他们的身份签名
else
{ from: "support@#{PLATFORM_DOMAIN}", # 你的域
reply_to: customer.support_address } # 回复仍然到达他们
end
end
// Node
const PLATFORM_DOMAIN = "yourapp.com";
function senderFor(customer) {
return customer.sendingDomainVerified
? { from: `support@${customer.domain}` }
: { from: `support@${PLATFORM_DOMAIN}`, replyTo: customer.supportAddress };
}
需要正确处理的几件事:
sending_domain_verified?是一个你的应用拥有的标志。一旦在 MTG 上确认了客户的 DKIM,就设置它;不要在每次发送时重新检查验证。- 始终在平台发送的邮件上设置
Reply-To,以便回复到达客户。 - 从不在你未确认已配置的域上构造 From。
配置客户的域
当客户想要以自己的域发送邮件时:
- 在 MailerToGo 上添加发送子域。 使用专用子域,如
mtg.customerdomain.com,而不是根域。它隔离了发送声誉,是 MTG 构建的模式。参见为什么 MailerToGo 从 mtg.yourdomain.com 发送。 - 让客户发布 DNS 记录。 最简单的方法是一条委派的
NS记录:MTG 随后为该子域管理 SPF、DKIM 和 DMARC。如果客户倾向于拥有记录,也支持手动方法,自己发布 SPF、DKIM 和 DMARC TXT 记录。参见使用子域发送电子邮件。 - 验证,然后切换标志。 一旦 MTG 报告域已验证,为该客户设置
sending_domain_verified = true并开始以其域发送。
直到第 3 步完成,保持客户使用你的平台发件人。新租户从第一天就可以发送,并且可以无停机时间升级到自己的域。
总结
- 让每个租户从你的平台域开始(
support@yourapp.com加Reply-To)。它就是能用。 - 通过配置 DKIM 让客户升级到自己的域,最好是通过委派的 NS 记录在
mtg.发送子域上。 - 从每个客户的”域已验证”标志在你的代码中选择发件人。从不从未配置的域发送并希望后备方案能救你。它不会。