如何在Ubuntu 22.04上安装和配置Postfix作为只发送SMTP服务器
作者选择了Free and Open Source Fund作为Write for捐款计划的一部分接受捐款 介绍 Postfix是一个邮件传输代理(MTA),一个用于发送和接收电子邮件的应用程序。它可以配置为仅通过本地应用程序发送电子邮件。这在您需要定期从应用程序发送电子邮件通知或有大量第三方电子邮件服务提供商不允许的出站流量的情况下非常有用。它也是一种轻量级的替代方案,可以运行成熟的SMTP服务
作者选择了Free and Open Source Fund作为Write for捐款计划的一部分接受捐款
介绍
Postfix是一个邮件传输代理(MTA),一个用于发送和接收电子邮件的应用程序。它可以配置为仅通过本地应用程序发送电子邮件。这在您需要定期从应用程序发送电子邮件通知或有大量第三方电子邮件服务提供商不允许的出站流量的情况下非常有用。它也是一种轻量级的替代方案,可以运行成熟的SMTP服务器,同时保留所需的功能。
在本教程中,您将安装Postfix并将其配置为仅发送SMTP服务器。您还将从让我们加密为您的域请求免费TLS证书,并使用它们加密出站电子邮件。
注:截至2022年6月22日,DigitalOcean正在阻止所有新帐户的SMTP。作为这项新政策的一部分,我们与SendGrid合作,因此我们的客户仍然可以轻松地发送电子邮件。您可以通过查看我们的DigitalOcean的SendGrid Marketplace应用程序,了解更多关于这一合作关系的信息,并开始使用SendGrid。
先决条件
-
一个使用Ubuntu 22.04的初始服务器设置设置的Ubuntu 22.03服务器,包括创建一个sudo非root用户。
-
完全注册的域名。本教程将始终使用
your_domain
。您可以在Namecheap上购买域名,在Freenom上免费获得域名,或者使用您选择的域名注册商。 -
一个ADNS记录,
your_domain
指向您服务器的公共IP地址。您可以按照DigitalOcean DNS简介了解如何添加它们的详细信息。
**注意:**服务器的主机名和水滴的名称必须匹配your_domain
,因为DigitalOcean会根据水滴的名称自动设置水滴IP地址的PTR记录。
您可以通过在命令提示符下键入hostname
来验证服务器的主机名。输出应与创建液滴时给出的名称匹配。如果不正确,请运行以下命令进行设置:
hostname your_domain
此外,您的帐户必须启用端口25,这可能不是某些帐户的情况。请注意,一些电子邮件提供商可能会自行决定拒绝来自DigitalOcean(或其他)IP范围的电子邮件。
步骤1-安装后缀
在这一步中,您将安装Postfix。最快的方法是安装mailutils
软件包,该软件包将Postfix与一些补充程序捆绑在一起,您将使用这些程序来测试发送电子邮件。
首先,更新包数据库:
sudo apt update
然后,通过运行以下命令安装Postfix:
sudo apt install mailutils
在安装过程即将结束时,您将看到Postfix配置窗口:
默认选项为Internet Site
。这是您用例的推荐选项,所以按TAB
,然后按ENTER
。如果您只看到描述文本,请按TAB
选择OK
,然后按00021。
如果它没有自动显示,请运行以下命令启动它:
sudo dpkg-reconfigure postfix
之后,您将获得另一个关于系统邮件名称的配置提示:
系统邮件名称必须与创建服务器时分配给服务器的名称相同。完成后,按TAB
,然后按ENTER
。
您现在已经安装了Postfix,并准备开始配置它。
步骤2-配置后缀
在这一步中,您将配置Postfix,使其仅从运行它的服务器(即localhost
)发送和接收电子邮件。
为此,您需要将Postfix配置为仅在_loopback interface_上侦听,这是服务器用于内部通信的虚拟网络接口。要进行更改,您需要编辑名为main.cf
的主后缀配置文件,该文件存储在etc/postfix
下。
使用nano
或您最喜欢的文本编辑器打开它进行编辑:
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
. . .
如果您的域实际上是一个子域,并且您希望电子邮件看起来像是从主域发送的,则可以在main.cf
的末尾添加以下行:
/etc/postfix/main.cf
...
masquerade_domains = your_main_domain
可选masquerade_domains
设置指定将在电子邮件地址中为其剥离子域的域。
完成后,保存并关闭文件。
然后,通过运行以下命令重新启动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
命令中收到错误,或者长时间未收到消息,请检查您编辑的后缀配置是否有效,以及您的服务器名称和主机名是否设置为您的域。
请注意,使用此配置,您发送的测试电子邮件的From
字段中的地址将采用your_user_name@your_domain
的形式,其中your_user_name
是您运行命令的服务器用户的用户名。
现在,您已经从服务器发送了一封电子邮件,并验证已成功接收。在下一步中,您将为root
设置电子邮件转发。
步骤4-转发系统邮件
在这一步中,您将为用户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为您的域请求免费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
(--preferred-challenges http
)进行检查。在运行命令之前,请记住将your_domain
替换为您的域,并在出现提示时输入您的电子邮件地址。
输出类似于此:
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for aleksasavic.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-07-04.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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" root
然后,检查您提供的电子邮件地址。您可能会立即在收件箱中看到该邮件,因为电子邮件提供商更可能将未加密的邮件标记为垃圾邮件。
您可以检查客户端中有关电子邮件的技术信息,以查看邮件是否确实加密。
结论
你现在有了一个只发送邮件的服务器,由Postfix提供支持。加密所有传出消息是电子邮件提供商不直接将您的消息标记为垃圾邮件的有效第一步。如果您是在开发场景中这样做的,那么这个措施就足够了。
然而,如果您的用例是向潜在的网站用户(如留言板注册的确认电子邮件)或流行的电子邮件提供商(如Gmail)发送电子邮件,请查看设置SPF记录,以便您的服务器的电子邮件更可能被视为合法。
更多推荐
所有评论(0)