作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠。
介绍
Postfix 是一个邮件传输代理(MTA),一个用于发送和接收电子邮件的应用程序。它可以配置为仅用于通过本地应用程序发送电子邮件。当您需要定期从您的应用程序发送电子邮件通知或只是有大量第三方电子邮件服务提供商不允许的出站流量时,这很有用。它也是运行成熟的 SMTP 服务器的一种更轻松的替代方案,同时保留了所需的功能。
在本教程中,您将安装 Postfix 并将其配置为仅发送 SMTP 服务器。您还将从 Let’s Encrypt 为您的域请求免费的 TLS 证书,并使用它们加密出站电子邮件。
先决条件
- 一台 Ubuntu 18.04 服务器设置了 Ubuntu 18.04 的初始服务器设置,包括创建一个 sudo 非 root 用户。
- 完全注册的域名。本教程将
your_domain
贯穿始终。你可以购买一个域名Namecheap,免费获得一个在Freenom,或使用你选择的域名注册商。 your_domain
指向您服务器的公共 IP 地址的 A DNS 记录。您可以按照此介绍给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 配置为仅侦听环回接口,即服务器用于内部通信的虚拟网络接口。要进行更改,您需要编辑名为 的主 Postfix 配置文件main.cf
,该文件存储在etc/postfix
.
使用您喜欢的文本编辑器打开它进行编辑:
- sudo nano /etc/postfix/main.cf
找到以下几行:
. . .
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
. . .
将设置值inet_interfaces
设置为loopback-only
:
. . .
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
. . .
您需要修改的另一个指令是mydestination
,它用于指定通过local_transport
邮件传送传输传送的域列表。默认情况下,这些值类似于以下内容:
. . .
mydestination = $myhostname, your_domain, localhost.com, , localhost
. . .
将行更改为如下所示:
. . .
mydestination = localhost.$mydomain, localhost, $myhostname
. . .
如果您的域实际上是一个子域,并且您希望电子邮件看起来像是从主域发送的,您可以将以下行添加到 的末尾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 — 转发系统邮件
在此步骤中,您将为 user 设置电子邮件转发root
,以便将系统生成的发送到您服务器上的邮件转发到外部电子邮件地址。
该/etc/aliases
文件包含电子邮件收件人的备用名称列表。打开它进行编辑:
- sudo nano /etc/aliases
在默认状态下,它看起来像这样:
# See man 5 aliases for format
postmaster: root
唯一存在的指令指定系统生成的电子邮件发送到root
.
将以下行添加到文件末尾:
...
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
( --preferred-challenges http
)进行检查。请记住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
找到以下部分:
# 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 设置:
# 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 记录,这样您服务器的电子邮件更有可能被视为合法的。