如何使用Postfix MTA配置AWS SES

时间:2020-01-09 10:39:00  来源:igfitidea点击:

如何配置带有Postfix邮件服务器的Amazon SES在CentOS/RHEL/Fedora/Ubuntu/Debian Linux服务器下发送电子邮件?

Amazon Simple Email Service(SES)是一项托管电子邮件服务,可让您使用您的电子邮件地址和域发送和接收电子邮件。
通常,SES用于在不托管MTA的情况下发送批量电子邮件或路由电子邮件。
我们可以使用Perl/Python/PHP API通过SES发送电子邮件。
另一种选择是将运行Postfix的Linux或Unix机器配置为通过SES路由所有外发电子邮件。

使用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上执行以下yum命令或dnf命令:

$ sudo yum remove sendmail
$ sudo dnf remove sendmail

CentOS 8服务器的示例输出:

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安装后缀

在CentOS/RHEL/Fedora Linux上安装Postfix的过程如下:

$ sudo dnf install postfix # < -- RHEL/CentOS 8.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 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配置后缀

让我们看看如何使用基于Amazon SES的smarthost将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创建一个新的默认配置文件:

$ sudo cp -v -i /etc/postfix/main.cf{.proto,}
`'/etc/postfix/main.cf.proto' -> '/etc/postfix/main.cf'`

接下来运行postconf命令以使用Amazon SES配置Postfix:

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 USERNAME和PASSWORD

使用文本编辑器(例如NA命令/vim命令)编辑/etc/postfix/sasl_passwd,执行:

$ sudo vim /etc/postfix/sasl_passwd
## or ##
$ sudo nano /etc/postfix/sasl_passwd

追加(替换AWS IMA/SES提供的SMTP_USER和SMTP_PASSWORD):

[email-smtp.us-west-2.amazonaws.com]:587 SMTP_USER:SMTP_PASSWORD

保存并关闭文件。
首先使用chmod命令保护文件安全,然后创建一个新数据库:

$ sudo chmod -v 0600 /etc/postfix/sasl_passwd
`mode of '/etc/postfix/sasl_passwd' changed from 0644 (rw-r--r--) to 0600 (rw-------)`

在Linux/Unix Shell提示符下,执行以下postmap命令以创建用于MTA凭据的哈希表数据库:

$ 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命令:

$ sudo systemctl enable postfix

启动或重新启动Postfix:

$ sudo systemctl start postfix

或者

$ sudo systemctl restart postfix

验证我们的Postfix MTA是否已正确启动:

$ 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命令,如下所示:

sendmail -f [email protected] [email protected]
From:  <[email protected]>
Subject: Postfix email server integration with Amazon SES
This message was sent using Amazon SES on my Ubuntu Linux server
.

我们还可以安装bsd-mailx软件包并按以下方式对其进行测试:

$ sudo apt install bsd-mailx
$ echo "This is a test email." \
| mail -r [email protected] -s 'AWS SES test' [email protected]
处理后置消息

您可能会在屏幕上看到以下消息:

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命令:

$ sudo tail -f /var/log/mail.log
$ sudo grep '[email protected]' /var/log/mail.log
$ sudo grep '[email protected]' /var/log/maillog ## centos/rhel ##

指示消息已从Ubuntu Linux服务器上运行的本地Postfix使用Amzaon SES发送的示例输出:

May 30 18:10:49 ncbz01 postfix/pickup[2770085]: 4F5B2A41631: uid=1000 from=<[email protected]>
May 30 18:10:49 ncbz01 postfix/cleanup[2777956]: 4F5B2A41631: message-id=<[email protected]>
May 30 18:10:49 ncbz01 postfix/qmgr[2770086]: 4F5B2A41631: from=<[email protected]>, size=419, nrcpt=1 (queue active)
May 30 18:10:50 ncbz01 postfix/smtp[2777958]: 4F5B2A41631: to=<[email protected]>, 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

这是收件人在其邮箱中看到的内容:

带有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:	 <[email protected]>
To:	Webmaster <[email protected]>
Subject: Postfix email server integration with Amazon SES
SPF:	PASS with IP 54.240.27.192 Learn more
DKIM:	'PASS' with domain theitroad.local Learn more
DMARC:	'PASS' Learn more

确保设置正确的SPF,DKIM和DMARC。

关于系统生成的电子邮件的说明

通常,从以下地址发送的系统生成的电子邮件将被AWS SES拒绝,因为它们来自未经身份验证的域/电子邮件地址:

root@your-hostname
root@your-hostname-domain-dot-com

要解决此问题,请参阅我的页面"伪装或更改传出SMTP电子邮件或邮件地址的后缀",以获取更多信息。