

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 Amazon SES 与 Sendmail 集成
<a name="send-email-sendmail"></a>

Sendmail 最初于 20 世纪 80 年代初发布，此后一直在不断改进。这是一个灵活且可配置的邮件传输代理 (MTA) 并拥有大型的用户社群。Sendmail 于 2013 年被 Proofpoint 收购，但 Proofpoint 继续提供开源版本的 Sendmail。您可以从 Proofpoint 网站或通过大多数 Linux 发行版的程序包管理器下载 [Sendmail 的开源版本](https://www.proofpoint.com/us/open-source-email-solution)。

本节中的操作步骤说明如何配置 Sendmail 以通过 Amazon SES 发送电子邮件。已在运行 Ubuntu 18.04.2 LTS 的服务器上测试此过程。

**注意**  
Sendmail 是第三方应用程序，不由 Amazon Web Services 开发或支持。本节中的步骤仅供参考，如有变更，恕不另行通知。

## 先决条件
<a name="send-email-sendmail-prerequisites"></a>

在完成本节中的过程之前，您应完成以下步骤：
+ 在您的服务器上安装 Sendmail 程序包。
**注意**  
根据您使用的操作系统发行版，可能还需要安装以下程序包：`sendmail-cf`、`m4` 和 `cyrus-sasl-plain`。
+ 验证要用作“From（发件人）”地址的身份。有关更多信息，请参阅 [创建电子邮件地址身份](creating-identities.md#verify-email-addresses-procedure)。

  如果您的账户仍在 Amazon SES 沙盒中，那么您还必须验证您将电子邮件发送到的地址。有关更多信息，请参阅 [请求生产访问权限（从 Amazon SES 沙盒中移出）](request-production-access.md)。

如果您使用 Amazon SES 从 Amazon EC2 实例发送电子邮件，那么您还应该完成以下步骤：
+ 您可能需要将弹性 IP 地址发送到 Amazon EC2 实例，以便接收电子邮件提供商接受您的电子邮件。有关更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 弹性 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)。
+ 默认情况下，Amazon Elastic Compute Cloud（Amazon EC2）会限制端口 25 上的电子邮件流量。为了避免在通过 SMTP 端点从 Amazon EC2 发送电子邮件时发生超时，您可以请求移除这些限制。有关更多信息，请参阅[如何从我的 Amazon EC2 实例或 AWS Lambda 函数中移除对端口 25 的限制？](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/) 在 AWS 知识中心中。

  或者，您可以修改本节中的操作步骤，以使用端口 587 而不是端口 25。

## 配置 Sendmail
<a name="send-email-sendmail-procedure"></a>

完成本节中的步骤，通过使用 Amazon SES 配置 Sendmail 来发送电子邮件。

**重要**  
本节中的步骤假设您想在美国西部（俄勒冈）使用 Amazon SES AWS 区域。如果您要使用其他区域，请将此过程中的所有 *email-smtp.us-west-2.amazonaws.com* 实例替换为所需区域的 SMTP 端点。有关可用 Amazon SES 的 SMTP 终端节点 URLs 列表，请参阅中的 AWS 区域 [亚马逊简单电子邮件服务 (Amazon SES) Service](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)。*AWS 一般参考*

**配置 Sendmail**

1. 在文件编辑器中，打开文件 `/etc/mail/authinfo`。如果该文件不存在，请创建它。

   在*/*中添加以下行etc/mail/authinfo：

   ```
   AuthInfo:email-smtp.us-west-2.amazonaws.com "U:root" "I:smtpUsername" "P:smtpPassword" "M:PLAIN"
   ```

   在前面的示例中，进行以下更改：
   + *email-smtp.us-west-2.amazonaws.com*替换为您要使用的 Amazon SES SMTP 终端节点。
   + *smtpUsername*替换为您的 Amazon SES SMTP 用户名。
   + *smtpPassword*替换为您的 Amazon SES SMTP 密码。
**注意**  
您的 SMTP 登录凭据不同于您的 AWS 访问密钥 ID 和私有访问密钥。有关获取您的 SMTP 登录凭证的更多信息，请参阅[获取 Amazon SES SMTP 凭证](smtp-credentials.md)。

   完成后，保存 `authinfo`。

1. 在命令行中，输入以下命令可生成 `/etc/mail/authinfo.db` 文件：

   ```
   sudo sh -c 'makemap hash /etc/mail/authinfo.db < /etc/mail/authinfo'
   ```

1. 在命令行中，键入以下命令可添加对中继到 Amazon SES SMTP 端点的支持。

   ```
   sudo sh -c 'echo "Connect:email-smtp.us-west-2.amazonaws.com RELAY" >> /etc/mail/access'
   ```

   在前面的命令中，*email-smtp.us-west-2.amazonaws.com*替换为您要使用的 Amazon SES SMTP 终端节点的地址。

1. 在命令行中，键入以下命令以重新生成*/etc/mail/access.db*：

   ```
   sudo sh -c 'makemap hash /etc/mail/access.db < /etc/mail/access'
   ```

1. 在命令行中，键入以下命令可创建 `sendmail.cf` 和 `sendmail.mc` 文件的备份：

   ```
   sudo sh -c 'cp /etc/mail/sendmail.cf /etc/mail/sendmail_cf.backup && cp /etc/mail/sendmail.mc /etc/mail/sendmail_mc.backup'
   ```

1. 将以下几行添加到*/etc/mail/sendmail.mc* 文件中，然后再进行任何`MAILER()`定义。

   ```
   define(`SMART_HOST', `email-smtp.us-west-2.amazonaws.com')dnl
   define(`RELAY_MAILER_ARGS', `TCP $h 25')dnl
   define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl
   FEATURE(`authinfo', `hash -o /etc/mail/authinfo.db')dnl
   MASQUERADE_AS(`example.com')dnl
   FEATURE(masquerade_envelope)dnl
   FEATURE(masquerade_entire_domain)dnl
   ```

   在上述文本中，执行以下操作：
   + *email-smtp.us-west-2.amazonaws.com*替换为您要使用的 Amazon SES SMTP 终端节点。
   + *example.com*替换为您要用于发送电子邮件的域名。

   完成后，保存该文件。
**注意**  
Amazon EC2 默认情况下限制端口 25 上的通信。如果您在 Amazon EC2 实例中使用 Sendmail，则应完成[请求删除电子邮件发送限制](https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request)。

1. 在命令行中，键入以下命令可将 *sendmail.cf* 设为可写：

   ```
   sudo chmod 666 /etc/mail/sendmail.cf
   ```

1. 在命令行中，键入以下命令可重新生成 *sendmail.cf*：

   ```
   sudo sh -c 'm4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf'
   ```
**注意**  
如果您遇到“Command not found（找不到命令）”和“No such file or directory（无此类文件或目录）”等错误，请确保您的系统上安装了 `m4` 和 `sendmail-cf` 程序包。

1. 在命令行中，键入以下命令可将 *sendmail.cf* 的权限重置为只读：

   ```
   sudo chmod 644 /etc/mail/sendmail.cf
   ```

1. 在命令行中，键入以下命令可重新启动 Sendmail：

   ```
   sudo /etc/init.d/sendmail restart
   ```

   *如果上述方法不起作用，请尝试以下操作，具体取决于 Linux 或 Sendmail 的版本：*

   ```
   sudo su service sendmail restart
   ```

1. 完成以下步骤可发送测试电子邮件：

   1. 在命令行输入以下命令。

      ```
      /usr/sbin/sendmail -vf sender@example.com recipient@example.com
      ```

      *sender@example.com*替换为您的 “发件人” 电子邮件地址。*recipient@example.com*替换为收件人地址。完成后，按 Enter。

   1. 输入以下消息内容。在每行的结尾处按 Enter。

      ```
      From: sender@example.com
      To: recipient@example.com
      Subject: Amazon SES test email
      
      This is a test message sent from Amazon SES using Sendmail.
      ```

      在输入完电子邮件内容后，按 Ctrl\$1D 发送电子邮件。

1. 检查收件人的电子邮件客户端是否收到这封电子邮件。如果您无法找到电子邮件，请检查垃圾邮件文件夹。如果您仍无法找到电子邮件，请查看邮件服务器上的 Sendmail 日志。日志通常位于*/var/log/mail.log* 或*/var/log/maillog*。