在这一部分,我们将探讨如何将该工具调整为将邮件流注入本地平台,例如PowerMTA和Momentum。
Business in a box.
探索我们的解决方案。
与我们的销售团队交谈
1. 入门指南
安装该工具、获取您的密钥等步骤与之前完全相同。当您使用像PowerMTA或Momentum这样的本地电子邮件系统时,您已经负责设置发送域、DKIM密钥等。我们现在需要做的是提供一种方式,将完整的S/MIME消息注入到您的服务器中。
2. SMTP 注入向 Port25 PowerMTA
PowerMTA支持多种消息注入方式,包括文件“拾取”目录、SMTP和API。这里使用的是SMTP方法。
为了展示最简单的设置,我们将在与PowerMTA相同的服务器上安装S/MIME工具。我们向监听程序注入消息,该程序默认在TCP端口25上打开,仅接受本地流量。
export SMTP_HOST=localhost
(如果你忘记了这一步,当你尝试运行时会看到:“环境变量SMTP_HOST未设置 – 停止”)
我们已经有了发件人的私钥(steve@thetucks.com.pem)和收件人的公钥(steve.tuck@sparkpost.com.crt)。消息文件的前几行是:
To: SteveT <steve.tuck@sparkpost.com> From: Steve <steve@thetucks.com> Subject: This is a message created using HEML MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit
我们通过以下方式发送消息:
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
我们看到:
打开SMTP连接(普通)到localhost,端口25,user="",password="" 发送tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - 用时0.028秒
消息迅速到达收件箱,并在Mac Mail中报告为已签名和加密。

额外功能:DKIM与PowerMTA
DKIM配置相当容易,并与S/MIME愉快共存。步骤如下:
使用PowerMTA DKIM Wizard网站创建发送域私钥(在我的情况下,是mypmta.thetucks.com.pem)和公共DNS TXT记录内容。
用选择的选择器设置DNS TXT记录。例如,我使用了选择器pmta201811。有效的选择器字符在这里定义。
将mypmta.thetucks.com.pem文件放在服务器的/etc/pmta目录中。
将以下内容添加到我的/etc/pmta/config中并重启pmta服务。(这里,这些指令被写在全局范围内;在生产系统中,你可能更愿意将它们添加到virtual-mta下。)
host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *> dkim-sign yes </domain>
通过MX Toolbox检查DNS记录无误,DKIM现在已激活。

3. SMTP 注入倾向于势头
Momentum支持各种消息注入方式,包括API和SMTP。SMTP是此处使用的方法,用于已运行Momentum的主机。我们将保持其配置不变,因为它已经具备接受其他已批准主机的传入注入的能力。
这是生产设置的缩小版本,其中“generation”节点和MTA节点是分开的,但通过私有VLAN和负载均衡器紧密耦合,携带内部SMTP注入流量。

与之前一样,安装了S/MIME工具,我们将向SMTP主机(MTA)的地址注入消息:
export SMTP_HOST=xx.xx.xx.xx # 在此设置您自己的MTA/VIP地址
同之前一样,我们已经在“generation”节点上拥有发件人的私钥(steve@thetucks.com.pem)和收件人的公钥(steve.tuck@sparkpost.com.crt)。消息文件的前几行与这些地址匹配。
我们使用与之前完全相同的命令从“generation”节点发送消息,消息显示在Inbox中。
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
正如您所预料的那样,S/MIME也与Momentum的DKIM签名愉快地共存。
4. SMTP injection towards SparkPost
在第2部分中,我们使用了SparkPost传输的REST API来注入消息。当然,也可以使用SMTP将消息注入到SparkPost中。我们设置环境变量如下:
export SMTP_PASSWORD=<<您的API密钥在这里>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587
如果您使用的是SparkPost欧盟托管服务,则将SMTP_HOST设置为smtp.eu.sparkpostmail.com。
(在此查看更多选项——例如您可以在2525端口而不是587端口注入。)
下面的输出显示使用了STARTTLS,以及用户名和密码。
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
您将看到:
打开的SMTP连接(STARTTLS)到smtp.sparkpostmail.com,端口587,用户="SMTP_Injection",密码="****************************************" 发送tests/fancy-HTML-to-smt.eml 来自:Steve <steve@thetucks.com> 至:SteveT <steve.tuck@sparkpost.com> OK - 在0.057秒内
密码以替换的***字符打印,因此如果有人在旁边看,您的密钥隐私不会受到威胁。
保护您的凭证
请注意,可以在shell脚本文件或类似文件中设置环境变量,以免重复输入。如果这样做,请通过限制对该文件的访问来保护您的密码/API密钥,仅限您自己。例如,如果您的凭证设置文件名为my_envs.sh,则运行:
chmod 0700 my_envs.sh
您可能看到的SMTP相关警告
SparkPost的SMTP注入非常严格,正如您对公共服务的期望一样。如果您没有设置SMTP端口号,您将看到以下警告:
{'bob.lumreeker@gmail.com': (550, b'5.7.1 拒绝中继')}
如果您没有设置SMTP用户名或没有设置密码,您将看到:
(530, b'5.7.1 需要授权。参考https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')
这些错误消息是直接从Python SMTP库报告的,因此格式保持不变。
哪一个更快 – SMTP 或 API?
坦白说,S/MIME 不太可能成为一个高使用量的用例,但拥有同一个工具的两个输出选项,就像是在要求我们来场比赛!
这里使用的“Avocado”电子邮件测试文件约为19KB。通过 bash 循环重复测试 10 次,显示 SMTP 和 API 的平均时间相似,每条消息大约 60 毫秒,非常快。在这种情况下,我们从与 SparkPost.com 相同托管区域的中型 EC2 实例中注入,这是保持网络往返时间低的好方法。
使用更大的测试文件(577KB)重复此操作,API 大约需要 200 毫秒,而 SMTP 每条消息需要 280 毫秒——对于一个大 30 倍的文件大小来说仍然令人印象深刻。当然,您的具体情况可能会因位置、互联网拥堵等而异,但性能可能不成问题。
如果您确实需要最大性能,一个良好的起点是根据我们的传输最佳实践建议启动固定数量的并行注入进程/会话——例如,从主管任务中进行。
总结……
我们已经看到在第2部分中使用的基于API的SparkPost工具如何更新,以支持SMTP注入,从而支持如Port25 PowerMTA和Momentum这类的本地MTA在各种配置中使用,以及与SparkPost一起使用。
就这样!祝发送愉快。