
让我们深入了解如何为 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 连接器
Signals 配置在 5.0 用户指南第10.1节中描述。在这里,我们将从“Use Case #2”开始,启用此 PowerMTA 主机的所有流量的 Signals,并启用 SparkPost 售票跟踪。
# # SparkPost Signals # <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 (US): https://api.sparkpost.com/api/v1/ingest/events
SparkPost EU: https://api.eu.sparkpost.com/api/v1/ingest/events
log-verbose
此指令是可选的,启用后会在 pmta.log 文件中提供更多信息,这在设置期间确认一切正常时很有用。每分钟,即使没有流量,您也会看到:
2019-07-26 11:47:57 Signals: Discovered 0 files
有流量时,您会看到类似这样的内容:
2019-07-26 11:50:57 Signals: Discovered sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals: Transferred sp1-0000000000003FBD.json successfully. 2019-07-26 11:50:57 Signals: Discovered 1 file, transferred 1 file successfully
min-free-space
这告诉 PowerMTA 当磁盘空间不足时应开始删除最旧的 SparkPost JSON 事件文件以为新文件腾出空间。
enable-signals
这告诉 PowerMTA 上传到 Signals,在这种情况下,全局应用于所有流量(更多信息 这里, 对于 v5.0)。您可以根据自己的喜好更加选择性地选择上传的流量。
您还可以将特定的 PowerMTA 流量标记为属于 SparkPost 子帐户——这是一种区分特定流量流的方法。
engagement-tracking, customer-id
PowerMTA 的参与跟踪解决方案默认使用 SparkPost US 托管服务的跟踪域。您会指定您的 SparkPost 数字客户 ID;这是 找到它的说明.
tracking-domain
对于 SparkPost EU 帐户,添加以下行:
tracking-domain pmta.eu.spgo.io #这是 SparkPost EU 的端点
Custom Tracking domain
如果您希望使用自己的跟踪域(从可交付性方面来看更好),请执行以下操作:
通过创建 CNAME 记录在您的 DNS 提供商处创建跟踪域。这通常是顶级域的子域,例如 track.mycompany.com .
track.mycompany.com CNAME pmta.spgo.io #如果您有一个 SparkPost US 帐户 track.mycompany.com CNAME pmta.eu.spgo.io #如果您有一个 SparkPost EU 帐户
您也可以使用 HTTPS 跟踪域,尽管这更复杂(请参阅 SparkPost 配置步骤以获取 HTTPS 跟踪域)。
在您的 SparkPost 账户中注册跟踪域,并验证它。在尝试之前等待几分钟,以允许您的 DNS 更改传播到互联网,这取决于您的 DNS 提供商。
配置 PowerMTA 以使用该域而不是默认域
tracking-domain yourdomain.com # 将您自己的域放在这里
您可以通过查看邮件的内部(在 Gmail 中使用菜单右上角并选择“显示原始邮件”)来检查已发送邮件是否添加了“打开像素”和链接是否被包装。

您会注意到电子邮件 HTML 的开头和结尾有打开的像素。每个 HTML 链接也被更改为 REF 指向跟踪域。

这就是让 SparkPost Signals 在 PowerMTA 内置参与跟踪中工作的所有内容。
防止 html 电子邮件中的特定链接被追踪
您可以通过将自定义属性 data-msys-clicktrack 设置为“0”来防止 PowerMTA 追踪特定链接:
<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用于注入消息,这些消息将通过公用Internet从另一台主机发送过来。为了防止不法分子发现和滥用此服务,我们应用用户名/密码认证和可选的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域(也称为退信域或返回路径:)。
# # 重写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测试工具swaks检查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处理 # relay-domain pmta.signalsdemo.trymsys.net relay-domain bounces.pmta.signalsdemo.trymsys.net relay-domain fbl.pmta.signalsdemo.trymsys.net <bounce-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain pmta.signalsdemo.trymsys.net domain bounces.pmta.signalsdemo.trymsys.net </address-list> </bounce-processor> <feedback-loop-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain fbl.pmta.signalsdemo.trymsys.net </address-list> </feedback-loop-processor>
您可以看到我设置了两个回弹域,因为我正在尝试使用/不使用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>、双引号“”和反引号`,以及所有超过~的字符都被映射为下划线。