Reach

Grow

Manage

Automate

Reach

Grow

Manage

Automate

在本地部署信号:PowerMTA 集成

2019年8月30日

电子邮件

1 min read

在本地部署信号:PowerMTA 集成

2019年8月30日

电子邮件

1 min read

在本地部署信号:PowerMTA 集成

让我们深入了解如何为 SparkPost Signals 设置 PowerMTA 的细节。

让我们深入了解为 SparkPost Signals 设置 PowerMTA 的细节。您将需要:

  • 运行最新版本 PowerMTA 的主机 – 可以是新机器或现有机器

  • 一个 SparkPost 帐户,需具备“传入事件:写入”的 API 密钥权限 如这里描述

我们将设置 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 节 中说明。这里我们将从“用例 #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: 发现 0 个文件

有流量时,您会看到类似的内容:

2019-07-26 11:50:57 Signals: 发现 sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals: 成功传输 sp1-0000000000003FBD.json。2019-07-26 11:50:57 Signals: 发现 1 个文件,成功传输 1 个文件

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 # 这是 SparkPost 欧盟的端点

自定义跟踪域

如果您更愿意使用自己的跟踪域(这在可交付性方面更好),请执行以下操作:

  • 创建跟踪域与您的 DNS 提供商通过创建 CNAME 记录。通常,这将是您的顶级域的子域,例如 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 Signals 与 PowerMTA 内置参与跟踪功能配合使用的一切。

阻止 html 电子邮件中特定链接被跟踪

您可以通过将自定义属性 data-msys-clicktrack 设置为“0”来防止 PowerMTA 跟踪特定链接:

<a href="#" data-msys-clicktrack="0">示例</a>

PowerMTA 将不会封装该链接。它还将在将消息传送给您的收件人之前删除该属性。

选择要向Signals报告的PowerMTA流量流

您可以选择 Signals 为活跃状态:

  • 全局(这是我们在上述示例中使用的方式)

  • 对某些 Virtual MTAs 而不适用于其他

  • 对某些 Virtual MTA 池,而不是其他池

  • 对于由 PowerMTA 转发的特定“Sender”或“From”地址,结合 Virtual MTA / Virtual MTA 池的选择

此配置非常强大,并通过用户指南中的一系列示例用例 (v5.0) 来说明。

您可以选择 Signals 为活跃状态:

  • 全局(这是我们在上述示例中使用的方式)

  • 对某些 Virtual MTAs 而不适用于其他

  • 对某些 Virtual MTA 池,而不是其他池

  • 对于由 PowerMTA 转发的特定“Sender”或“From”地址,结合 Virtual MTA / Virtual MTA 池的选择

此配置非常强大,并通过用户指南中的一系列示例用例 (v5.0) 来说明。

您可以选择 Signals 为活跃状态:

  • 全局(这是我们在上述示例中使用的方式)

  • 对某些 Virtual MTAs 而不适用于其他

  • 对某些 Virtual MTA 池,而不是其他池

  • 对于由 PowerMTA 转发的特定“Sender”或“From”地址,结合 Virtual MTA / Virtual MTA 池的选择

此配置非常强大,并通过用户指南中的一系列示例用例 (v5.0) 来说明。

测试您的事件是否到达Signals

这里是连接到 PowerMTA 的 SparkPost Signals 的视图。您可以看到健康评分在变化。




Campaign 名称可作为报告方面提供,还有 Subaccount、IP Pool、Mailbox Provider 和 Sending Domain。

除了查看 PowerMTA 日志外,您还可以通过查看 Signals Integration 屏幕来检查事件数据是否到达 SparkPost。




在您的 SparkPost Events Search 屏幕中,您应该在几分钟内看到事件出现。这些将包括 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 报告 / Signals 术语Recipient Domain
(会计文件中 “rcpt” 字段的域部分)。Recipient Domain通过 PowerMTA 中继的消息中“Sender”或“From”头的域部分。
(会计文件中的“orig”域部分)。Sending DomainVirtualMTA(名称)—VirtualMTA Pool(名称)
(会计文件中的“vmtaPool”)IP Pool(名称)smtp-source-host a.b.c.d
(会计文件中的“dlvSourceIp”)Sending IP a.b.c.dJob(名称)
(会计文件中的“jobId”)Campaign ID(名称)—Template(名称)“Subaccount”不是 PowerMTA 的原生概念。




然而,PowerMTA 可以为 SparkPost 报告目的,在虚拟MTAs、Virtual MTA Pools 或 Sender-or-From 域添加子账户 ID。

Subaccount ID(数字)FBL(事件)Spam Complaint(事件)Remote Bounce(事件)Out-of-Band bounce(事件)

 

设置至少一个 smtp-source-host 地址还可以使 SparkPost 正确识别发送 IP 地址,以便它显示在 Injection 和 Delivery 事件中,以及在摘要报告视图中。

Job 名称通过注入消息中的头在 PowerMTA 中设置。除了启用单独的作业控制(暂停/恢复等),这本身就很有用,PowerMTA 将名称传递到 SparkPost Signals 报告中作为“campaign ID”。参见用户指南 v5.0 第 12.8 节“在 PowerMTA 中使用 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

PowerMTA 可以接收和处理 FBL 事件(在 SparkPost 中称为垃圾邮件投诉事件)和远程退回(在 SparkPost 中称为带外退回,因为回复是在稍后回来,而不是在 SMTP 会话期间)。

在 Port25 支持论坛上有关于如何设置退回处理器FBL 处理器的文章。如果您是现有的 PowerMTA 用户,您可能已经拥有这些配置。

这是我为演示而做的配置,基于这些文章,并针对在 Amazon EC2 上托管 PowerMTA。

如果您熟悉 PowerMTA 在这方面的配置,可以跳过这一部分,直接到下一条水平线下。

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)。

rewrite-list将注入的消息映射为使用特定的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测试工具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处理 # 中继域 pmta.signalsdemo.trymsys.net 中继域 bounces.pmta.signalsdemo.trymsys.net 中继域 fbl.pmta.signalsdemo.trymsys.net <bounce-processor> 不投递不匹配的邮件,不投递匹配的邮件 <address-list> 域 pmta.signalsdemo.trymsys.net 域 bounces.pmta.signalsdemo.trymsys.net </address-list> </bounce-processor> <feedback-loop-processor> 不投递不匹配的邮件,不投递匹配的邮件 <address-list> 域 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池)是管理消息流的强大功能,PowerMTA / SparkPost Signals报告功能在这些处于活动状态时效果最佳。

# # 将所有外发流量通过此虚拟mta/池路由。# 在此声明传递IP地址,以便SparkPost信号摄取注入(也称为“接收”)事件将携带正确的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池设置在SparkPost中报告为“IP Pool”,并且可作为SparkPost Signals报告方面(图表下拉菜单)备用。




汇总报告还显示IP池作为“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>、双引号“”和反引号`,以及所有超过~的字符都被映射为下划线。

让我们为您联系Bird专家。
在30分钟内见证Bird的全部威力。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

让我们为您联系Bird专家。
在30分钟内见证Bird的全部威力。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

让我们为您联系Bird专家。
在30分钟内见证Bird的全部威力。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

R

Reach

G

Grow

M

Manage

A

Automate

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。