在本地部署信号:PowerMTA 集成
鸟
2019年8月30日
电子邮件
1 min read

关键要点
目的:本指南解释了如何将PowerMTA 5.0+与SparkPost Signals集成,以便将事件和参与数据(退信、打开、点击、垃圾邮件投诉)从本地MTAs直接流入SparkPost分析层。
核心配置:
添加enable-signals true并定义您的SparkPost ingest endpoint(https://api.sparkpost.com/api/v1/ingest/events或EU等效端点)。
使用具有“Incoming Events: Write”权限的有效API key。
指定customer-id,并可选地设置自定义跟踪域以改善投递能力。
跟踪设置:PowerMTA的Engagement Tracking会自动将打开和点击像素注入HTML邮件中。您可以使用data-msys-clicktrack="0"属性来逐链接禁用跟踪。
选择性报告:Signals可以在全球范围内启用,也可以仅限于某些VirtualMTAs、池或发件人域,以实现精细的数据控制。
测试与验证:使用Signals Integration仪表板和PowerMTA日志来确认事件摄取,并实时跟踪Health Scores、退信和参与度指标。
投递调优:
使用有意义的VirtualMTA和Job名称——这些名称直接映射到SparkPost报告中的IP Pools和Campaign IDs。
配置DKIM签名、TLS强制和适当的中继规则以防止未经授权的注入。
高级设置:本文还包括适用于FBL & out-of-band bounce handling、authenticated SMTP injection (port 587)的现成代码片段,以及用于X-Job头清理以确保兼容的Python代码。
Q&A 精华
Signals 集成实际有什么作用?
它会自动将 PowerMTA 的消息事件(注入、投递、退信、参与)上传到您的 SparkPost 帐户中,以便您可以访问健康评分、延迟报告和 Spam Trap Monitoring 等仪表板。
为什么将 Signals 与本地 MTA 集成?
许多企业出于合规原因运行自托管邮件基础设施,但仍希望使用SparkPost的分析和监控功能。Signals桥接了这个差距,而无需将邮件传输迁移到云端。
如何验证事件是否流向SparkPost?
检查 PowerMTA 日志中的
Signals: Transferred ... successfully,并在 SparkPost 的Signals → Events Search下确认事件条目。我可以使用我自己的 tracking domain 吗?
是的 — 配置一个CNAME,例如
track.mycompany.com → pmta.spgo.io(美国) 或pmta.eu.spgo.io(欧洲),然后在SparkPost中注册和验证它,以保持品牌和声誉一致性。数据隐私或磁盘使用如何?
min-free-space指令在磁盘空间不足时自动删除旧的 JSON 事件文件,防止本地堆积遥测数据。最后的“bonus feature”是什么?
一个Python regex工具 (
pmtaSafeJobID),确保活动/工作名称仅使用在PowerMTAX-Job头格式中有效的字符,用下划线替换不安全的字符。
安装和配置概述
首先,按照通常的 v5.0 安装说明安装(或升级)到 PowerMTA 5.0 r4 或更高版本,这些步骤相当简单。然后我们将完成以下步骤:
配置 PowerMTA 连接器到 SparkPost Signals
使用自定义跟踪域设置参与度跟踪
选择向 Signals 报告的 PowerMTA 流量流
测试您的事件是否到达 Signals
查看如何使用在报告中显示良好的有意义的名称。
我们还将介绍在我们的 Signals 演示中使用的其他特定 PowerMTA 设置方面:
FBL 事件(垃圾邮件投诉)和远程(带外)退信
注入配置,包括 DKIM
FBL 和 OOB 配置
VirtualMTA 设置和命名(以及这如何显示在您的 SparkPost Signals 报告中)
最后,有一个“额外功能”代码,确保您的活动名称与 PowerMTA X-Job 名称约定兼容。
首先,按照通常的 v5.0 安装说明安装(或升级)到 PowerMTA 5.0 r4 或更高版本,这些步骤相当简单。然后我们将完成以下步骤:
配置 PowerMTA 连接器到 SparkPost Signals
使用自定义跟踪域设置参与度跟踪
选择向 Signals 报告的 PowerMTA 流量流
测试您的事件是否到达 Signals
查看如何使用在报告中显示良好的有意义的名称。
我们还将介绍在我们的 Signals 演示中使用的其他特定 PowerMTA 设置方面:
FBL 事件(垃圾邮件投诉)和远程(带外)退信
注入配置,包括 DKIM
FBL 和 OOB 配置
VirtualMTA 设置和命名(以及这如何显示在您的 SparkPost Signals 报告中)
最后,有一个“额外功能”代码,确保您的活动名称与 PowerMTA X-Job 名称约定兼容。
首先,按照通常的 v5.0 安装说明安装(或升级)到 PowerMTA 5.0 r4 或更高版本,这些步骤相当简单。然后我们将完成以下步骤:
配置 PowerMTA 连接器到 SparkPost Signals
使用自定义跟踪域设置参与度跟踪
选择向 Signals 报告的 PowerMTA 流量流
测试您的事件是否到达 Signals
查看如何使用在报告中显示良好的有意义的名称。
我们还将介绍在我们的 Signals 演示中使用的其他特定 PowerMTA 设置方面:
FBL 事件(垃圾邮件投诉)和远程(带外)退信
注入配置,包括 DKIM
FBL 和 OOB 配置
VirtualMTA 设置和命名(以及这如何显示在您的 SparkPost Signals 报告中)
最后,有一个“额外功能”代码,确保您的活动名称与 PowerMTA X-Job 名称约定兼容。
FBL 和 OOB 配置
现在……终于……我们声明哪些特定的域开放用于远程退信和FBL响应。我们不想将这些传递到其他地方(为了防止反向散射攻击),只是内部处理这些响应。
# # Enable Bounce and FBL processing on specific domains # 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,因此无需注册。
现在……终于……我们声明哪些特定的域开放用于远程退信和FBL响应。我们不想将这些传递到其他地方(为了防止反向散射攻击),只是内部处理这些响应。
# # Enable Bounce and FBL processing on specific domains # 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,因此无需注册。
现在……终于……我们声明哪些特定的域开放用于远程退信和FBL响应。我们不想将这些传递到其他地方(为了防止反向散射攻击),只是内部处理这些响应。
# # Enable Bounce and FBL processing on specific domains # 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,因此无需注册。
配置 PowerMTA 连接器
Signals 配置在 5.0 用户指南第 10.1 节 中描述。这里我们将从"用例 #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 # this turns on the open and click tracking in PowerMTA customer-id 123 # Your SparkPost account number here </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 美国托管服务的跟踪域。您指定您的 SparkPost 数字客户 ID;这里有 查找其指令 。
tracking-domain
对于 SparkPost 欧盟账户,添加以下行:
tracking-domain pmta.eu.spgo.io # this is the endpoint for SparkPost EU
自定义跟踪域
如果您希望使用自己的跟踪域(从可递送性角度看这更好),请执行以下操作:
通过创建 CNAME 记录在您的 DNS 提供商处创建跟踪域。通常这将是您顶级域的子域,例如 track.mycompany.com 。
track.mycompany.com CNAME pmta.spgo.io # if you have a SparkPost US account track.mycompany.com CNAME pmta.eu.spgo.io # if you have a SparkPost EU account
您还可以使用 HTTPS 跟踪域,尽管这更为复杂(请参见 SparkPost 对于 HTTPS 跟踪域的配置步骤)。
在您的 SparkPost 账户中注册跟踪域,并 验证它。请稍等几分钟再尝试此操作,以允许您的 DNS 更改在 Internet 中传播,具体取决于您的 DNS 提供商。
配置 PowerMTA 使用该域而不是默认的,步骤如下
tracking-domain yourdomain.com # Put your own domain here
您可以通过查看邮件内部来检查您的投递邮件是否添加了“打开像素”并包裹了链接(在 Gmail 中,使用菜单右上角选择“显示原始邮件”)。

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

这就是您需要使 SparkPost Signals 与 PowerMTA 内置的参与度跟踪解决方案一起工作的所有步骤。
防止特定链接在您的 html 电子邮件中被跟踪
您可以通过将自定义属性 data-msys-clicktrack 设置为“0”来防止 PowerMTA 追踪特定链接:
<a href="#" data-msys-clicktrack="0">Example</a>
PowerMTA 不会包裹该链接。此外,在将消息传送给您的收件人之前,它会删除该属性。
Signals 配置在 5.0 用户指南第 10.1 节 中描述。这里我们将从"用例 #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 # this turns on the open and click tracking in PowerMTA customer-id 123 # Your SparkPost account number here </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 美国托管服务的跟踪域。您指定您的 SparkPost 数字客户 ID;这里有 查找其指令 。
tracking-domain
对于 SparkPost 欧盟账户,添加以下行:
tracking-domain pmta.eu.spgo.io # this is the endpoint for SparkPost EU
自定义跟踪域
如果您希望使用自己的跟踪域(从可递送性角度看这更好),请执行以下操作:
通过创建 CNAME 记录在您的 DNS 提供商处创建跟踪域。通常这将是您顶级域的子域,例如 track.mycompany.com 。
track.mycompany.com CNAME pmta.spgo.io # if you have a SparkPost US account track.mycompany.com CNAME pmta.eu.spgo.io # if you have a SparkPost EU account
您还可以使用 HTTPS 跟踪域,尽管这更为复杂(请参见 SparkPost 对于 HTTPS 跟踪域的配置步骤)。
在您的 SparkPost 账户中注册跟踪域,并 验证它。请稍等几分钟再尝试此操作,以允许您的 DNS 更改在 Internet 中传播,具体取决于您的 DNS 提供商。
配置 PowerMTA 使用该域而不是默认的,步骤如下
tracking-domain yourdomain.com # Put your own domain here
您可以通过查看邮件内部来检查您的投递邮件是否添加了“打开像素”并包裹了链接(在 Gmail 中,使用菜单右上角选择“显示原始邮件”)。

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

这就是您需要使 SparkPost Signals 与 PowerMTA 内置的参与度跟踪解决方案一起工作的所有步骤。
防止特定链接在您的 html 电子邮件中被跟踪
您可以通过将自定义属性 data-msys-clicktrack 设置为“0”来防止 PowerMTA 追踪特定链接:
<a href="#" data-msys-clicktrack="0">Example</a>
PowerMTA 不会包裹该链接。此外,在将消息传送给您的收件人之前,它会删除该属性。
Signals 配置在 5.0 用户指南第 10.1 节 中描述。这里我们将从"用例 #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 # this turns on the open and click tracking in PowerMTA customer-id 123 # Your SparkPost account number here </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 美国托管服务的跟踪域。您指定您的 SparkPost 数字客户 ID;这里有 查找其指令 。
tracking-domain
对于 SparkPost 欧盟账户,添加以下行:
tracking-domain pmta.eu.spgo.io # this is the endpoint for SparkPost EU
自定义跟踪域
如果您希望使用自己的跟踪域(从可递送性角度看这更好),请执行以下操作:
通过创建 CNAME 记录在您的 DNS 提供商处创建跟踪域。通常这将是您顶级域的子域,例如 track.mycompany.com 。
track.mycompany.com CNAME pmta.spgo.io # if you have a SparkPost US account track.mycompany.com CNAME pmta.eu.spgo.io # if you have a SparkPost EU account
您还可以使用 HTTPS 跟踪域,尽管这更为复杂(请参见 SparkPost 对于 HTTPS 跟踪域的配置步骤)。
在您的 SparkPost 账户中注册跟踪域,并 验证它。请稍等几分钟再尝试此操作,以允许您的 DNS 更改在 Internet 中传播,具体取决于您的 DNS 提供商。
配置 PowerMTA 使用该域而不是默认的,步骤如下
tracking-domain yourdomain.com # Put your own domain here
您可以通过查看邮件内部来检查您的投递邮件是否添加了“打开像素”并包裹了链接(在 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:
全局开启(这是我们在上述示例中使用的方式)
仅对一些 Virtual MTAs 而非其他
仅对一些 Virtual MTA 组而非其他
对于由 PowerMTA 中继的特定“Sender”或“From”地址,结合 Virtual MTA / Virtual MTA 组的选择
范围 | 向 Signals 报告的内容 | 使用场景 |
|---|---|---|
全局 | 来自 PowerMTA 主机的所有流量 | 适用于所有流量都应传入 SparkPost Signals 的简单部署。 |
VirtualMTA | 仅来自已选择的 VirtualMTAs 的流量 | 当您希望为不同的 IP 或流量类型提供独立报告视图时。 |
VirtualMTA Pool | 来自已选择的 VirtualMTA 组的流量 | 当您将 IP 分组并希望进行组级别报告时。 |
Sender / From 域 | 来自特定发件人或 From 域的消息 | 当您需要在同一基础设施中进行按客户或品牌的报告时。 |
此配置非常强大,用户指南中通过一系列示例用例(v5.0)对此进行了说明。
您可以选择激活 Signals:
全局开启(这是我们在上述示例中使用的方式)
仅对一些 Virtual MTAs 而非其他
仅对一些 Virtual MTA 组而非其他
对于由 PowerMTA 中继的特定“Sender”或“From”地址,结合 Virtual MTA / Virtual MTA 组的选择
范围 | 向 Signals 报告的内容 | 使用场景 |
|---|---|---|
全局 | 来自 PowerMTA 主机的所有流量 | 适用于所有流量都应传入 SparkPost Signals 的简单部署。 |
VirtualMTA | 仅来自已选择的 VirtualMTAs 的流量 | 当您希望为不同的 IP 或流量类型提供独立报告视图时。 |
VirtualMTA Pool | 来自已选择的 VirtualMTA 组的流量 | 当您将 IP 分组并希望进行组级别报告时。 |
Sender / From 域 | 来自特定发件人或 From 域的消息 | 当您需要在同一基础设施中进行按客户或品牌的报告时。 |
此配置非常强大,用户指南中通过一系列示例用例(v5.0)对此进行了说明。
您可以选择激活 Signals:
全局开启(这是我们在上述示例中使用的方式)
仅对一些 Virtual MTAs 而非其他
仅对一些 Virtual MTA 组而非其他
对于由 PowerMTA 中继的特定“Sender”或“From”地址,结合 Virtual MTA / Virtual MTA 组的选择
范围 | 向 Signals 报告的内容 | 使用场景 |
|---|---|---|
全局 | 来自 PowerMTA 主机的所有流量 | 适用于所有流量都应传入 SparkPost Signals 的简单部署。 |
VirtualMTA | 仅来自已选择的 VirtualMTAs 的流量 | 当您希望为不同的 IP 或流量类型提供独立报告视图时。 |
VirtualMTA Pool | 来自已选择的 VirtualMTA 组的流量 | 当您将 IP 分组并希望进行组级别报告时。 |
Sender / From 域 | 来自特定发件人或 From 域的消息 | 当您需要在同一基础设施中进行按客户或品牌的报告时。 |
此配置非常强大,用户指南中通过一系列示例用例(v5.0)对此进行了说明。
测试您的事件是否到达Signals
这是 SparkPost Signals 的视图,连接到 PowerMTA。 您可以看到健康评分正在变化。

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

在您的 SparkPost 事件搜索屏幕中,您应该在几分钟内看到事件出现。这些将包括 Injection 和 Delivery 事件,以及 Bounce 和可能的 Out-of-Band Bounce 和 Spam Complaint 事件,如果您已配置 PowerMTA 为您处理这些事件。
如果您启用了 Engagement Tracking,您还会看到 open、initial_open 和 click 事件。
这是 SparkPost Signals 的视图,连接到 PowerMTA。 您可以看到健康评分正在变化。

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

在您的 SparkPost 事件搜索屏幕中,您应该在几分钟内看到事件出现。这些将包括 Injection 和 Delivery 事件,以及 Bounce 和可能的 Out-of-Band Bounce 和 Spam Complaint 事件,如果您已配置 PowerMTA 为您处理这些事件。
如果您启用了 Engagement Tracking,您还会看到 open、initial_open 和 click 事件。
这是 SparkPost Signals 的视图,连接到 PowerMTA。 您可以看到健康评分正在变化。

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

在您的 SparkPost 事件搜索屏幕中,您应该在几分钟内看到事件出现。这些将包括 Injection 和 Delivery 事件,以及 Bounce 和可能的 Out-of-Band Bounce 和 Spam Complaint 事件,如果您已配置 PowerMTA 为您处理这些事件。
如果您启用了 Engagement Tracking,您还会看到 open、initial_open 和 click 事件。
使用在报告中显示良好的有意义的名称
设置PowerMTA VirtualMTA Pool名称和Job名称,使其具有意义且易于阅读,这是非常值得做的。这些直接在您的SparkPost Signals功能和摘要报告中显示。
如前所述,您不需要在您的SparkPost账户中创建这些池。SparkPost会从您的PowerMTA配置中获取它们。
这是PowerMTA配置术语如何转换为SparkPost术语的方法。
PowerMTA术语 SparkPost Reports / Signals术语Recipient Domain
(domain portion of “rcpt” field in Accounting file).Recipient Domain The domain portion of the “Sender” or “From” header in the message relayed by PowerMTA. (domain portion of “orig” in Accounting file).Sending Domain VirtualMTA (name)—VirtualMTA Pool (name) (“vmtaPool” in accounting file)IP Pool (name) smtp-source-host a.b.c.d (“dlvSourceIp” in accounting file)Sending IP a.b.c.d Job (name) (“jobId” in accounting file)Campaign ID (name)—Template (name) “Subaccount” is not a native PowerMTA concept
然而,PowerMTA可以为SparkPost报告目的为virtualMTAs, virtual MTA Pools或Sender-or-From域标记一个subaccount ID。
Subaccount ID (number) FBL (event) Spam Complaint (event) Remote Bounce (event) Out-of-Band bounce (event)
设置至少一个smtp-source-host地址还可以让SparkPost正确识别发送IP地址,以便它在注入和投递事件中显示,以及在摘要报告视图中。
Job名称通过注入消息中的头在PowerMTA中设置。它不仅使个人作业控制(暂停/恢复等)更加有用,PowerMTA还将这些名称通过SparkPost Signals报告传递为“campaign ID”。请参见用户指南v5.0 第12.8节“使用JobID在PowerMTA中跟踪活动”。
关于作业命名有几件事需要注意。虽然SparkPost(使用JSON格式和JSON转义)允许在活动名称中使用字符<SPACE>,但邮件头的限制更多。X-Job头中允许的有效字符为:
A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~
换句话说,不允许的字符包括<SPACE>,双引号“和反勾号`。如果您已经习惯于使用X-Job名称,这不会令人惊讶,并且您的活动ID名称将在SparkPost报告中“正常工作”。如果像我一样您首先学习了SparkPost,则可能需要一个工具来确保您的X-Job值安全;请参见本文末尾的奖励功能。
PowerMTA术语 | SparkPost Signals术语 |
|---|---|
VirtualMTA | IP Pool |
VirtualMTA Pool | IP Pool (分组) |
Job Name (X-Job头) | Campaign ID |
smtp-source-host | 发送IP地址 |
Bounce Domain | 发送域识别 |
Sender/From Domain | Subaccount / 域级报告 |
设置PowerMTA VirtualMTA Pool名称和Job名称,使其具有意义且易于阅读,这是非常值得做的。这些直接在您的SparkPost Signals功能和摘要报告中显示。
如前所述,您不需要在您的SparkPost账户中创建这些池。SparkPost会从您的PowerMTA配置中获取它们。
这是PowerMTA配置术语如何转换为SparkPost术语的方法。
PowerMTA术语 SparkPost Reports / Signals术语Recipient Domain
(domain portion of “rcpt” field in Accounting file).Recipient Domain The domain portion of the “Sender” or “From” header in the message relayed by PowerMTA. (domain portion of “orig” in Accounting file).Sending Domain VirtualMTA (name)—VirtualMTA Pool (name) (“vmtaPool” in accounting file)IP Pool (name) smtp-source-host a.b.c.d (“dlvSourceIp” in accounting file)Sending IP a.b.c.d Job (name) (“jobId” in accounting file)Campaign ID (name)—Template (name) “Subaccount” is not a native PowerMTA concept
然而,PowerMTA可以为SparkPost报告目的为virtualMTAs, virtual MTA Pools或Sender-or-From域标记一个subaccount ID。
Subaccount ID (number) FBL (event) Spam Complaint (event) Remote Bounce (event) Out-of-Band bounce (event)
设置至少一个smtp-source-host地址还可以让SparkPost正确识别发送IP地址,以便它在注入和投递事件中显示,以及在摘要报告视图中。
Job名称通过注入消息中的头在PowerMTA中设置。它不仅使个人作业控制(暂停/恢复等)更加有用,PowerMTA还将这些名称通过SparkPost Signals报告传递为“campaign ID”。请参见用户指南v5.0 第12.8节“使用JobID在PowerMTA中跟踪活动”。
关于作业命名有几件事需要注意。虽然SparkPost(使用JSON格式和JSON转义)允许在活动名称中使用字符<SPACE>,但邮件头的限制更多。X-Job头中允许的有效字符为:
A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~
换句话说,不允许的字符包括<SPACE>,双引号“和反勾号`。如果您已经习惯于使用X-Job名称,这不会令人惊讶,并且您的活动ID名称将在SparkPost报告中“正常工作”。如果像我一样您首先学习了SparkPost,则可能需要一个工具来确保您的X-Job值安全;请参见本文末尾的奖励功能。
PowerMTA术语 | SparkPost Signals术语 |
|---|---|
VirtualMTA | IP Pool |
VirtualMTA Pool | IP Pool (分组) |
Job Name (X-Job头) | Campaign ID |
smtp-source-host | 发送IP地址 |
Bounce Domain | 发送域识别 |
Sender/From Domain | Subaccount / 域级报告 |
设置PowerMTA VirtualMTA Pool名称和Job名称,使其具有意义且易于阅读,这是非常值得做的。这些直接在您的SparkPost Signals功能和摘要报告中显示。
如前所述,您不需要在您的SparkPost账户中创建这些池。SparkPost会从您的PowerMTA配置中获取它们。
这是PowerMTA配置术语如何转换为SparkPost术语的方法。
PowerMTA术语 SparkPost Reports / Signals术语Recipient Domain
(domain portion of “rcpt” field in Accounting file).Recipient Domain The domain portion of the “Sender” or “From” header in the message relayed by PowerMTA. (domain portion of “orig” in Accounting file).Sending Domain VirtualMTA (name)—VirtualMTA Pool (name) (“vmtaPool” in accounting file)IP Pool (name) smtp-source-host a.b.c.d (“dlvSourceIp” in accounting file)Sending IP a.b.c.d Job (name) (“jobId” in accounting file)Campaign ID (name)—Template (name) “Subaccount” is not a native PowerMTA concept
然而,PowerMTA可以为SparkPost报告目的为virtualMTAs, virtual MTA Pools或Sender-or-From域标记一个subaccount ID。
Subaccount ID (number) FBL (event) Spam Complaint (event) Remote Bounce (event) Out-of-Band bounce (event)
设置至少一个smtp-source-host地址还可以让SparkPost正确识别发送IP地址,以便它在注入和投递事件中显示,以及在摘要报告视图中。
Job名称通过注入消息中的头在PowerMTA中设置。它不仅使个人作业控制(暂停/恢复等)更加有用,PowerMTA还将这些名称通过SparkPost Signals报告传递为“campaign ID”。请参见用户指南v5.0 第12.8节“使用JobID在PowerMTA中跟踪活动”。
关于作业命名有几件事需要注意。虽然SparkPost(使用JSON格式和JSON转义)允许在活动名称中使用字符<SPACE>,但邮件头的限制更多。X-Job头中允许的有效字符为:
A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~
换句话说,不允许的字符包括<SPACE>,双引号“和反勾号`。如果您已经习惯于使用X-Job名称,这不会令人惊讶,并且您的活动ID名称将在SparkPost报告中“正常工作”。如果像我一样您首先学习了SparkPost,则可能需要一个工具来确保您的X-Job值安全;请参见本文末尾的奖励功能。
PowerMTA术语 | SparkPost Signals术语 |
|---|---|
VirtualMTA | IP Pool |
VirtualMTA Pool | IP Pool (分组) |
Job Name (X-Job头) | Campaign ID |
smtp-source-host | 发送IP地址 |
Bounce Domain | 发送域识别 |
Sender/From Domain | Subaccount / 域级报告 |
FBL 事件(Spam Complaints)和远程(out-of-band)退信
PowerMTA 可以接收和处理 FBL 事件(在 SparkPost 中称为垃圾邮件投诉事件)和远程退信(在 SparkPost 中称为带外退信,因为回复是在 SMTP 会话结束后的一段时间才返回的)。
Port25 支持论坛上有关于如何设置 Bounce Processor 和 FBL Processor 的文章。如果您是现有的 PowerMTA 用户,您可能已经拥有这些。
这是我为演示做的配置,基于这些文章,并面向在 Amazon EC2 中托管 PowerMTA。
如果您熟悉 PowerMTA 在这方面的配置,您可以跳过此部分,直接到下一个水平线。
PowerMTA 可以接收和处理 FBL 事件(在 SparkPost 中称为垃圾邮件投诉事件)和远程退信(在 SparkPost 中称为带外退信,因为回复是在 SMTP 会话结束后的一段时间才返回的)。
Port25 支持论坛上有关于如何设置 Bounce Processor 和 FBL Processor 的文章。如果您是现有的 PowerMTA 用户,您可能已经拥有这些。
这是我为演示做的配置,基于这些文章,并面向在 Amazon EC2 中托管 PowerMTA。
如果您熟悉 PowerMTA 在这方面的配置,您可以跳过此部分,直接到下一个水平线。
PowerMTA 可以接收和处理 FBL 事件(在 SparkPost 中称为垃圾邮件投诉事件)和远程退信(在 SparkPost 中称为带外退信,因为回复是在 SMTP 会话结束后的一段时间才返回的)。
Port25 支持论坛上有关于如何设置 Bounce Processor 和 FBL Processor 的文章。如果您是现有的 PowerMTA 用户,您可能已经拥有这些。
这是我为演示做的配置,基于这些文章,并面向在 Amazon EC2 中托管 PowerMTA。
如果您熟悉 PowerMTA 在这方面的配置,您可以跳过此部分,直接到下一个水平线。
注入配置
我们将使用端口587用于注入消息,这些消息将通过公共互联网从其他主机到达。我们需要阻止恶意行为者发现和滥用此服务,因此我们应用用户名/密码身份验证和可选的TLS,类似于SparkPost SMTP注入端点。
我们希望能够从正确认证的源发送消息到任何目的地。我们还希望在端口25上有一个单独的侦听器用于不需要认证的FBL和远程退件响应。
# IP address(es) and port(s) on which to listen for incoming SMTP connections smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25
在以下<source> 声明中,我们使用用户名/密码身份验证和可选TLS来防止恶意消息注入。我们还设置了对尝试失败密码连接的速率限制。
您的设置可能不同;例如,如果您在注入器和PowerMTA之间有一个专用网络,您将不需要密码认证。
# One source rule for all injection, internal or external. Enforce auth, except for bounces and FBLs # <source 0/0> log-connections false log-commands false # WARNING: verbose! just for dev log-data false # WARNING: even more verbose! smtp-service true # allow SMTP service 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 # only if the auth succeeds default-virtual-mta default process-x-job true </source>
一旦认证通过,<source {auth}>声明(见此处。v5.0)适用。此处允许继续转发,设置默认虚拟MTA组使用,并添加X-Job头(将由SparkPost Signals报告为campaign_id)。
重写列表将注入的消息映射为使用特定的MAIL FROM域(也称为退件域或Return-Path:)。
# # Rewrite the MAIL FROM address to match the bounce domain # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
然后我们根据TLS配置和SMTP用户名/密码,根据当前建议进行设置。
# # Secure the inbound service with username, password and 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 users (authenticated via SMTP AUTH) # <smtp-user SMTP_Injection> password ##PUT YOUR PASSWORD HERE## authentication-method password </smtp-user>
我们可以使用我最喜欢的SMTP测试工具,检查(不安全的,已弃用的)TLS v1.0未被接受,swaks。
swaks --server pmta.signalsdemo.trymsys.net --port 587 \ --to test@trymsys.net \ --from any@sparkpost.com \ --tls \ --tls-protocol tlsv1
我们看到:
*** TLS startup failed (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS attempted but failed
同样适用于 –tls-protocol tlsv1_1.
我们同样对我们的外发邮件应用DKIM签名,因为这是一个良好的做法(我遵循这些说明设置了密钥)。
# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem
我们将使用端口587用于注入消息,这些消息将通过公共互联网从其他主机到达。我们需要阻止恶意行为者发现和滥用此服务,因此我们应用用户名/密码身份验证和可选的TLS,类似于SparkPost SMTP注入端点。
我们希望能够从正确认证的源发送消息到任何目的地。我们还希望在端口25上有一个单独的侦听器用于不需要认证的FBL和远程退件响应。
# IP address(es) and port(s) on which to listen for incoming SMTP connections smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25
在以下<source> 声明中,我们使用用户名/密码身份验证和可选TLS来防止恶意消息注入。我们还设置了对尝试失败密码连接的速率限制。
您的设置可能不同;例如,如果您在注入器和PowerMTA之间有一个专用网络,您将不需要密码认证。
# One source rule for all injection, internal or external. Enforce auth, except for bounces and FBLs # <source 0/0> log-connections false log-commands false # WARNING: verbose! just for dev log-data false # WARNING: even more verbose! smtp-service true # allow SMTP service 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 # only if the auth succeeds default-virtual-mta default process-x-job true </source>
一旦认证通过,<source {auth}>声明(见此处。v5.0)适用。此处允许继续转发,设置默认虚拟MTA组使用,并添加X-Job头(将由SparkPost Signals报告为campaign_id)。
重写列表将注入的消息映射为使用特定的MAIL FROM域(也称为退件域或Return-Path:)。
# # Rewrite the MAIL FROM address to match the bounce domain # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
然后我们根据TLS配置和SMTP用户名/密码,根据当前建议进行设置。
# # Secure the inbound service with username, password and 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 users (authenticated via SMTP AUTH) # <smtp-user SMTP_Injection> password ##PUT YOUR PASSWORD HERE## authentication-method password </smtp-user>
我们可以使用我最喜欢的SMTP测试工具,检查(不安全的,已弃用的)TLS v1.0未被接受,swaks。
swaks --server pmta.signalsdemo.trymsys.net --port 587 \ --to test@trymsys.net \ --from any@sparkpost.com \ --tls \ --tls-protocol tlsv1
我们看到:
*** TLS startup failed (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS attempted but failed
同样适用于 –tls-protocol tlsv1_1.
我们同样对我们的外发邮件应用DKIM签名,因为这是一个良好的做法(我遵循这些说明设置了密钥)。
# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem
我们将使用端口587用于注入消息,这些消息将通过公共互联网从其他主机到达。我们需要阻止恶意行为者发现和滥用此服务,因此我们应用用户名/密码身份验证和可选的TLS,类似于SparkPost SMTP注入端点。
我们希望能够从正确认证的源发送消息到任何目的地。我们还希望在端口25上有一个单独的侦听器用于不需要认证的FBL和远程退件响应。
# IP address(es) and port(s) on which to listen for incoming SMTP connections smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25
在以下<source> 声明中,我们使用用户名/密码身份验证和可选TLS来防止恶意消息注入。我们还设置了对尝试失败密码连接的速率限制。
您的设置可能不同;例如,如果您在注入器和PowerMTA之间有一个专用网络,您将不需要密码认证。
# One source rule for all injection, internal or external. Enforce auth, except for bounces and FBLs # <source 0/0> log-connections false log-commands false # WARNING: verbose! just for dev log-data false # WARNING: even more verbose! smtp-service true # allow SMTP service 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 # only if the auth succeeds default-virtual-mta default process-x-job true </source>
一旦认证通过,<source {auth}>声明(见此处。v5.0)适用。此处允许继续转发,设置默认虚拟MTA组使用,并添加X-Job头(将由SparkPost Signals报告为campaign_id)。
重写列表将注入的消息映射为使用特定的MAIL FROM域(也称为退件域或Return-Path:)。
# # Rewrite the MAIL FROM address to match the bounce domain # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
然后我们根据TLS配置和SMTP用户名/密码,根据当前建议进行设置。
# # Secure the inbound service with username, password and 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 users (authenticated via SMTP AUTH) # <smtp-user SMTP_Injection> password ##PUT YOUR PASSWORD HERE## authentication-method password </smtp-user>
我们可以使用我最喜欢的SMTP测试工具,检查(不安全的,已弃用的)TLS v1.0未被接受,swaks。
swaks --server pmta.signalsdemo.trymsys.net --port 587 \ --to test@trymsys.net \ --from any@sparkpost.com \ --tls \ --tls-protocol tlsv1
我们看到:
*** TLS startup failed (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS attempted but failed
同样适用于 –tls-protocol tlsv1_1.
我们同样对我们的外发邮件应用DKIM签名,因为这是一个良好的做法(我遵循这些说明设置了密钥)。
# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem
VirtualMTA 设置和命名
PowerMTA VirtualMTAs(和 VirtualMTA 池)是用于管理消息流的强大功能,PowerMTA / SparkPost Signals 报告功能在激活时效果最佳。
# # Route all outgoing traffic through this virtual mta / pool. # # Declare the delivery IP address here, so that SparkPost signals ingest injection (aka "reception") events # will carry the correct sending_IP attribute # <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 # max. connections *per domain* bounce-after 4d12h # 4 days, 12 hours retry-after 10m # 10 minutes dkim-sign yes </domain> </virtual-mta-pool>
virtual-mta-pool 设置在 SparkPost 中被报告为“IP Pool”,并且可以用作 SparkPost Signals 报告方面(图表下拉菜单)。

汇总报告同样显示 IP Pool 为“按组”报告方面。

正如本文前面提到,只需设置至少一个 smtp-source-host 地址,同样便于 SparkPost 正确识别发送 IP 地址,以便在 Injection 和 Delivery 事件中显示,并出现在汇总报告中:

这些是您与 PowerMTA 和 SparkPost Signals 建立基本集成所需的一切。您可以在 这里查看完整的配置文件示例。
在您离开之前,这就是我提到的额外功能。
PowerMTA VirtualMTAs(和 VirtualMTA 池)是用于管理消息流的强大功能,PowerMTA / SparkPost Signals 报告功能在激活时效果最佳。
# # Route all outgoing traffic through this virtual mta / pool. # # Declare the delivery IP address here, so that SparkPost signals ingest injection (aka "reception") events # will carry the correct sending_IP attribute # <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 # max. connections *per domain* bounce-after 4d12h # 4 days, 12 hours retry-after 10m # 10 minutes dkim-sign yes </domain> </virtual-mta-pool>
virtual-mta-pool 设置在 SparkPost 中被报告为“IP Pool”,并且可以用作 SparkPost Signals 报告方面(图表下拉菜单)。

汇总报告同样显示 IP Pool 为“按组”报告方面。

正如本文前面提到,只需设置至少一个 smtp-source-host 地址,同样便于 SparkPost 正确识别发送 IP 地址,以便在 Injection 和 Delivery 事件中显示,并出现在汇总报告中:

这些是您与 PowerMTA 和 SparkPost Signals 建立基本集成所需的一切。您可以在 这里查看完整的配置文件示例。
在您离开之前,这就是我提到的额外功能。
PowerMTA VirtualMTAs(和 VirtualMTA 池)是用于管理消息流的强大功能,PowerMTA / SparkPost Signals 报告功能在激活时效果最佳。
# # Route all outgoing traffic through this virtual mta / pool. # # Declare the delivery IP address here, so that SparkPost signals ingest injection (aka "reception") events # will carry the correct sending_IP attribute # <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 # max. connections *per domain* bounce-after 4d12h # 4 days, 12 hours retry-after 10m # 10 minutes dkim-sign yes </domain> </virtual-mta-pool>
virtual-mta-pool 设置在 SparkPost 中被报告为“IP Pool”,并且可以用作 SparkPost Signals 报告方面(图表下拉菜单)。

汇总报告同样显示 IP Pool 为“按组”报告方面。

正如本文前面提到,只需设置至少一个 smtp-source-host 地址,同样便于 SparkPost 正确识别发送 IP 地址,以便在 Injection 和 Delivery 事件中显示,并出现在汇总报告中:

这些是您与 PowerMTA 和 SparkPost Signals 建立基本集成所需的一切。您可以在 这里查看完整的配置文件示例。
在您离开之前,这就是我提到的额外功能。
Bonus feature: X-Job 名称检查/过滤
为了确保任何字符字符串可安全用作 PowerMTA X-Job 名称,这里有一个简单的 Python 函数,将任何不安全的字符映射为下划线 "_"
import re def pmtaSafeJobID(s): """ :param s: str :return: str Map an arbitrary campaign ID string into allowed chars for PMTA X-Job header. See https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid Specifically disallow <sp> " ` but allow through most other chars. """ # Note have to escape ' - [ ] and double-escape \ - see https://docs.python.org/3/library/re.html disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@$begin:math:display$\\\\\\\\$end:math:display$^_{|}~]' return re.sub(disallowedChars, '_', s)
这以特定方式使用 Python 正则表达式。它使用“集合补集”运算符 ^ 来声明不允许字符集,而不是列出所有允许字符。这意味着我们可以捕获并安全处理超出常规 7 位集合的字符。我们可以使用此测试片段来展示:
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
结果是
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^abcdefghijklmnopqrstuvwxyz{|}~_________________________________________________________
你可以看到 <SPACE>、双引号 “ 和反引号 ` 以及所有超出 ~ 的字符都被映射为下划线。
为了确保任何字符字符串可安全用作 PowerMTA X-Job 名称,这里有一个简单的 Python 函数,将任何不安全的字符映射为下划线 "_"
import re def pmtaSafeJobID(s): """ :param s: str :return: str Map an arbitrary campaign ID string into allowed chars for PMTA X-Job header. See https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid Specifically disallow <sp> " ` but allow through most other chars. """ # Note have to escape ' - [ ] and double-escape \ - see https://docs.python.org/3/library/re.html disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@$begin:math:display$\\\\\\\\$end:math:display$^_{|}~]' return re.sub(disallowedChars, '_', s)
这以特定方式使用 Python 正则表达式。它使用“集合补集”运算符 ^ 来声明不允许字符集,而不是列出所有允许字符。这意味着我们可以捕获并安全处理超出常规 7 位集合的字符。我们可以使用此测试片段来展示:
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
结果是
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^abcdefghijklmnopqrstuvwxyz{|}~_________________________________________________________
你可以看到 <SPACE>、双引号 “ 和反引号 ` 以及所有超出 ~ 的字符都被映射为下划线。
为了确保任何字符字符串可安全用作 PowerMTA X-Job 名称,这里有一个简单的 Python 函数,将任何不安全的字符映射为下划线 "_"
import re def pmtaSafeJobID(s): """ :param s: str :return: str Map an arbitrary campaign ID string into allowed chars for PMTA X-Job header. See https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid Specifically disallow <sp> " ` but allow through most other chars. """ # Note have to escape ' - [ ] and double-escape \ - see https://docs.python.org/3/library/re.html disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@$begin:math:display$\\\\\\\\$end:math:display$^_{|}~]' return re.sub(disallowedChars, '_', s)
这以特定方式使用 Python 正则表达式。它使用“集合补集”运算符 ^ 来声明不允许字符集,而不是列出所有允许字符。这意味着我们可以捕获并安全处理超出常规 7 位集合的字符。我们可以使用此测试片段来展示:
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
结果是
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^abcdefghijklmnopqrstuvwxyz{|}~_________________________________________________________
你可以看到 <SPACE>、双引号 “ 和反引号 ` 以及所有超出 ~ 的字符都被映射为下划线。



