# 如何在 Ubuntu上安装和配置邮件服务器(Postfix)

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 客户端,通过远程用户名和密码连接到服务器。成功连接后,将看到特定的欢迎信息,表明已成功登录。

https://syxoss.oss-cn-hangzhou.aliyuncs.com/Typora202411211021991.png

  • 一个指向 Ubuntu 服务器的完全限定域
  • 具备非 root 用户和 UFW 防火墙

本教程假设配置的是 mail.example.com。在必要时,请确保将 example.commail.example.com 更改为反映自己的。

第 1 步 — 安装 Postfix

Postfix 包含在 Ubuntu 的默认仓库中,因此可以使用 APT 进行安装。

首先,更新本地 apt 软件包缓存:

sudo apt update

然后使用以下命令安装 postfix 包。注意,这里我们在安装命令中传递了 DEBIAN_PRIORITY=low 环境变量。这将导致安装过程提示配置一些额外的选项:

sudo DEBIAN_PRIORITY=low apt install postfix

安装过程将打开一系列交互式提示。为了本教程的目的,请使用以下信息填写提示:

  1. 邮件配置类型:选择 Internet Site 以适应我们的网络环境需求。
  2. 系统邮件名:输入域名,例如 example.com,这样当只提供用户名时,Postfix 会自动构建完整的邮件地址(如 user1@example.com)。
  3. 邮件接收账户:指定一个 Linux 用户账户来接收 root@postmaster@ 的邮件,这里使用 sammy
  4. 额外邮件接收目标:如果服务器需要处理其他域名的邮件,请在此添加。否则,保留默认设置即可。
  5. 邮件队列更新:选择 No,以避免同步更新队列。
  6. 本地网络:设置为 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128,适用于大多数情况。
  7. 邮箱大小限制:设置为 0 表示无限制。
  8. 本地地址扩展字符:使用默认的 + 字符。
  9. 互联网协议:选择 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.comadmin@example.com 的电子邮件,并且希望这些电子邮件被传递给 sammy Linux 用户,可以像这样设置文件:

contact@example.com sammy
admin@example.com sammy

在将所有地址映射到适当的服务器账户后,保存并关闭文件。如果使用的是 nano,请按 CTRL + XY,然后 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 将查找此变量以确定在哪里为用户找到邮件。

为了确保无论如何访问账户 —— 无论是通过 sshsusu - 还是 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=+sentfolder 变量设置的目录中创建一个 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 电子邮件功能来开始。