本教程的先前版本由 Justin Ellingwood 编写
介绍
Postfix 是一种流行的开源 Mail Transfer Agent (MTA),可用于在 Linux 系统上路由和传递电子邮件。 据估计,互联网上大约有 25% of 个公共邮件服务器运行 Postfix。
在本指南中,您将学习如何在 Ubuntu 20.04 服务器上安装和配置 Postfix。 然后,您将通过安装 s-nail
、 邮件用户代理 (MUA),也称为 电子邮件客户端 来测试 Postfix 是否能够正确路由邮件。
请注意,本教程的目标是帮助您使用一些基本的电子邮件功能快速启动和运行 Postfix。 到本指南结束时,您将不会拥有功能齐全的电子邮件服务器,但您将拥有此类设置的一些基本组件来帮助您入门。
先决条件
设置和维护您自己的邮件服务器既复杂又耗时。 对于大多数用户而言,转而依赖付费邮件服务更为实用。 如果您正在考虑运行自己的邮件服务器,我们鼓励您查看 这篇文章,了解您可能不想这样做的原因 。
如果您确定要按照本指南安装和配置 Postfix,那么您首先必须具备以下条件:
- 运行 Ubuntu 20.04 的服务器,用作您的 Postfix 邮件服务器。 此服务器应该有一个具有
sudo
权限的非 root 用户和一个配置了 UFW 的防火墙。 您可以按照我们的 Ubuntu 20.04 初始服务器设置指南 进行设置。 - 指向您的 Ubuntu 20.04 服务器的完全限定域名。 您可以按照 我们的域和 DNS 网络文档 找到有关使用 DigitalOcean 设置域名的帮助。 请注意,如果您计划从外部位置访问邮件,则需要确保您也有一个 MX 记录指向您的邮件服务器。
请注意,本教程假设您正在配置具有 mail.example.com
的 FQDN 的主机。 如有必要,请务必更改 example.com
或 mail.example.com
以反映您自己的 FQDN。
第 1 步 — 安装 Postfix
Postfix 包含在 Ubuntu 的默认存储库中,因此您可以使用 APT 安装它。
首先,更新您的本地 apt
包缓存:
sudo apt update
然后使用以下命令安装 postfix
包。 请注意,这里我们将 DEBIAN_PRIORITY=low
环境变量传递到此安装命令中。 这将导致安装过程提示您配置一些附加选项:
sudo DEBIAN_PRIORITY=low apt install postfix
此安装过程将打开一系列交互式提示。 出于本教程的目的,请使用以下信息填写您的提示:
- 邮件配置的一般类型?:为此,选择Internet站点,因为这符合我们的基础设施需求。
- 系统邮件名称:当只给出地址的帐户部分时,这是用于构造有效电子邮件地址的基本域。 例如,假设您的服务器的主机名是
mail.example.com
。 您可能希望将系统邮件名称设置为example.com
,这样,给定用户名user1
,Postfix 将使用地址user1@example.com
。 - Root 和 postmaster 邮件收件人:这是 Linux 帐户,它将被转发到
root@
和postmaster@
的邮件。 为此使用您的主要帐户。 在本例中,sammy。 - 为 接受邮件的其他目的地:这定义了此 Postfix 实例将接受的邮件目的地。 如果您需要添加此服务器将负责接收的任何其他域,请在此处添加。 否则,默认值就足够了。
- 在邮件队列上强制同步更新?:由于您可能使用日志文件系统,因此在此处接受 No。
- 本地网络:这是您的邮件服务器配置为中继消息的网络列表。 默认值适用于大多数情况。 但是,如果您选择修改它,请确保在网络范围方面非常严格。
- 邮箱大小限制:可用于限制邮件大小。 将其设置为
0
将禁用任何大小限制。 - 本地地址扩展字符:这是可用于将地址的常规部分与扩展分开的字符(用于创建动态别名)。 默认值
+
将适用于本教程。 - 要使用的互联网协议:选择是否限制Postfix支持的IP版本。 在本教程中,选择 all。
明确地说,这些是本指南中使用的设置:
- 邮件配置的一般类型?:Internet站点
- 系统邮件名称:
example.com
(不是mail.example.com
) - Root 和 postmaster 邮件收件人:您的主要 Linux 帐户的用户名(在我们的示例中为 sammy)
- 其他接收邮件的目的地:
$myhostname, example.com, mail.example.com, localhost.example.com, localhost
- 强制同步更新邮件队列?:否
- 本地网络:
127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
- 邮箱大小限制:
0
- 本地地址扩展字符:
+
- 要使用的互联网协议:所有
注意:如果您需要返回更改这些设置,您可以通过键入:
sudo dpkg-reconfigure postfix
提示将预先填充您之前的回复。
安装过程完成后,您就可以对 Postfix 配置进行一些更新了。
第 2 步 — 更改 Postfix 配置
现在您可以调整软件包安装过程未提示您进行的一些设置。 Postfix 的许多配置设置都在 /etc/postfix/main.cf
文件中定义。 您可以使用 Postfix 的 postconf
命令查询或设置配置设置,而不是直接编辑此文件。
首先,设置非 root Ubuntu 用户邮箱的位置。 在本指南中,我们将使用 Maildir 格式,它将邮件分成单独的文件,然后根据用户操作在目录之间移动。 本指南未涵盖的替代选项是 mbox 格式,它将所有消息存储在单个文件中。
将 home_mailbox
变量设置为 Maildir/
。 稍后,您将在用户的主目录中以该名称创建一个目录结构。 通过键入以下内容配置 home_mailbox
:
sudo postconf -e 'home_mailbox= Maildir/'
接下来,设置 virtual_alias_maps
表的位置,该表将任意电子邮件帐户映射到 Linux 系统帐户。 运行以下命令,将表位置映射到名为 /etc/postfix/virtual
的哈希数据库文件:
sudo postconf -e 'virtual_alias_maps= hash:/etc/postfix/virtual'
现在您已经在 main.cf
文件中定义了虚拟地图文件的位置,您可以创建文件本身并开始将电子邮件帐户映射到 Linux 系统上的用户帐户。 使用您喜欢的文本编辑器创建文件; 在本例中,我们将使用 nano
:
sudo nano /etc/postfix/virtual
列出您希望接收电子邮件的任何地址,后跟空格和您希望将该邮件发送到的 Linux 用户。
例如,如果您想在 contact@example.com
和 admin@example.com
接收电子邮件,并希望将这些电子邮件发送给 sammy Linux 用户,您可以设置您的文件像这样:
/etc/postfix/虚拟
contact@example.com sammy admin@example.com sammy
将所有地址映射到适当的服务器帐户后,保存并关闭文件。 如果您使用 nano
,请按 CTRL + X
、Y
,然后按 ENTER
。
通过键入以下内容应用映射:
sudo postmap /etc/postfix/virtual
重新启动 Postfix 进程以确保您的所有更改都已应用:
sudo systemctl restart postfix
假设您遵循 先决条件初始服务器设置指南 ,您将使用 UFW 配置防火墙。 默认情况下,此防火墙将阻止与服务器上服务的外部连接,除非明确允许这些连接,因此您必须添加防火墙规则以允许 Postfix 例外。
您可以通过键入以下内容来允许连接到服务:
sudo ufw allow Postfix
这样,Postfix 就已配置好并准备好接受外部连接。 但是,您还没有准备好使用邮件客户端对其进行测试。 在安装客户端并使用它与传递到服务器的邮件进行交互之前,您需要对 Ubuntu 服务器的设置进行一些更改。
第 3 步 — 安装邮件客户端并初始化 Maildir 结构
为了与正在传递的邮件进行交互,此步骤将引导您完成安装 s-nail
包的过程。 这是 BSD xmail
客户端的一个功能丰富的变体,可以正确处理 Maildir 格式。
但是,在安装客户端之前,请确保您的 MAIL
环境变量设置正确。 s-nail
将查找此变量以找出为您的用户查找邮件的位置。
确保设置 MAIL
变量,无论您如何访问您的帐户 — 无论是通过 ssh
、su
、su -
还是 [X145X ],例如 - 您需要在 /etc/bash.bashrc
文件中设置变量并将其添加到 /etc/profile.d
中的文件中,以确保默认情况下为所有用户设置它。
要将变量添加到这些文件中,请键入:
echo 'export MAIL=~/Maildir' | sudo tee -a /etc/bash.bashrc | sudo tee -a /etc/profile.d/mail.sh
要将变量读入当前会话,请获取 /etc/profile.d/mail.sh
文件:
source /etc/profile.d/mail.sh
完成后,使用 APT 安装 s-nail
电子邮件客户端:
sudo apt install s-nail
在运行客户端之前,您需要调整一些设置。 在编辑器中打开 /etc/s-nail.rc
文件:
sudo nano /etc/s-nail.rc
在文件的底部,添加以下选项:
/etc/s-nail.rc
. . . set emptystart set folder=Maildir set record=+sent
以下是这些行的作用:
set emptystart
:允许客户端在收件箱为空的情况下打开set folder=Maildir
:将Maildir
目录设置为内部folder
变量set record=+sent
创建一个sent
mbox 文件,用于在设置为folder
变量的任何目录中存储发送的邮件,在本例中为Maildir
完成后保存并关闭文件。 您现在已准备好初始化系统的 Maildir 结构。
在主目录中创建 Maildir 结构的一种快速方法是使用 s-nail
命令向自己发送一封电子邮件。 因为 sent
文件只有在创建 Maildir 后才可用,因此您应该禁用对该初始电子邮件的写入。 通过传递 -Snorecord
选项来执行此操作。
通过将字符串传送到 s-nail
命令来发送电子邮件。 调整命令以将您的 Linux 用户标记为收件人:
echo 'init' | s-nail -s 'init' -Snorecord sammy
注意:您可能得到以下响应:
OutputCan't canonicalize "/home/sammy/Maildir"
这是正常现象,可能仅在发送第一条消息时出现。
您可以通过查找 ~/Maildir
目录来检查以确保该目录已创建:
ls -R ~/Maildir
您将看到目录结构已创建,并且新的消息文件位于 ~/Maildir/new
目录中:
Output/home/sammy/Maildir/: cur new tmp /home/sammy/Maildir/cur: /home/sammy/Maildir/new: 1463177269.Vfd01I40e4dM691221.mail.example.com /home/sammy/Maildir/tmp:
现在已经创建了目录结构,您可以通过查看您发送的 init
消息并将消息发送到外部电子邮件地址来测试 s-nail
客户端。
第 4 步 — 测试客户端
要打开客户端,请运行 s-nail
命令:
s-nail
在您的控制台中,您会看到一个基本的收件箱,其中等待着 init
消息:
Outputs-nail version v14.9.15. Type `?' for help "/home/sammy/Maildir": 1 message 1 new >N 1 sammy@example.com 2020-05-19 15:40 14/392 init
按 ENTER
显示信息:
Output[-- Message 1 -- 14 lines, 369 bytes --]: From sammy@example.com Tue May 19 15:40:48 2020 Date: Tue, 19 May 2020 15:40:48 +0000 To: sammy@example.com Subject: init Message-Id: <20160513220749.A278F228D9@mail.example.com> From: sammy@example.com init
您可以通过键入 h
,然后键入 ENTER
返回消息列表:
h
Output>R 1 sammy@example.com 2020-05-19 15:40 14/392 init
请注意,该消息现在的状态为 R
,表明它已被读取。
由于此消息不是很有用,您可以按 d
,然后按 ENTER
将其删除:
d
要返回终端,请键入 q
,然后键入 ENTER
:
q
作为最终测试,检查 s-nail
是否能够正确发送电子邮件。 为此,您可以将文本文件的内容通过管道传输到 s-nail
进程,就像您在上一步中发送的 init
消息一样。
首先在文本编辑器中编写测试消息:
nano ~/test_message
在里面,输入一些你想发送的文本:
~/test_message
Hello, This is a test. Please confirm receipt!
写完信息后保存并关闭文件。
然后,使用 cat
命令将消息通过管道传送到 s-nail
进程。 您可以通过以下示例执行此操作,该示例使用这些选项:
-s
:这定义了电子邮件的主题行-r
:对电子邮件“发件人:”字段的可选更改。 默认情况下,您登录的 Linux 用户将用于填充此字段。-r
选项允许您使用有效地址覆盖它,例如您在/etc/postfix/virtual
文件中定义的地址之一。 为了说明,以下命令使用contact@example.com
此外,请务必将 user@email.com
更改为您可以访问的有效电子邮件地址:
cat ~/test_message | s-nail -s 'Test email subject line' -r contact@example.com user@email.com
然后,导航到您向其发送邮件的电子邮件地址的收件箱。 您几乎会立即看到您的消息在那里等待。
注意:如果邮件不在您的收件箱中,它可能已被传送到您的垃圾邮件文件夹。
您可以在 s-nail
客户端中查看您发送的消息。 再次启动交互式客户端:
s-nail
在电子邮件客户端中,通过键入以下内容查看您发送的消息:
file +sent
你会看到这样的输出:
Output+[/home/sammy/Maildir/]sent: 1 message 1 new ▸N 1 contact@example.com 2020-05-19 15:47 12/297 Test email subject line
您可以使用与接收邮件相同的命令来管理发送的邮件。
结论
你现在已经在你的 Ubuntu 20.04 服务器上配置了 Postfix。 管理电子邮件服务器对于新系统管理员来说可能是一项艰巨的任务,但使用此配置,您应该拥有足够的 MTA 电子邮件功能来让自己入门。