如何使用 Postfix MTA 配置 AWS SES
Amazon Simple Email Service (SES) 是一种托管电子邮件服务,您可以使用您的电子邮件地址和域发送和接收电子邮件。通常,SES 用于发送批量电子邮件或路由电子邮件而无需托管 MTA。我们可以使用 Perl/Python/PHP API 通过 SES 发送电子邮件。另一种选择是配置运行 Postfix 的 Linux 或 Unix 框以通过 SES 路由所有外发电子邮件。
教程要求 | |
---|---|
要求 | 带有 Postfix 的 Ubuntu/Debian/RHEL/CentOS Linux |
Root 权限 | 是的 |
难度等级 | 中间的 |
预计阅读时间 | 5 分钟 |
使用 Postfix 配置 AWS SES 的过程
在开始使用 Amazon SES 和 Postfix 之前,您需要注册 AWS,包括 SES。您需要验证您的电子邮件地址和其他设置。确保您还创建了用于 SES 访问和下载凭证的用户。
步骤 1 – 卸载 Sendmail(如果已安装)
如果已安装 sendmail,请将其删除。Debian/Ubuntu Linux 用户输入以下apt 命令/ apt-get 命令:
$ sudo apt --purge remove sendmail
CentOS/RHEL 用户在 Fedora/CentOS/RHEL 8.x/9.x 上输入以下yum 命令或 dnf 命令:CentOS 8 服务器的示例输出:
$ sudo yum remove sendmail
$ sudo dnf remove sendmail
Dependencies resolved. =============================================================================== Package Architecture Version Repository Size =============================================================================== Removing: sendmail x86_64 8.15.2-32.el8 @AppStream 2.4 M Removing unused dependencies: cyrus-sasl x86_64 2.1.27-1.el8 @BaseOS 160 k procmail x86_64 3.22-47.el8 @AppStream 369 k Transaction Summary =============================================================================== Remove 3 Packages Freed space: 2.9 M Is this ok [y/N]: y
第 2 步:安装 postfix
在 CentOS/RHEL/Fedora Linux 上安装 Postfix 的步骤如下:
$ sudo dnf install postfix # < -- RHEL/CentOS 8.x/9.x or latest Fedora
$ sudo yum install postfix # < -- RHEL/CentOS v7.x/6.x
Last metadata expiration check: 0:42:33 ago on Sat May 30 16:13:57 2020. Dependencies resolved. =============================================================================== Package Architecture Version Repository Size =============================================================================== Installing: postfix x86_64 2:3.3.1-9.el8 BaseOS 1.5 M Transaction Summary =============================================================================== Install 1 Package Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]:
如果您使用的是 Debian 或 Ubuntu Linux,请运行:
$ sudo apt install postfix
当 apt 提示时,请确保选择“无配置”
步骤 3 - SASL 身份验证包
SASL表示简单身份验证和安全层。它是一种向基于连接的协议添加身份验证和安全支持的方法。换句话说,安装 SASL 身份验证包。例如,如果您使用 CentOS/RHEL/Fedora Linux,则应安装该cyrus-sasl-plain包:
$ sudo dnf install cyrus-sasl-plain # < -- RHEL/CentOS 8.x/9.x or latest Fedora
$ sudo yum install cyrus-sasl-plain # < -- RHEL/CentOS v7.x/6.x
Last metadata expiration check: 0:57:13 ago on Sat May 30 16:13:57 2020. Dependencies resolved. =============================================================================== Package Architecture Version Repository Size =============================================================================== Installing: cyrus-sasl-plain x86_64 2.1.27-1.el8 BaseOS 47 k Transaction Summary =============================================================================== Install 1 Package Total download size: 47 k Installed size: 46 k Is this ok [y/N]: y
如果您使用 Debian 或基于 Ubuntu 的 Linux 系统,则应按libsasl2-modules如下方式安装该软件包:
$ sudo apt install libsasl2-modules
步骤 4 – 为 Amazon SES 配置 postfix
让我们看看如何使用基于 Amazon SES 的智能主机将 Postfix 配置为传出 MTA。首先,设置 SES 区域:
# I am using US West (Oregon) # Feel free to replace MTA as per your AWS region SES_MTA="email-smtp.us-west-2.amazonaws.com"
Debian/Ubuntu Linux 用户输入以下cp 命令为您的 MTA 创建一个新的默认配置文件:
接下来运行 postconf 命令使用 Amazon SES 配置 Postfix:
$ sudo cp -v -i /etc/postfix/main.cf{.proto,}
'/etc/postfix/main.cf.proto' -> '/etc/postfix/main.cf'
sudo postconf -e "relayhost = [${SES_MTA}]: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"
为 MTA 设置 Amazon SES 用户名和密码
使用文本编辑器(例如 nano 命令/vim 命令)编辑 /etc/postfix/sasl_passwd,输入:
附加(替换AWS IMA/SES 提供的SMTP_USER和SMTP_PASSWORD ):
保存并关闭文件。首先使用 chmod 命令保护文件,然后创建一个新数据库:
在 Linux/Unix shell 提示符下,键入以下 postmap 命令以创建 MTA 凭据的哈希图数据库:
$ sudo vim /etc/postfix/sasl_passwd
## or ##
$ sudo nano /etc/postfix/sasl_passwd
[email-smtp.us-west-2.amazonaws.com]:587 SMTP_USER:SMTP_PASSWORD
$ sudo chmod -v 0600 /etc/postfix/sasl_passwd
mode of '/etc/postfix/sasl_passwd' changed from 0644 (rw-r--r--) to 0600 (rw-------)
$ sudo postmap -v hash:/etc/postfix/sasl_passwd
处理 setgid_group = 错误
您可能会收到以下错误:
postmap: fatal: bad string length 0 < 1: setgid_group =
请确保在 /etc/postfix/main.cf 中注释掉以下行:
#setgid_group =
再试一次:
$ sudo postmap hash:/etc/postfix/sasl_passwd
保护文件
使用 chown 命令和 chmod 命令如下:
$ sudo chown -v root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
$ sudo chmod -v 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
配置验证的CA证书路径
Postfix 服务器需要找到 CA 证书。因此,要验证 Amazon SES 服务器证书,请根据您的 Linux 发行版运行以下任一命令:
## CentOS/RHEL/Fedora Linux user ##
$ sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
## Debian/Ubuntu Linux ##
$ sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt'
步骤 5 - 使用 Linux/Unix CLI 测试配置
现在我们已将 Postfix 配置为使用 Amazon SES 作为智能主机。现在是时候启动 Postfix 服务器了。首先启用服务,运行以下 systemctl 命令:
启动或重新启动 Postfix:
或者
验证我们的 Postfix MTA 是否已启动且没有任何错误:
$ sudo systemctl enable postfix
$ sudo systemctl start postfix
$ sudo systemctl restart postfix
$ sudo systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
Active: active (exited) since Sat 2020-05-30 17:53:37 UTC; 2s ago
Process: 2758073 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 2758073 (code=exited, status=0/SUCCESS)
May 30 17:53:37 ncbz01 systemd[1]: Starting Postfix Mail Transport Agent...
May 30 17:53:37 ncbz01 systemd[1]: Finished Postfix Mail Transport Agent.
测试 Amazon SES 与 Postfix 的集成
使用 sendmail 命令如下(在安装 Postfix 服务器的地方输入命令,并将 webmaster@example.com 或 webmaster@example.com 替换为你的实际电子邮件 ID):我们还可以在 Debian 或 Ubuntu Linux 中使用apt 命令
安装 bsd-mailx 包并对其进行测试:
$ sendmail -f webmaster@example.com webmaster@example.com
From: Vivek Gite <webmaster@example.com>
Subject: Postfix email server integration with Amazon SES
This message was sent using Amazon SES on my Ubuntu Linux server
.
$ sudo apt install bsd-mailx
$ echo "This is a test email." \
| mail -r webmaster@example.com -s 'AWS SES test' webmaster@example.com
处理投递后消息
您可能会在屏幕上看到以下消息:
postdrop: warning: unable to look up public/pickup: No such file or directory
要修复此消息,请运行:
$ sudo mkfifo /var/spool/postfix/public/pickup
$ sudo systemctl restart posfix
查看 Postfix 电子邮件日志
运行以下 tail 命令或grep 命令:
示例输出表明消息是使用 Amzaon SES 从在 Ubuntu Linux 服务器上运行的本地 Postfix 发送的:
$ sudo tail -f /var/log/mail.log
$ sudo grep 'webmaster@nicraft.com' /var/log/mail.log
$ sudo grep 'webmaster@nicraft.com' /var/log/maillog #<-- centos/rhel
May 30 18:10:49 ncbz01 postfix/pickup[2770085]: 4F5B2A41631: uid=1000 from=<webmaster@example.com> May 30 18:10:49 ncbz01 postfix/cleanup[2777956]: 4F5B2A41631: message-id=<20200530181049.4F5B2A41631@ncbz01.localdomain> May 30 18:10:49 ncbz01 postfix/qmgr[2770086]: 4F5B2A41631: from=<webmaster@example.com>, size=419, nrcpt=1 (queue active) May 30 18:10:50 ncbz01 postfix/smtp[2777958]: 4F5B2A41631: to=<webmaster@example.com>, relay=email-smtp.us-west-2.amazonaws.com[34.216.173.41]:587, delay=7.7, delays=6.5/0.01/0.74/0.46, dsn=2.0.0, status=sent (250 Ok 0101017266c78163-2701b997-ab08-4fa1-ab16-e782a9262962-000000) May 30 18:10:50 ncbz01 postfix/qmgr[2770086]: 4F5B2A41631: removed
如果未找到 /var/log/mail.log 或 /var/log/maillog 文件,请尝试 journalctl 命令。例如:
以下是收件人在其邮箱中看到的内容:
$ sudo journalctl --unit postfix.service
## OR ##
$ sudo journalctl --unit postfix@-.service
## OR ##
$ sudo journalctl --unit system-postfix.slice
带有 Postfix 标头的 AWS SES
原始讯息
Message ID <0101017266c78163-2701b997-ab08-4fa1-ab16-e782a9262962-000000@us-west-2.amazonses.com> Created at: Sat, May 30, 2020 at 11:40 PM (Delivered after 1 second) From: Vivek Gite <webmaster@example.com> To: Webmaster <webmaster@example.com> Subject: Postfix email server integration with Amazon SES SPF: PASS with IP 54.240.27.192 Learn more DKIM: 'PASS' with domain example.com Learn more DMARC: 'PASS' Learn more
确保您设置了正确的 SPF、DKIM 和 DMARC。
关于系统生成的电子邮件的说明
通常,从以下地址发送的系统生成的电子邮件将被 AWS SES 拒绝,因为它们来自未经身份验证的域/电子邮件地址:
要解决此问题,请参阅我的页面“ Postfix 伪装或更改传出 SMTP 电子邮件或邮件地址”了解更多信息。
root@your-hostname
root@your-hostname-domain-dot-com
结论
在本教程中,我们学习了如何将 Postfix MTA 与 Amazon SES 云服务结合使用。我在 CentOS/RHEL 和 Debian/Ubuntu 服务器上测试了说明,这些服务器每天使用 Amazon SES 发送超过 10 万封电子邮件,电子邮件投递率很高。请参阅此处的 SES 文档了解更多信息。