Postfix 是一个广泛使用的开源邮件传输代理(MTA),负责在 Linux 系统上处理邮件的发送和接收。大约四分之一的互联网邮件服务器都在使用 Postfix。
本教程将指导在 Ubuntu 上安装 Postfix 并进行基本配置,以及如何通过安装 s-nail
(邮件用户代理 MUA 或客户端)来验证邮件路由功能。
完成本教程后,将掌握 Postfix 的基础邮件处理能力,虽然不是完整的邮件服务器解决方案,但足以为搭建邮件系统提供良好的起点。
流程图
graph TD
A[开始] --> B[更新系统]
B --> C[安装邮件服务器]
C --> D[配置邮件服务器]
D --> E[设置邮箱位置和别名映射]
E --> F[创建虚拟别名映射文件]
F --> G[应用映射并重启邮件服务器]
G --> H[配置防火墙允许邮件服务器]
H --> I[安装邮件客户端 s-nail]
I --> J[设置环境变量并初始化 Maildir 结构]
J --> K[配置 s-nail 并发送测试邮件]
K --> L[发送并接收测试邮件]
L --> M[结束]
这个流程图简洁地总结了在 Ubuntu 22.04 上安装和配置邮件服务器的主要步骤,从系统更新到安装邮件客户端,再到测试邮件路由。
先决条件
如果确定要按照本指南安装和配置 Postfix,那么必须首先具备以下条件:
选择服务器提供商
为了本教程的演示,我将以一个具体的云服务提供商为例,展示如何进行操作。选择哪个提供商根据个人偏好和需求来决定。
以下步骤仅供参考,请根据实际需求选择配置。
购买云服务器
本示例中,我们选择了香港作为服务器区域。
点击 云产品 → 云服务器 → 立即购买
选择操作系统
在创建服务器实例时,选择 Ubuntu 24.04 作为操作系统。
连接到服务器
使用 X-shell 或偏好的 SSH 客户端,通过远程用户名和密码连接到服务器。成功连接后,将看到特定的欢迎信息,表明已成功登录。
- 一个指向 Ubuntu 服务器的完全限定域
- 具备非 root 用户和 UFW 防火墙
本教程假设配置的是 mail.example.com
。在必要时,请确保将 example.com
或 mail.example.com
更改为反映自己的。
第 1 步 — 安装 Postfix
Postfix 包含在 Ubuntu 的默认仓库中,因此可以使用 APT 进行安装。
首先,更新本地 apt
软件包缓存:
sudo apt update
然后使用以下命令安装 postfix
包。注意,这里我们在安装命令中传递了 DEBIAN_PRIORITY=low
环境变量。这将导致安装过程提示配置一些额外的选项:
sudo DEBIAN_PRIORITY=low apt install postfix
安装过程将打开一系列交互式提示。为了本教程的目的,请使用以下信息填写提示:
- 邮件配置类型:选择 Internet Site 以适应我们的网络环境需求。
- 系统邮件名:输入域名,例如
example.com
,这样当只提供用户名时,Postfix 会自动构建完整的邮件地址(如user1@example.com
)。 - 邮件接收账户:指定一个 Linux 用户账户来接收
root@
和postmaster@
的邮件,这里使用 sammy。 - 额外邮件接收目标:如果服务器需要处理其他域名的邮件,请在此添加。否则,保留默认设置即可。
- 邮件队列更新:选择 No,以避免同步更新队列。
- 本地网络:设置为
127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
,适用于大多数情况。 - 邮箱大小限制:设置为
0
表示无限制。 - 本地地址扩展字符:使用默认的
+
字符。 - 互联网协议:选择 all 以允许 Postfix 支持所有 IP 版本。
注意:如果需要返回并更改这些设置,可以通过输入:
sudo dpkg-reconfigure postfix
提示将用之前的回答预填充。
当提示重启服务时,请接受默认选项并选择 OK
。
安装过程完成后,就可以更新 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 用户,可以像这样设置文件:
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
将查找此变量以确定在哪里为用户找到邮件。
为了确保无论如何访问账户 —— 无论是通过 ssh
、su
、su -
还是 sudo
等 —— 都需要在 /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
在文件底部,添加以下选项:
set emptystart
set folder=Maildir
set record=+sent
这些行的作用如下:
set emptystart
:允许客户端即使在收件箱为空时也能打开set folder=Maildir
:将Maildir
目录设置为内部folder
变量set record=+sent
在folder
变量设置的目录中创建一个sent
mbox 文件,用于存储发送的邮件,在这种情况下是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:
1650294586.Vfc01I7e11dM993645.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 2022-04-18 15:09 14/452 init
按 ENTER
查看消息:
Output[-- Message 1 -- 14 lines, 452 bytes --]:
Date: Mon, 18 Apr 2022 15:09:46 +0000
To: sammy@example.com
Subject: init
Message-Id: <20220418150946.EE6897E11A@@mail.example.com>
From: sammy@example.com
init
可以通过输入 h
然后按 ENTER
返回消息列表:
h
Output>R 1 sammy@example.com 2022-04-18 15:09 14/452 init
注意到消息现在的状态是 R
,表示它已被阅读。
由于这条消息没什么用,可以通过按 d
然后按 ENTER
删除它:
d
要返回终端,输入 q
然后按 ENTER
:
q
作为最后的测试,检查 s-nail
是否能够正确发送电子邮件。为此,可以将文本文件的内容通过管道传输到 s-nail
进程,就像在前一步中发送的 init
消息一样。
首先,在文本编辑器中编写一条测试消息:
nano ~/test_message
在内部输入想要发送的文本:
Hello,
This is a test. Please confirm receipt!
编写消息后保存并关闭文件。
然后,使用 cat
命令将消息传输到 s-nail
进程。可以使用以下示例,它使用这些选项:
s
:定义电子邮件消息的主题行r
:可选更改电子邮件的 “From:” 字段。默认情况下,登录的 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 To contact@example.com 2022-04-18 15:12 10/211 Test email subject line
可以使用与处理传入邮件相同的命令来管理发送的邮件。
结论
现在已在 Ubuntu 服务器上配置了 Postfix。管理邮件服务器对于新的系统管理员来说可能是一个艰巨的任务,但有了这个配置,应该有足够的 MTA 电子邮件功能来开始。