
让我们深入了解如何为 SparkPost Signals 设置 PowerMTA 的细节。
让我们深入了解为 SparkPost Signals 设置 PowerMTA 的详细信息。您需要:
一个用于运行最新版本 PowerMTA 的主机 - 可以是新机器,也可以是现有机器
一个具有“Incoming Events: Write”API 密钥权限的 SparkPost 账户 具体描述请见此处
我们将设置 PowerMTA 以将事件流传输到您的 SparkPost 账户,然后您即可使用以下功能:
首先,按照 常规 v5.0 安装说明安装(或升级)到 PowerMTA 5.0 r4 或更高版本,这些步骤都相当简单。然后我们将按以下步骤操作:
配置 PowerMTA 连接到 SparkPost Signals
设置具有自定义跟踪域的 Engagement Tracking
选择要报告给 Signals 的 PowerMTA 流量流
测试您的事件是否到达 Signals
查看如何使用在报告中显示效果良好的有意义名称。
我们还将介绍在 Signals 演示中使用的其他特定 PowerPMTA 设置方面:
FBL 事件(垃圾邮件投诉)和远程(带外)反弹
包括 DKIM 的注入配置
FBL 和 OOB 配置
VirtualMTA 设置和命名(以及这如何出现在您的 SparkPost Signals 报告中)
最后,提供一个“额外功能”,其中包含确保您的活动名称与 PowerMTA X-Job 名称约定兼容的代码。
配置 PowerMTA 连接器
信号配置在5.0 用户指南第 10.1 节中有描述。在这里,我们将从“用例 #2”开始,该用例使该 PowerMTA 主机的所有流量启用 Signals,并启用 SparkPost 参与追踪。
# # SparkPost 信号 # <signals> api-key ##my ingest API key here## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # 这开启了 PowerMTA 中的打开和点击追踪 customer-id 123 # 这里填写您的 SparkPost 帐号编号 </signals> enable-signals true
以下是每个属性的作用:
api-key
这是唯一的与您的 SparkPost 帐户有关的值,是您之前从 SparkPost 获得的。
upload-url
此地址需与您的 SparkPost API 服务地址匹配,无论是美国还是欧盟。欲了解更多信息,请查看此处。常见的值是:
SparkPost(美国):https://api.sparkpost.com/api/v1/ingest/events
SparkPost 欧盟: https://api.eu.sparkpost.com/api/v1/ingest/events
log-verbose
这个指令是可选的,启用后,会在 pmta.log 文件中提供更多信息,在设置期间确认一切正常时可能会有所帮助。即使没有流量,每分钟您都会看到:
2019-07-26 11:47:57 信号:发现了 0 个文件
有流量时,您会看到类似的东西:
2019-07-26 11:50:57 信号:发现了 sp1-0000000000003FBD.json 2019-07-26 11:50:57 信号:成功传输 sp1-0000000000003FBD.json 2019-07-26 11:50:57 信号:发现 1 个文件,成功传输 1 个文件
min-free-space
这告诉 PowerMTA 在磁盘空间不足时应该开始删除最早的 SparkPost JSON 事件文件以便为新文件腾出空间。
enable-signals
这告诉 PowerMTA 上传至 Signals,在此情况下,全球所有流量(更多信息在5.0 版本中)。如果需要,您可以更有选择性地决定上传哪些流量流。
您也可以标记特定的 PowerMTA 流量被报告为属于 SparkPost 子账户— 这是一种区分不同流量流的方式。
engagement-tracking, customer-id
PowerMTA 的 Engagement Tracking 解决方案默认为 SparkPost 美国托管服务的追踪域。您需指定您的 SparkPost 数字客户 ID;这里有查找它的说明。
tracking-domain
对于 SparkPost 欧盟账户,添加以下行:
tracking-domain pmta.eu.spgo.io # 这是 SparkPost 欧盟的端点
自定义追踪域
如果您希望使用自己的追踪域(从可投递性角度来看,这更好),请执行以下操作:
通过创建 CNAME 记录在您的 DNS 提供商处创建追踪域。通常这是您顶级域的子域,例如 track.mycompany.com 。
track.mycompany.com CNAME pmta.spgo.io # 如果您有 SparkPost 美国账户 track.mycompany.com CNAME pmta.eu.spgo.io # 如果您有 SparkPost 欧盟账户
您也可以使用 HTTPS 追踪域,尽管这涉及更多步骤(参见 SparkPost 配置步骤 此处)。
在您的 SparkPost 帐户中注册追踪域,并验证它。等待几分钟后再尝试此操作,以允许您的 DNS 更改通过互联网传播,这取决于您的 DNS 提供商。
配置 PowerMTA 使用该域而不是默认域,使用
tracking-domain yourdomain.com # 在此输入您自己的域名
您可以通过查看邮件的内部(在 Gmail 中,使用菜单右上角,选择“显示原始邮件”),确认您的已投递电子邮件已添加了“打开像素”,且链接已封装。

您会注意到 HTML 邮件的开头和末尾有打开像素。每个 HTML 链接也会被更改以使 REF 指向追踪域。

这就是您所需的一切,以便让 SparkPost 信号与 PowerMTA 的内置 Engagement Tracking 一起工作。
防止追踪您 HTML 电子邮件中的特定链接
您可以防止 PowerMTA 追踪特定链接,通过将自定义属性 data-msys-clicktrack 设置为“0”:
<a href="#" data-msys-clicktrack="0">Example</a>
PowerMTA 将不会封装该链接。在将消息传递给您的收件人之前,它还会移除该属性。
选择要向Signals报告的PowerMTA流量流
测试您的事件是否到达Signals
这是 SparkPost Signals 的视图,连接到 PowerMTA。您可以看到健康评分在变化。

活动名称可作为报告方面提供,以及子账户、IP 池、邮箱提供商和发送域。
除了查看 PowerMTA 日志之外,您还可以通过查看 Signals 集成屏幕来检查事件数据是否正在到达 SparkPost。

在您的 SparkPost Events 搜索屏幕中,您应该在几分钟内看到事件出现。这些将包括 Injection 和 Delivery 事件,以及 Bounce,可能还有 Out-of-Band Bounce 和 Spam Complaint 事件,如果您已经配置了 PowerMTA 来为您处理这些事件。
如果您启用了参与度跟踪,您还会看到 open、initial_open 和 click 事件。
使用在报告中显示良好的有意义名称
设置 PowerMTA VirtualMTA 池名和作业名称,使其具有意义且易于阅读,是非常值得的。这些会直接显示在您的 SparkPost Signals 方面和摘要报告中。
如前所述,您不需要在您的 SparkPost 帐户中创建这些池。SparkPost 会从您的 PowerMTA 配置中获取它们。
以下是 PowerMTA 配置术语如何转化为 SparkPost 术语。
PowerMTA 术语SparkPost Reports / Signals 术语接收域名
(会计文件中 “rcpt” 字段的域部分)。接收域名PowerMTA 转送的消息中的 “Sender” 或 “From” 标头的域部分。
(会计文件中 “orig” 的域部分)。发送域名VirtualMTA(名称)—VirtualMTA 池(名称)
(会计文件中的 “vmtaPool”)IP 池(名称)smtp-source-host a.b.c.d
(会计文件中的 “dlvSourceIp”)发送 IP a.b.c.d作业(名称)
(会计文件中的 “jobId”)活动 ID(名称)—模板(名称)“Subaccount” 不是 PowerMTA 的本地概念。
但是,PowerMTA 可以标记 virtualMTAs、virtual MTA 池或发件人或发件域,以用于 SparkPost 报告目的。
子帐户 ID(号码)FBL (事件) 垃圾邮件投诉 (事件) 远程退回 (事件) 带外退回 (事件)
设置至少一个 smtp-source-host 地址还可以使 SparkPost 正确识别发送 IP 地址,以便它显示在注入和传递事件中,以及在摘要报告视图中。
作业名称通过 PowerMTA 在注入消息中的标头设置。除了启用单个作业控制(暂停/恢复等)之外,这本身就非常有用,PowerMTA 还通过“活动 ID”将名称传递给 SparkPost Signals 报告。请参阅用户指南 v5.0 部分 12.8 "Tracking a campaign in PowerMTA with a JobID"。
关于作业命名,有几点需要注意。虽然 SparkPost(使用 JSON 格式和 JSON 转义)允许在活动名称中使用诸如 <SPACE> 之类的字符,但邮件标头更具限制性。X-Job 标头中允许的有效字符包括:
A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~
换句话说,禁止的字符包括 <SPACE>、双引号 “ 和反引号 `。如果您习惯于使用 X-Job 名称,这并不会让人惊讶,您的活动 ID 名称将在 SparkPost 报告中“正常工作”。如果像我一样,您先学习了 SparkPost,您可能需要一个工具来确保 X-Job 值是安全的;请参阅本文末尾的奖励功能。
FBL 事件 (Spam Complaints) 和远程 (out-of-band) bounces
Injection 配置
我们将使用端口587来注入消息,这些消息将通过公共互联网从另一个主机传入。我们需要防止恶意行为者发现并滥用此服务,因此我们应用了用户名/密码验证和可选的TLS,与SparkPost SMTP注入端点类似。
我们希望能够从经过适当验证的来源发送消息至任何目的地。我们还希望在端口25上设置一个单独的侦听器,用于FBL和不需要验证的远程退信响应。
# # 监听传入SMTP连接的IP地址和端口 # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25
在以下<source>声明中,我们使用用户名/密码验证和可选的TLS来防范恶意消息注入。我们还对尝试失败的密码连接设置了速率限制。
您的设置可能有所不同;例如,如果您在注入器和PowerMTA之间有一个私有网络,则不需要密码验证。
# 单一来源规则适用于所有注入,内部或外部。强制验证,但退信和FBL例外 # <source 0/0> log-connections false log-commands false # 警告:详细!仅用于开发 log-data false # 警告:更加详细! smtp-service true # 允许SMTP服务 smtp-max-auth-failure-rate 1/min allow-unencrypted-plain-auth false allow-starttls true rewrite-list mfrom </source> <source {auth}> always-allow-relaying yes # 仅在验证成功时 default-virtual-mta default process-x-job true </source>
<source {auth}>声明(请参阅此处. v5.0)在身份验证通过后适用。在这里,它允许转发中继,设置默认虚拟MTA组使用,并添加X-Job头(这将在SparkPost Signals中报告为campaign_id)。
重写列表将注入的消息映射到使用特定MAIL FROM域名(也称为退信域名或Return-Path:)。
# # 将MAIL FROM地址重写为匹配退信域名 # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
然后我们根据TLS配置和SMTP用户名/密码设置,根据当前建议进行配置。
# # 使用用户名、密码和TLS保护入站服务。SMT 2020-06-15 # smtp-server-tls-certificate /etc/pmta/pmtasignalsdemo.pem smtp-server-tls-allow-tlsv1 false smtp-server-tls-allow-tlsv1.1 false smtp-server-tls-allow-tlsv1.2 true smtp-server-tls-allow-tlsv1.3 true # # SMTP用户(通过SMTP AUTH验证)# <smtp-user SMTP_Injection> password ##PUT YOUR PASSWORD HERE## authentication-method password </smtp-user>
我们可以使用我喜欢的SMTP测试工具检查不接受(不安全,已弃用)的TLS v1.0。
swaks --server pmta.signalsdemo.trymsys.net --port 587 --to test@trymsys.net --from any@sparkpost.com --tls --tls-protocol tlsv1
我们看到:
*** TLS启动失败 (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS 尝试但失败
同样适用于 –tls-protocol tlsv1_1。
让我们对传出的消息应用DKIM签名,因为这是个好习惯(我遵循这些指示来设置密钥)。
# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem
FBL 和 OOB 配置
现在..终于..我们声明哪些特定域对远程退回和FBL响应开放。我们不想在任何地方中继这些(以防止反向散射攻击),只是内部处理这些响应。
# # 为特定域启用退回和FBL处理 # 中继域 pmta.signalsdemo.trymsys.net 中继域 bounces.pmta.signalsdemo.trymsys.net 中继域 fbl.pmta.signalsdemo.trymsys.net <退回处理器> 交付未匹配的电子邮件 否 交付匹配的电子邮件 否 <地址列表> 域 pmta.signalsdemo.trymsys.net 域 bounces.pmta.signalsdemo.trymsys.net </地址列表> </退回处理器> <反馈回路处理器> 交付未匹配的电子邮件 否 交付匹配的电子邮件 否 <地址列表> 域 fbl.pmta.signalsdemo.trymsys.net </地址列表> </反馈回路处理器>
你可以看到我设置了两个退回域,因为我正在尝试使用/不使用 mfrom 重写规则。
FBL域通常会注册到外部服务,如Microsoft SNDS; 有关更多信息,请参阅这篇文章。在这个演示中,FBL将来自Bouncy Sink,因此无需注册。
测试 SMTP listener
重要的是要测试您的SMTP监听器是否要求对任何一般目的地进行授权,并拒绝任何未明确发送到FBL和远程反弹域的消息。
swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com
响应,如预期所示,显示转发被拒绝:
550 5.7.1 对"RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>"中的接收者拒绝转发
(演示设置描述结束)。
VirtualMTA 设置和命名
PowerMTA VirtualMTAs (和 VirtualMTA pools) 是用于管理消息流的强大功能,并且 PowerMTA / SparkPost Signals 报告功能在这些功能激活时效果最佳。
# # 通过此虚拟 mta / pool 路由所有外发流量。# 在此处声明投递 IP 地址,以便 SparkPost signals 接收注入 (又名 "reception") 事件 # 将携带正确的 sending_IP 属性 # <virtual-mta mta1> smtp-source-host 172.31.25.101 pmta.signalsdemo.trymsys.net </virtual-mta> <virtual-mta-pool default> virtual-mta mta1 <domain *> max-smtp-out 20 # 每个域的最大连接数 bounce-after 4d12h # 4 天, 12 小时 retry-after 10m # 10 分钟 dkim-sign yes </domain> </virtual-mta-pool>
虚拟 mta-pool 设置在 SparkPost 中报告为“IP Pool”,并作为 SparkPost Signals 报告的一个方面可用(图表下方的下拉菜单)。

汇总报告还显示 IP Pool 作为“Group By”报告的一个方面。

如本文前面所述,设置至少一个 smtp-source-host 地址还使 SparkPost 能够正确识别发送 IP 地址,以便在注入和传递事件以及汇总报告中显示:

这就是您在 PowerMTA 和 SparkPost Signals 之间实现基本集成所需的一切。您可以在这里查看完整的配置文件示例。
在您离开之前,这是我提到的额外功能。
Bonus feature: X-Job 名称检查/过滤
为了确保任何字符字符串都可以安全地用作PowerMTA X-Job名称,这里有一个简单的Python函数,用于将任何不安全的字符映射为下划线“_”。
import re def pmtaSafeJobID(s): """ :param s: str :return: str 将任意活动ID字符串映射为PMTA X-Job标题允许的字符。 参见https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid 不允许使用 <sp> " `,但允许使用大多数其他字符。 """ # 请注意,需要转义 ' - [ ] 并双重转义 \ - 参见https://docs.python.org/3/library/re.html disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]' return re.sub(disallowedChars, '_', s)
这以一种特定的方式使用Python正则表达式。 它使用“集补”运算符^来声明不允许字符的集合,而不是列出所有允许的字符。 这意味着我们可以捕获(并使其安全)超出通常7位集合的字符。 我们可以通过以下测试片段显示这一点:
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
得到
_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcdefghijkl mnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________
您可以看到 <SPACE>、双引号“”和反引号`,以及所有超过~的字符都被映射为下划线。