Amazon Simple Email Service
开发人员指南

将 Amazon SES 与 Postfix 集成

Postfix 是广泛使用的 Sendmail 邮件传输代理 (MTA) 的替代品。有关 Postfix 的更多信息,请转到 http://www.postfix.org。本主题中的步骤适用于 Linux, macOS, or Unix。

先决条件

完成此部分中的过程之前,必须先执行以下任务:

  • 卸载 Sendmail (如果它已安装在您的系统中)。根据您使用的不同操作系统,完成此步骤的过程会有差异。

  • 安装 Postfix。根据您使用的不同操作系统,完成此步骤的过程会有差异。

  • 安装 SASL 身份验证软件包。根据您使用的不同操作系统,完成此步骤的过程会有差异。例如,如果您使用基于 RedHat 的系统,则应安装 cyrus-sasl-plain 软件包。如果您使用基于 Debian 或 Ubuntu 的系统,则应安装 libsasl2-modules 软件包。

  • 验证您用来发送电子邮件的电子邮件地址或域。如果您的账户仍在沙盒中,则还需要验证您计划将电子邮件发送到的每个地址。有关更多信息,请参阅在 Amazon SES 中验证电子邮件地址

  • 如果要从 Amazon EC2 实例通过 Amazon SES 发送电子邮件,则向您的 Amazon EC2 实例分配弹性 IP 地址,以便让接收 ISP 接受您的电子邮件。有关更多信息,请参阅 Amazon EC2 弹性 IP 地址

配置 Postfix

完成以下步骤以配置您的邮件服务器,使用 Postfix 经由 Amazon SES 发送电子邮件。

配置 Postfix

  1. 在命令行处,键入以下命令:

    sudo postconf -e "relayhost = [email-smtp.us-west-2.amazonaws.com]:587" \ "smtp_sasl_auth_enable = yes" \ "smtp_sasl_security_options = noanonymous" \ "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \ "smtp_use_tls = yes" \ "smtp_tls_security_level = encrypt" \ "smtp_tls_note_starttls_offer = yes"

    注意

    如果在美国西部(俄勒冈)之外的 AWS 区域使用 Amazon SES,请将上述命令中的 email-smtp.us-west-2.amazonaws.com 替换为相应区域的 SMTP 终端节点。有关更多信息,请参阅区域和 Amazon SES

  2. 在文本编辑器中,打开文件 /etc/postfix/master.cf。搜索以下条目:

    -o smtp_fallback_relay=

    如果找到此条目,请在行首放置 #(井号)字符将其注释掉。保存并关闭 文件。

    如果此条目不存在,请继续下一步。

  3. 在文本编辑器中,打开文件 /etc/postfix/sasl_passwd。如果该文件尚不存在,请创建它。

  4. 将以下行添加到 /etc/postfix/sasl_passwd

    [email-smtp.us-west-2.amazonaws.com]:587 SMTPUSERNAME:SMTPPASSWORD

    注意

    SMTPUSERNAMESMTPPASSWORD 分别替换为您的 SMTP 用户名和密码。您的 SMTP 用户名和密码与您的 AWS 访问密钥 ID 和秘密访问密钥不同。有关凭证的更多信息,请参阅获取 Amazon SES SMTP 凭证

    如果在美国西部(俄勒冈)之外的 AWS 区域使用 Amazon SES,请将上面示例中的 email-smtp.us-west-2.amazonaws.com 替换为相应区域的 SMTP 终端节点。有关更多信息,请参阅 区域和 Amazon SES

    是否保存并关闭 sasl_passwd.

  5. 在命令提示符处,键入以下命令以创建一个包含您的 SMTP 凭证的 Hashmap 数据库文件:

    sudo postmap hash:/etc/postfix/sasl_passwd
  6. (可选)您在之前的步骤中创建的 /etc/postfix/sasl_passwd/etc/postfix/sasl_passwd.db 文件未加密。由于这些文件包含您的 SMTP 凭证,我们建议您修改这些文件的所有权和权限以限制对它们的访问。要限制对这些文件的访问,请执行以下操作:

    1. 在命令提示符处,键入以下命令以更改文件的所有权:

      sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
    2. 在命令提示符处,键入以下命令以更改文件的权限,以便仅根用户可读取和写入它们:

      sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
  7. 告诉 Postfix 在何处查找 CA 证书 (验证 Amazon SES 服务器证书需要它)。您在此步骤中使用的命令因所用操作系统而异。

    • 如果您使用 Amazon Linux、Red Hat Enterprise Linux 或相关分发,请键入以下命令:

      sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
    • 如果您使用 Ubuntu 或相关分发,请键入以下命令:

      sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt'
    • 如果您使用 macOS,则可通过您的系统密钥链生成证书。要生成证书,请在命令行处键入以下命令:

      sudo security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain > /etc/ssl/certs/ca-bundle.crt

      生成证书之后,请键入以下命令:

      sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
  8. 键入以下命令以启动 Postfix 服务器(或在服务器已在运行的情况下,重新加载配置设置):

    sudo postfix start; sudo postfix reload
  9. 在命令行键入以下命令并在每行后按 Enter 以发送测试电子邮件。将 sender@example.com 替换为发件人电子邮件地址。发件人地址必须经过验证才能用于 Amazon SES。将 recipient@example.com 替换为目标地址。如果您的账户仍处于沙盒中,则还必须验证收件人地址。最后,邮件最后一行只能包含一个句点 (.),不能再有其他内容。

    sendmail -f sender@example.com recipient@example.com From: Sender Name <sender@example.com> Subject: Amazon SES Test This message was sent using Amazon SES. .
  10. 检查与收件人地址关联的邮箱。如果未收到电子邮件,请检查您的垃圾邮件文件夹。如果您仍然无法找到电子邮件,请检查用于发送电子邮件的系统上的邮件日志(通常位于 /var/log/maillog)以了解更多信息。

高级使用示例

此示例演示如何发送使用配置集的电子邮件,以及如何使用 MIME 多部分编码发送纯文本和 HTML 版本的消息以及附件。它还包含一个链接标签,可用于为单击事件分类。电子邮件的内容将在一个外部文件中指定,因此您不必在 Postfix 会话中手动键入命令。

使用 Postfix 发送多部分 MIME 电子邮件

  1. 在文本编辑器中,创建一个名为 mime-email.txt 的新文件。

  2. 在文本文件中,粘贴以下内容,并将红色的值替换为适用于您的账户的值:

    X-SES-CONFIGURATION-SET:ConfigSet From:Sender Name <sender@example.com> Subject:Amazon SES Test MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="YWVhZDFlY2QzMGQ2N2U0YTZmODU" --YWVhZDFlY2QzMGQ2N2U0YTZmODU Content-Type: multipart/alternative; boundary="3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ" --3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Amazon SES Test This message was sent from Amazon SES using the SMTP interface. For more information, see: http://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-smtp.html --3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <html> <head> </head> <body> <h1>Amazon SES Test</h1> <p>This message was sent from Amazon SES using the SMTP interface.</p> <p>For more information, see <a ses:tags="samplekey0:samplevalue0;samplekey1:samplevalue1;" href="http://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-smtp.html"> Using the Amazon SES SMTP Interface to Send Email</a> in the <em>Amazon SES Developer Guide</em>.</p> </body> </html> --3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ-- --YWVhZDFlY2QzMGQ2N2U0YTZmODU Content-Type: application/octet-stream MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="customers.txt" SUQsRmlyc3ROYW1lLExhc3ROYW1lLENvdW50cnkKMzQ4LEpvaG4sU3RpbGVzLENh bmFkYQo5MjM4OSxKaWUsTGl1LENoaW5hCjczNCxTaGlybGV5LFJvZHJpZ3VleixV bml0ZWQgU3RhdGVzCjI4OTMsQW5heWEsSXllbmdhcixJbmRpYQ== --YWVhZDFlY2QzMGQ2N2U0YTZmODU--

    保存并关闭 文件。

  3. 在命令行处,键入以下命令.将 sender@example.com 替换为您的电子邮件地址,将 recipient@example.com 替换为收件人的电子邮件地址。

    sendmail -f sender@example.com recipient@example.com < mime-email.txt

    如果该命令成功运行,它将退出并且不提供任何输出。

  4. 查看收件箱中是否有该电子邮件。如果该邮件未送达,请查看系统的邮件日志。

有关与 Amazon SES 相关的各种主题的信息和讨论,请参阅 AWS 消息收发和目标博客。要浏览并发布问题,请转到Amazon SES 论坛