如何在 Ubuntu 20.04 上将 Postfix 安装和配置为仅发送邮件的 SMTP 服务器

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

Postfix是一个 mail transfer agent (MTA),用于发送和接收电子邮件的应用程序. 它可以配置为只能通过本地应用程序发送电子邮件。 这在需要定期从应用程序发送电子邮件通知的情况下非常有用,或者有很多第三方电子邮件服务提供商不允许的输出流量。

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

<$>[注] :截至2022年6月22日,DigitalOcean正在阻止所有新帐户的SMTP。作为这一新政策的一部分,我们已经与SendGrid合作,以便我们的客户仍然可以轻松地发送电子邮件。

前提条件

设置和维护自己的邮件服务器是复杂和耗时的。对于大多数用户来说,更实用的是依靠付费邮件服务。如果您正在考虑运行自己的邮件服务器,我们鼓励您审查(为什么您可能不想这样做)(https://andsky.com/tech/tutorials/why-you-may-not-want-to-run-your-own-mail-server)。

如果您确定要遵循此指南来安装和配置 Postfix,那么您必须首先具备以下内容:

  • 一个 Ubuntu 20.04 服务器与 Initial Server Setup with Ubuntu 20.04一起设置,包括创建一个 sudo 非根用户。
  • 一个完全注册的域名. 本教程将使用your_domain在整个过程中。您可以在 Namecheap上购买域名,在 Freenom上免费获取一个域名,或使用您选择的域名注册器。
  • 一个 A DNS 记录与your_domain指向您的服务器的公共 IP 地址。

<$>[注] 注: 您的服务器的主机名和您的Droplet的名称必须匹配 your_domain,因为DigitalOcean根据其名称自动为Droplet的IP地址设置PTR记录。

您可以通过在命令提示中键入hostname来验证服务器的主机名称. 输出应与您在创建时给 Droplet 的名称匹配。

步骤 1 - 安装 Postfix

在此步骤中,您将安装Postfix. 最快的方法是安装mailutils包,该包将Postfix与一些额外的程序组合在一起,您将使用这些程序来测试发送电子邮件。

首先,更新包数据库:

1sudo apt update

然后,通过运行以下命令来安装 Postfix:

1sudo apt install mailutils

安装过程结束后,您将看到Postfix配置窗口:

Select Internet Site from the menu, then press TAB to select <Ok>, then ENTER

默认选项是互联网网站。这就是您使用案例的推荐选项,所以按TAB,然后按ENTER。如果你只看到描述文本,按TAB,选择OK,然后按ENTER

如果它没有自动显示,请运行以下命令来启动它:

1sudo dpkg-reconfigure postfix

之后,您将收到有关 系统邮件名称 的另一个配置提示:

Enter your domain name, then press TAB to select <Ok>, ENTER

系统邮件名称必须与您在创建时分配给服务器的名称相同。

您已经安装了 Postfix 并已准备好开始配置。

步骤 2 – 配置 Postfix

在此步骤中,您将配置 Postfix 以仅从运行服务器发送和接收电子邮件,即从本地主机发送。

要做到这一点,您需要配置 Postfix 仅在 _loopback 界面上聆听,这是服务器使用的虚拟网络界面,用于内部通信. 要进行更改,您需要编辑名为 main.cf 的主要 Postfix 配置文件,存储在 etc/postfix 下。

打开它以使用您最喜欢的文本编辑器进行编辑:

1sudo nano /etc/postfix/main.cf

找出以下几条线:

1[label /etc/postfix/main.cf]
2. . .
3mailbox_size_limit = 0
4recipient_delimiter = +
5inet_interfaces = all
6. . .

inet_interfaces设置的值设置为loopback-only:

1[label /etc/postfix/main.cf]
2. . .
3mailbox_size_limit = 0
4recipient_delimiter = +
5inet_interfaces = loopback-only
6. . .

您需要修改的另一个指令是mydestination,该指令指定了通过local_transport邮件交付运输交付的域名列表。

1[label /etc/postfix/main.cf]
2. . .
3mydestination = $myhostname, your_domain, localhost.com, , localhost
4. . .

更改线条,看起来像这样:

1[label /etc/postfix/main.cf]
2. . .
3mydestination = localhost.$mydomain, localhost, $myhostname
4. . .

如果您的域实际上是一个子域,并且您希望电子邮件消息看起来像是从主域发送的,您可以将下面的行添加到main.cf的末尾:

1[label /etc/postfix/main.cf]
2...
3masquerade_domains = your_main_domain

可选的masquerade_domains设置将指定在电子邮件地址中删除子域的域名。

完成后,保存并关闭文件。

<$>[注] 注: 如果您在单个服务器上托管多个域,则可以使用mydestination指令将其他域传送到Postfix。

然后,通过运行以下命令重新启动 Postfix:

1sudo systemctl restart postfix

您已配置 Postfix 以仅从您的服务器发送电子邮件,您现在将通过向电子邮件地址发送示例消息来测试它。

第3步:测试SMTP服务器

在此步骤中,您将测试 Postfix 是否可以使用邮件命令向外部电子邮件帐户发送电子邮件,该命令是您在第一步安装的mailutils包的一部分。

要发送测试电子邮件,运行以下命令:

1echo "This is the body of the email" | mail -s "This is the subject line" your_email_address

您可以根据自己的喜好更改电子邮件的内容和内容,请记住用您可以访问的有效电子邮件地址更换your_email_address

现在,检查您发送此消息的电子邮件地址. 您应该在您的收件箱中看到该消息. 如果它不在那里,请检查您的垃圾邮件文件夹. 在此时,您发送的所有电子邮件都未加密,这使得服务提供商认为它可能是垃圾邮件。 在步骤 5 中,您将在稍后设置加密。

如果您从邮件命令中收到错误,或者在长时间后没有收到消息,请检查您编辑的 Postfix 配置是否有效,并且您的服务器名称和主机名称已设置为您的域。

请注意,在此配置中,您发送的测试电子邮件的字段中的地址将以your_user_name@your_domain的形式,其中your_user_name是您运行命令为的服务器用户的用户名。

您现在已经从您的服务器发送了一封电子邮件,并确认它已成功接收,在下一步,您将设置root的电子邮件转发。

步骤4:发送系统邮件

在此步骤中,您将为用户root设置电子邮件转发,以便在您的服务器上发送的系统生成的消息被转发到外部电子邮件地址。

/etc/aliases 文件包含电子邮件收件人的替代名称列表. 打开以编辑:

1sudo nano /etc/aliases

在它的默认状态下,它看起来像这样:

1[label /etc/aliases]
2# See man 5 aliases for format
3postmaster:    root

目前唯一的指令规定,系统生成的电子邮件被发送到

将下列行添加到文件的末尾:

1[label /etc/aliases]
2...
3root:          your_email_address

使用此行,您指定发送到root的电子邮件最终会被转发到电子邮件地址. 请记住用您的个人电子邮件地址代替your_email_address

若要變更生效,請執行以下命令:

1sudo newaliases

运行newaliases将构建一个名称数据库,该名称由mail命令使用,这些名称是从您刚刚编辑的 config 文件中提取的。

测试将电子邮件发送到通过运行:

1echo "This is the body of the email" | mail -s "This is the subject line" root

您应该在您的电子邮件地址收到电子邮件,如果没有,请检查您的垃圾邮件文件夹。

在此步骤中,您将设置发送系统生成的消息到您的电子邮件地址. 您现在将启用消息加密,这样您的服务器发送的所有电子邮件都免受过境中篡改,并将被视为更合法的。

第5步:启用SMTP加密

现在,您将通过向 Let’s Encrypt 请求免费的 TLS 证书来启用 SMTP 加密(使用 Certbot)并配置 Postfix 来使用它来发送消息。

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

1sudo apt install certbot

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

作为初始服务器设置的一部分,您安装了ufw,一个简单的防火墙,您需要将其配置为允许HTTP端口80,以便完成域验证。

1sudo ufw allow 80

结果将是这样的:

1[secondary_label Output]
2Rule added
3Rule added (v6)

现在端口已打开,运行Certbot来获取证书:

1sudo certbot certonly --standalone --rsa-key-size 4096 --agree-tos --preferred-challenges http -d your_domain

此命令命令 Certbot 发行具有 4096 位 RSA 密钥大小的证书,运行临时独立的 Web 服务器 (--standalone) 进行验证,并通过端口 80 (--preferred-challenges http) 检查。

结果将类似于此:

 1[secondary_label Output]
 2Saving debug log to /var/log/letsencrypt/letsencrypt.log
 3Plugins selected: Authenticator standalone, Installer None
 4Obtaining a new certificate
 5Performing the following challenges:
 6http-01 challenge for `your_domain`
 7Waiting for verification...
 8Cleaning up challenges
 9
10IMPORTANT NOTES:
11- Congratulations! Your certificate and chain have been saved at:
12 /etc/letsencrypt/live/your_domain/fullchain.pem
13 Your key file has been saved at:
14 /etc/letsencrypt/live/your_domain/privkey.pem
15 Your cert will expire on 2020-07-11. To obtain a new or tweaked
16 version of this certificate in the future, simply run certbot
17 again. To non-interactively renew *all* of your certificates, run
18 "certbot renew"
19- If you like Certbot, please consider supporting our work by:
20
21 Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
22 Donating to EFF:                    https://eff.org/donate-le

正如在笔记中所写的那样,您的证书和私钥文件被保存在/etc/letsencrypt/live/your_domain下。

现在你有你的证书,打开main.cf编辑:

1sudo nano /etc/postfix/main.cf

找到以下部分:

1[label /etc/postfix/main.cf]
2# TLS parameters
3smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
4smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
5smtpd_tls_security_level=may
6
7smtp_tls_CApath=/etc/ssl/certs
8smtp_tls_security_level=may
9smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

修改它看起来像这样,在必要时用你的域代替‘your_domain’。

1[label /etc/postfix/main.cf]
2# TLS parameters
3smtpd_tls_cert_file=/etc/letsencrypt/live/your_domain/fullchain.pem
4smtpd_tls_key_file=/etc/letsencrypt/live/your_domain/privkey.pem
5smtpd_tls_security_level=may
6
7smtp_tls_CApath=/etc/ssl/certs
8smtp_tls_security_level=may
9smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

一旦完成,保存并关闭文件。

通过重新启动 Postfix 应用这些更改:

1sudo systemctl restart postfix

现在,尝试再次发送电子邮件:

1echo "This is the body of an encrypted email" | mail -s "This is the subject line" your_email_address

然后,检查您提供的电子邮件地址. 您可能会立即看到收件箱中的消息,因为电子邮件提供商更有可能将未加密的邮件标记为垃圾邮件。

您可以检查客户端中的电子邮件的技术信息,以确定该消息确实是加密的。

结论

您现在有一个只发送的电子邮件服务器,由Postfix驱动。加密所有发送的邮件是有效的第一步,以防止电子邮件提供商直接将您的邮件标记为垃圾邮件。

但是,如果您的使用案例是向潜在的网站用户发送电子邮件(如信息板登录的确认电子邮件),请查看 设置SPF记录,以便您的服务器的电子邮件更有可能被视为合法。

Published At
Categories with 技术
comments powered by Disqus