如何在Ubuntu18.04上安装和配置Postfix作为仅发送SMTP服务器
作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。
介绍
Postfix 是一个 邮件传输代理 (MTA),一个用于发送和接收电子邮件的应用程序。 可以对其进行配置,使其仅可用于本地应用程序发送电子邮件。 这在您需要定期从应用程序发送电子邮件通知或只是有大量第三方电子邮件服务提供商不允许的出站流量的情况下很有用。 它也是运行成熟的 SMTP 服务器的更轻量级的替代方案,同时保留了所需的功能。
在本教程中,您将安装 Postfix 并将其配置为只发送 SMTP 服务器。 您还将从 Let's Encrypt 为您的域请求免费的 TLS 证书,并使用它们加密出站电子邮件。
先决条件
- 一台使用 Ubuntu 18.04 的 初始服务器设置的 Ubuntu 18.04 服务器,包括创建 sudo 非 root 用户。
- 完全注册的域名。 本教程将自始至终使用
your_domain
。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。 your_domain
的 A DNS 记录指向您服务器的公共 IP 地址。 您可以关注这个介绍到DigitalOcean DNS,详细了解如何添加它们。
注意:你的服务器的主机名和你的Droplet的名字必须匹配your_domain
,因为DigitalOcean会根据它的名字自动为Droplet的IP地址设置PTR记录。
您可以通过在命令提示符处键入 hostname
来验证服务器的主机名。 输出应与您在创建 Droplet 时为其指定的名称匹配。
第 1 步 — 安装 Postfix
在此步骤中,您将安装 Postfix。 最快的方法是安装 mailutils
软件包,它将 Postfix 与一些用于测试发送电子邮件的补充程序捆绑在一起。
首先,更新包数据库:
sudo apt update
然后,通过运行以下命令安装 Postfix:
sudo apt install mailutils
在安装过程即将结束时,您将看到 Postfix 配置窗口:
默认选项是 Internet Site
。 这是针对您的用例的推荐选项,因此请按 TAB
,然后按 ENTER
。 如果您只看到描述文本,请按 TAB
选择 OK
,然后按 ENTER
。
如果它没有自动显示,请运行以下命令来启动它:
sudo dpkg-reconfigure postfix
之后,你会得到另一个关于系统邮件名称的配置提示:
系统邮件名称 必须与您在创建服务器时分配给服务器的名称相同。 完成后,按 TAB
,然后按 ENTER
。
您现在已经安装了 Postfix 并准备开始配置它。
第 2 步 — 配置 Postfix
在此步骤中,您将配置 Postfix 以仅从运行它的服务器(即从 localhost
)发送和接收电子邮件。
为此,需要将 Postfix 配置为仅侦听 环回接口 ,这是服务器用于内部通信的虚拟网络接口。 要进行更改,您需要编辑名为 main.cf
的主 Postfix 配置文件,该文件存储在 etc/postfix
下。
使用您喜欢的文本编辑器打开它进行编辑:
sudo nano /etc/postfix/main.cf
找到以下几行:
/etc/postfix/main.cf
. . . mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all . . .
将 inet_interfaces
设置的值设置为 loopback-only
:
/etc/postfix/main.cf
. . . mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = loopback-only . . .
您需要修改的另一个指令是 mydestination
,它用于指定通过 local_transport
邮件传递传输传递的域列表。 默认情况下,这些值与以下类似:
/etc/postfix/main.cf
. . . mydestination = $myhostname, your_domain, localhost.com, , localhost . . .
将行更改为如下所示:
/etc/postfix/main.cf
. . . mydestination = localhost.$mydomain, localhost, $myhostname . . .
如果您的域实际上是一个子域,并且您希望电子邮件看起来像是从主域发送的,则可以将以下行添加到 main.cf
的末尾:
/etc/postfix/main.cf
... masquerade_domains = your_main_domain
可选的 masquerade_domains
设置指定将在电子邮件地址中剥离子域部分的域。
完成后,保存并关闭文件。
注意: 如果您在单个服务器上托管多个域,其他域也可以使用 mydestination
指令传递给 Postfix。
然后,通过运行以下命令重新启动 Postfix:
sudo systemctl restart postfix
您已将 Postfix 配置为仅从您的服务器发送电子邮件。 您现在将通过向电子邮件地址发送示例消息来对其进行测试。
第 3 步 — 测试 SMTP 服务器
在此步骤中,您将测试 Postfix 是否可以使用 mail
命令向外部电子邮件帐户发送电子邮件,该命令是您在第一步中安装的 mailutils
软件包的一部分。
要发送测试电子邮件,请运行以下命令:
echo "This is the body of the email" | mail -s "This is the subject line" your_email_address
您可以根据自己的喜好更改电子邮件的正文和主题。 请记住将 your_email_address
替换为您可以访问的有效电子邮件地址。
现在,检查您发送此消息的电子邮件地址。 您应该会在收件箱中看到该消息。 如果它不存在,请检查您的垃圾邮件文件夹。 此时,您发送的所有电子邮件都是未加密的,这使服务提供商认为它很可能是垃圾邮件。 您稍后将在第 5 步中设置加密。
如果您收到来自 mail
命令的错误,或者长时间未收到消息,请检查您编辑的 Postfix 配置是否有效,并且您的服务器名称和主机名是否设置为您的域.
请注意,使用此配置,您发送的测试电子邮件的 From
字段中的地址将采用 your_user_name@your_domain
的形式,其中 your_user_name
是服务器用户的用户名您将命令运行为。
您现在已经从您的服务器发送了一封电子邮件并验证它已成功接收。 在下一步中,您将为 root
设置电子邮件转发。
第 4 步 — 转发系统邮件
在此步骤中,您将为用户 root
设置电子邮件转发,以便系统生成的在您的服务器上发送给它的消息被转发到外部电子邮件地址。
/etc/aliases
文件包含电子邮件收件人的备用名称列表。 打开它进行编辑:
sudo nano /etc/aliases
在其默认状态下,它看起来像这样:
/etc/别名
# See man 5 aliases for format postmaster: root
唯一存在的指令指定系统生成的电子邮件被发送到 root
。
将以下行添加到文件末尾:
/etc/别名
... root: your_email_address
使用此行,您指定发送到 root
的电子邮件最终被转发到一个电子邮件地址。 请记住将 your_email_address
替换为您的个人电子邮件地址。 完成后,保存并关闭文件。
要使更改生效,请运行以下命令:
sudo newaliases
运行 newaliases
将建立一个别名数据库,供 mail
命令使用,这些别名取自您刚刚编辑的配置文件。
通过运行以下命令测试向 root
发送电子邮件是否有效:
echo "This is the body of the email" | mail -s "This is the subject line" root
您应该在您的电子邮件地址收到电子邮件。 如果它不存在,请检查您的垃圾邮件文件夹。
在此步骤中,您已设置将系统生成的消息转发到您的电子邮件地址。 您现在将启用邮件加密,这样您的服务器发送的所有电子邮件都不会在传输过程中被篡改,并且会被视为更合法。
第 5 步 — 启用 SMTP 加密
现在,您将通过从 Let's Encrypt 为您的域(使用 Certbot)请求免费 TLS 证书并配置 Postfix 以在发送消息时使用它来启用 SMTP 加密。
Ubuntu 在其默认软件包存储库中包含 Certbot,但它可能已过时。 相反,您将通过运行以下命令来添加官方存储库:
sudo add-apt-repository ppa:certbot/certbot
提示接受时按 ENTER
。 然后,更新服务器的包管理器缓存:
sudo apt update
最后,安装最新版本的 Certbot:
sudo apt install certbot -y
作为先决条件中初始服务器设置的一部分,您安装了简单的防火墙 ufw
。 您需要将其配置为允许 HTTP 端口 80
,以便完成域验证。 运行以下命令以启用它:
sudo ufw allow 80
输出将如下所示:
OutputRule added Rule added (v6)
现在端口已打开,运行 Certbot 以获取证书:
sudo certbot certonly --standalone --rsa-key-size 4096 --agree-tos --preferred-challenges http -d your_domain
此命令命令 Certbot 颁发 RSA 密钥大小为 4096 位的证书,运行临时独立 Web 服务器 (--standalone
) 进行验证,并通过端口 80
([ X193X])。 请记住在运行命令之前将 your_domain
替换为您的域,并在出现提示时输入您的电子邮件地址。
输出将与此类似:
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator standalone, Installer None Obtaining a new certificate Performing the following challenges: http-01 challenge for `your_domain` Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your_domain/privkey.pem Your cert will expire on 2020-07-11. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
如注释中所述,您的证书和私钥文件保存在 /etc/letsencrypt/live/your_domain
下。
现在您有了证书,打开 main.cf
进行编辑:
sudo nano /etc/postfix/main.cf
找到以下部分:
/etc/postfix/main.cf
# TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
将其修改为如下所示,必要时将 your_domain
替换为您的域,这将更新 Postfix 的 TLS 设置:
/etc/postfix/main.cf
# TLS parameters smtpd_tls_cert_file=/etc/letsencrypt/live/your_domain/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/your_domain/privkey.pem smtp_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
完成后,保存并关闭文件。
通过重新启动 Postfix 应用更改:
sudo systemctl restart postfix
现在,尝试再次发送电子邮件:
echo "This is the body of an encrypted email" | mail -s "This is the subject line" your_email_address
然后,检查您提供的电子邮件地址。 您可能会立即在收件箱中看到该邮件,因为电子邮件提供商更有可能将未加密的邮件标记为垃圾邮件。
您可以在客户端中检查有关电子邮件的技术信息,以查看该消息确实已加密。
结论
您现在拥有一个由 Postfix 提供支持的只发送电子邮件服务器。 加密所有外发邮件是电子邮件提供商不将您的邮件完全标记为垃圾邮件的良好第一步。 如果您在开发场景中执行此操作,那么此措施就足够了。
但是,如果您的用例是向潜在的站点用户发送电子邮件(例如用于留言板注册的确认电子邮件),您应该查看 设置 SPF 记录 ,以便您的服务器的电子邮件是均匀的更有可能被视为合法的。