如何在Ubuntu20.04上安装和配置Postfix作为仅发送SMTP服务器

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。

介绍

Postfix是一个邮件传输代理(MTA),一个用于收发邮件的应用程序。 可以对其进行配置,使其仅可用于本地应用程序发送电子邮件。 这在您需要定期从应用程序发送电子邮件通知或有大量第三方电子邮件服务提供商不允许的出站流量的情况下很有用。 它也是运行成熟的 SMTP 服务器的更轻量级的替代方案,同时保留了所需的功能。

在本教程中,您将安装 Postfix 并将其配置为只发送 SMTP 服务器。 您还将为您的域从 Let's Encrypt 请求免费 TLS 证书,并使用它们加密出站电子邮件。

先决条件

设置和维护您自己的邮件服务器既复杂又耗时。 对于大多数用户而言,转而依赖付费邮件服务更为实用。 如果您正在考虑运行自己的邮件服务器,我们鼓励您查看 这篇文章,了解您可能不想这样做的原因

如果您确定要按照本指南安装和配置 Postfix,那么您首先必须具备以下条件:

  • 一台使用 Ubuntu 20.04 Initial Server Setup 设置的 Ubuntu 20.04 服务器,包括创建 sudo 非 root 用户。
  • 完全注册的域名。 本教程将自始至终使用 your_domain。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。
  • A DNS 记录,其中 your_domain 指向您服务器的公共 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 为您的域请求免费 TLS 证书(使用 Certbot)并配置 Postfix 以在发送消息时使用它来启用 SMTP 加密。

Ubuntu 在其默认软件包存储库中包含 Certbot,因此您可以通过运行以下命令来安装它:

sudo apt install certbot

当要求确认时,输入 Y 并按 ENTER

作为先决条件中初始服务器设置的一部分,您安装了简单的防火墙 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_tls_security_level=may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
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
smtpd_tls_security_level=may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
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 记录 ,以便您的服务器的电子邮件更有可能被视为合法的。