Dovecot 2.3.8 CentOS 8 安装指南

在 CentOS 8(8.4.2105,EOL 后 vault 源)上从零通过 dnf 安装 Dovecot 2.3.8,完整实录 mirrorlist 失效与 vault.centos.org 403 的仓库修复过程,并覆盖 Maildir 配置、首次启动证书生成、IMAPS 登录验证、离线 rpm 安装与卸载清理全流程。

Dovecot2026/10/17

Dovecot 2.3.8 CentOS 8 安装指南

目标:在 CentOS 8 服务器上从零安装并运行 Dovecot IMAP/POP3 邮件服务器,完整处理 CentOS 8 停服(EOL)后的仓库修复(mirrorlist 失效 → vault 源切换),完成 Maildir 存储配置、systemd 托管、四端口验证与真实 TLS 登录,并覆盖离线 rpm 安装与卸载清理。全部命令与回显已在 CentOS Linux release 8.4.2105(x86_64,Dovecot 2.3.8)实测通过。

一、环境信息

本篇所有命令均在以下环境中逐条实测,读者复现时应保持相近版本:

  • 操作系统:CentOS Linux release 8.4.2105(x86_64,rpm -E %{rhel} 为 8)
  • 软件版本:Dovecot 2.3.8 (9df20d2db),包名 1:2.3.8-9.el8,依赖 openssl 1:1.1.1g-15.el8_3、clucene-core 2.3.3.4
  • 软件源状态:CentOS 8 已于 2021-12-31 停止维护(EOL),官方 mirrorlist 与原镜像已下线,需使用 vault 归档源(见第四章)
  • 服务器主机名:mail.example.com
  • 监听端口:143(IMAP)、993(IMAPS)、110(POP3)、995(POP3S)
  • 配置目录:/etc/dovecot/(主配置 /etc/dovecot/dovecot.conf,分片配置 /etc/dovecot/conf.d/*.conf)
  • 证书目录:/etc/pki/dovecot/certs/、/etc/pki/dovecot/private/(首次启动自动生成)
  • 邮件存储:maildir:~/Maildir(用户家目录下 Maildir)
  • 服务管理:systemd(dovecot.service)

二、软件概览与版本选型

2.1 Dovecot 是什么

Dovecot 是以安全著称的开源 IMAP/POP3 邮件服务器(C 语言编写,2002 年首发),负责让用户通过 IMAP/POP3 读取 MTA(如 Postfix)投递进来的邮件,同时提供 LDA/LMTP 投递代理、Sieve 过滤、配额、dsync 加密同步等配套能力。在 RHEL/CentOS 生态中,Dovecot 由 Red Hat 官方打包进 AppStream 仓库,与系统自带 Postfix 天然适配。

先在仓库中确认版本:

dnf list --showduplicates dovecot

实测输出(节选):

Installed Packages
dovecot.x86_64                     1:2.3.8-9.el8                      @appstream
Available Packages
dovecot.x86_64                     1:2.3.8-9.el8                      appstream

💡 说明:CentOS 8 仓库中 Dovecot 全生命周期只有一个版本 2.3.8(停服后不再有更新),与 Ubuntu 22.04 的 2.3.16 相差 8 个小版本。2.3.8 同样是 2.3 系列稳定分支,基础功能(IMAP/POP3/LMTP/SSL/配额/dsync)完备;需要更高版本应考虑迁移到 Rocky Linux 8/9 或 AlmaLinux 并使用 ELRepo/EPEL 类补充源。

2.2 安装包组成

与 Ubuntu 按包拆分不同,CentOS/RHEL 把 IMAP、POP3、LMTP 全部打进单一 dovecot 包:

dnf info dovecot

实测输出(节选):

Version      : 2.3.8
Repository   : @System
Summary      : Secure imap and pop3 server

💡 说明:一条 dnf install dovecot 即获得全部协议支持,无需再装 imapd/pop3d/lmtpd 子包——这是 RHEL 系与 Debian 系包管理的最大差异。可选扩展包如 dovecot-mysql、dovecot-pgsql、dovecot-ldap 单独提供。

三、前置条件

  1. 一台 CentOS 8(8.x)x86_64 机器,root 权限;
  2. 主机名与解析已配置(邮件服务强依赖主机名,本篇实测机为 mail.example.com,hostnamectl set-hostname mail.example.com);
  3. 能访问 EOL 后的归档镜像源(第四章处理;CentOS 8 官方源已全部下线);
  4. systemd 正常运行(systemctl is-system-running 返回 running 或 degraded)。

四、修复 EOL 软件源(关键排障实录)

4.1 故障现象:mirrorlist 失效

直接执行 dnf install 会报仓库元数据下载失败:

dnf makecache

实测报错(原文):

Error: Failed to download metadata for repo 'appstream': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried

4.2 定位过程

  1. 查看 dnf config-manager --dump-variables 可得 $releasever=8、$contentdir=centos,仓库 URL 形如 http://mirror.centos.org/$contentdir/$releasever/...;
  2. CentOS 8 停服后 mirror.centos.org 已下线,mirrorlist 解析不出任何镜像——这就是"All mirrors were tried"的根因;
  3. 把仓库切换到官方归档 vault 后再测,若网络对 vault.centos.org 拒绝(实测返回 HTTP/1.1 403 Forbidden,部分网络出口会被其拒绝),改用国内镜像站的 centos-vault 归档。

先探测两个归档源的可用性(在能出网的机器上):

curl -sI https://vault.centos.org/8.4.2105/AppStream/x86_64/os/repodata/repomd.xml | head -1
curl -sI https://mirrors.aliyun.com/centos-vault/8.4.2105/AppStream/x86_64/os/repodata/repomd.xml | head -1

实测输出(实测环境:vault 主域名被拒、阿里云归档可用):

HTTP/2 403
HTTP/2 200

4.3 解决:切换到阿里云 centos-vault 归档源

把全部仓库文件中的 mirrorlist 注释掉、baseurl 指到归档路径(注意路径里必须带具体小版本号 8.4.2105,归档站不提供 8 大版本目录):

sed -i -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com/centos-vault/8.4.2105|g' /etc/yum.repos.d/CentOS-*.repo
grep -h '^baseurl' /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-Extras.repo

实测输出:

baseurl=https://mirrors.aliyun.com/centos-vault/8.4.2105/AppStream/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos-vault/8.4.2105/BaseOS/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos-vault/8.4.2105/extras/$basearch/os/

重建缓存验证:

dnf makecache

实测输出(节选):

CentOS Linux 8 - BaseOS                         8.4 kB/s | 3.9 kB     00:00
CentOS Linux 8 - Extras                         5.8 kB/s | 1.5 kB     00:00
Metadata cache created.

⚠️ 注意:8.4.2105 要与本机实际版本一致(cat /etc/centos-release 确认)。若本机是 8.5 就写 8.5.2111,以此类推。若你的网络可以正常访问 vault.centos.org,把 baseurl 写成 https://vault.centos.org/8.4.2105/ 即可,结构与阿里云归档完全相同。

五、方案 A:dnf 在线安装(vault 归档源)

5.1 安装

仓库修复后,一条命令完成安装:

dnf install -y dovecot

实测输出(节选):

Installed:
  clucene-core-2.3.3.4-31.20130812.e8e3d20git.el8.x86_64
  dovecot-1:2.3.8-9.el8.x86_64
  openssl-1:1.1.1g-15.el8_3.x86_64

Complete!

💡 说明:dovecot 主包仅 5.0 MB,同时自动带入 openssl(TLS 支持)与 clucene-core(全文检索索引库)。AppStream 仓库一条 dovecot 即包含 IMAP/POP3/LMTP 全部协议。

5.2 核对安装产物

dovecot --version

实测输出:

2.3.8 (9df20d2db)
rpm -q dovecot

实测输出:

dovecot-2.3.8-9.el8.x86_64
ls /etc/dovecot/ /etc/dovecot/conf.d/

实测输出(节选):

/etc/dovecot/:
conf.d
dovecot.conf

/etc/dovecot/conf.d/:
10-auth.conf
10-logging.conf
10-mail.conf
10-master.conf
10-ssl.conf
15-lda.conf
15-mailboxes.conf
20-imap.conf
20-lmtp.conf
20-pop3.conf
20-submission.conf
...

六、基础配置

6.1 配置邮件存储位置

CentOS 默认 10-mail.conf 中 mail_location 是注释状态(#mail_location =),即不显式指定存储位置。此时 Dovecot 会在用户家目录做存储自动探测(autodetect),家目录为空的新用户探测失败,登录后操作邮箱会报错(见 6.2 排障实录)。因此 CentOS 上必须显式配置。

编辑 /etc/dovecot/conf.d/10-mail.conf:

sed -i 's|^#mail_location =|mail_location = maildir:~/Maildir|' /etc/dovecot/conf.d/10-mail.conf
grep -n '^mail_location' /etc/dovecot/conf.d/10-mail.conf

实测输出:

30:mail_location = maildir:~/Maildir

💡 技术拓展:邮件存储格式不止 Maildir 一种,常见对比——

格式原理/特点适用场景
mbox所有邮件拼接进一个文件用户少、邮件量小;/var/spool/mail 传统格式
Maildir每封邮件一个独立文件,cur/new/tmp 三目录结构绝大多数现代部署;防损坏、并发安全
dbox(mdbox/sdbox)多邮件打包 + 索引,空间效率最高大规模存储;配合 dsync 迁移方便

本文采用 Maildir,理由:与 Postfix、配额插件兼容性最好,是 Dovecot 官方推荐的主流格式。

6.2 排障实录:不配置 mail_location 的真实报错

以下为实测未配置 mail_location 时(恢复注释后)的现象,用于说明 6.1 的必要性。创建测试用户并登录后,执行 STATUS INBOX 报 Internal error:

a1 OK [...] Logged in
* BYE Internal error occurred. Refer to server log for more information.

服务器日志定位(journalctl -u dovecot --no-pager -n 20):

dovecot[218]: imap(mailuser)<260><vlq28fZdPL1/AAAB>: Error: Namespace '': Mail storage autodetection failed with home=/home/mailuser

解决方案即 6.1:显式设置 mail_location = maildir:~/Maildir 并重启服务。设置后同样操作恢复正常(* STATUS INBOX (MESSAGES 0 UNSEEN 0))。

6.3 创建测试用户

useradd -m -s /bin/bash mailuser
echo 'mailuser:q1w2e3r4' | chpasswd
id mailuser

实测输出:

uid=1000(mailuser) gid=1000(mailuser) groups=1000(mailuser)

⚠️ 注意:q1w2e3r4 仅为演示固定口令,生产环境必须替换为强密码。Dovecot 默认 PAM + /etc/passwd 认证直接使用系统用户,无需额外配置即可登录。

6.4 核对默认 SSL 配置

CentOS 版 Dovecot 的 SSL 策略比 Ubuntu 更严格,默认即为强制 TLS:

grep -nE '^ssl|^ssl_cert|^ssl_key|^ssl_cipher_list' /etc/dovecot/conf.d/10-ssl.conf

实测输出:

8:ssl = required
14:ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
15:ssl_key = </etc/pki/dovecot/private/dovecot.pem
65:ssl_cipher_list = PROFILE=SYSTEM

💡 说明:三处关键差异——ssl = required(所有连接强制 TLS,明文登录彻底禁止,比 Ubuntu 默认 ssl = yes 更严格);证书路径在 /etc/pki/dovecot/(RHEL 系惯例)而非 /etc/dovecot/private/;ssl_cipher_list = PROFILE=SYSTEM 表示加密套件跟随系统 crypto-policy(update-crypto-policies --show 可查,默认 DEFAULT)。

七、启动服务与验证

7.1 systemd 启动与开机自启

systemctl enable dovecot
systemctl start dovecot
systemctl status dovecot --no-pager

实测输出(节选):

● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2026-10-16 15:37:23 UTC; 4ms ago
     Docs: man:dovecot(1)
           http://wiki2.dovecot.org/
  Process: 211 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
   Main PID: 213 (dovecot)

确认状态与监听:

systemctl is-active dovecot
ss -tlnp | grep dovecot

实测输出:

active
LISTEN 0      100          0.0.0.0:995       0.0.0.0:*    users:(("dovecot",pid=213,fd=23))
LISTEN 0      100          0.0.0.0:993       0.0.0.0:*    users:(("dovecot",pid=213,fd=41))
LISTEN 0      100          0.0.0.0:143       0.0.0.0:*    users:(("dovecot",pid=213,fd=39))
LISTEN 0      100          0.0.0.0:110       0.0.0.0:*    users:(("dovecot",pid=213,fd=21))
LISTEN 0      100             [::]:995          [::]:*    users:(("dovecot",pid=213,fd=24))
LISTEN 0      100             [::]:993          [::]:*    users:(("dovecot",pid=213,fd=42))
LISTEN 0      100             [::]:143          [::]:*    users:(("dovecot",pid=213,fd=40))
LISTEN 0      100             [::]:110          [::]:*    users:(("dovecot",pid=213,fd=22))

⚠️ 注意:服务器若启用 firewalld,需放行端口:firewall-cmd --permanent --add-service=imap --add-service=imaps --add-service=pop3 --add-service=pop3s && firewall-cmd --reload。ss 输出确认监听正常但远程不通时,优先检查防火墙与云安全组。

7.2 首次启动自动生成证书

CentOS 版不做安装期证书生成,而是在首次启动时由 prestartscript 调用 /usr/libexec/dovecot/mkcert.sh 生成自签名证书:

ls -l /etc/pki/dovecot/certs/ /etc/pki/dovecot/private/

实测输出:

/etc/pki/dovecot/certs/:
total 4
-rw------- 1 root root 1562 Oct 16 15:37 dovecot.pem

/etc/pki/dovecot/private/:
total 4
-rw------- 1 root root 2484 Oct 16 15:37 dovecot.pem

7.3 IMAPS 真实登录测试

printf 'a1 LOGIN mailuser q1w2e3r4\r\na2 STATUS INBOX (MESSAGES UNSEEN)\r\na3 LIST "" *\r\na4 LOGOUT\r\n' | openssl s_client -connect localhost:993 -quiet

实测输出:

* OK Waiting for authentication process to respond..
* OK Waiting for authentication process to respond..
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN] Dovecot ready.
a1 OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY LITERAL+ NOTIFY SPECIAL-USE] Logged in
* STATUS INBOX (MESSAGES 0 UNSEEN 0)
a2 OK Status completed (0.003 + 0.000 + 0.004 secs).
* LIST (\HasNoChildren) "." INBOX
a3 OK List completed (0.001 + 0.000 + 0.001 secs).
* BYE Logging out
a4 OK Logout completed.

首次登录同时自动创建 Maildir:

ls -ld /home/mailuser/Maildir

实测输出:

drwx------ 5 mailuser mailuser 4096 Oct 16 15:38 /home/mailuser/Maildir

7.4 POP3S 登录测试

printf 'user mailuser\r\npass q1w2e3r4\r\nlist\r\nquit\r\n' | openssl s_client -connect localhost:995 -quiet

实测输出:

+OK Dovecot ready.
+OK
+OK Logged in.
+OK 0 messages:
.
+OK Logging out.

八、方案 B:rpm 离线安装(断网/内网环境)

8.1 在联网机器下载离线包(含依赖)

用 dnf download --resolve 把 dovecot 及其依赖一并下载(需先装提供 download 命令的 dnf-plugins-core):

dnf install -y dnf-plugins-core
mkdir -p /tmp/dovecot-rpm && cd /tmp/dovecot-rpm
dnf download --resolve dovecot

实测输出(节选):

dovecot-2.3.8-9.el8.x86_64.rpm                  350 kB/s | 5.0 MB     00:14
(2/3): clucene-core-2.3.3.4-31.20130812.e8e3d20 330 kB/s | 596 kB     00:01
(3/3): openssl-1.1.1g-15.el8_3.x86_64.rpm       296 kB/s | 707 kB     00:02
ls *.rpm

实测输出:

clucene-core-2.3.3.4-31.20130812.e8e3d20git.el8.x86_64.rpm
dovecot-2.3.8-9.el8.x86_64.rpm
openssl-1.1.1g-15.el8_3.x86_64.rpm

8.2 在目标机离线安装

把三个 rpm 拷贝到目标机后:

cd /tmp/dovecot-rpm
rpm -ivh *.rpm

实测输出:

Preparing...                          ########################################
Updating / installing...
openssl-1:1.1.1g-15.el8_3             ########################################
clucene-core-2.3.3.4-31.20130812.e8e3d########################################
dovecot-1:2.3.8-9.el8                 ########################################

8.3 验证并启动

rpm -q dovecot && dovecot --version
systemctl enable dovecot && systemctl start dovecot && systemctl is-active dovecot

实测输出:

dovecot-2.3.8-9.el8.x86_64
2.3.8 (9df20d2db)
active

⚠️ 注意:rpm -ivh 不解析仓库依赖,必须用 --resolve 下载的完整 rpm 集合(缺一个都会报 Failed dependencies 后中止且不安装任何包)。若目标机已有同包旧版本,把 -ivh 换成 -Uvh(升级安装)。安装后首次启动同样会自动生成 /etc/pki/dovecot/ 证书。

九、多方案对比与选择建议

维度方案 A:dnf 在线(vault 源)方案 B:rpm 离线
版本vault 归档版 2.3.8-9.el8与下载机一致
是否需联网安装时需要(EOL 后须先修源)安装时不需要
依赖处理自动解析(openssl/clucene-core 自动带入)需 dnf download --resolve 打全依赖
firewalld 放行安装后手工放行同左
适用场景常规服务器内网隔离、同版本批量分发

选择建议:EOL 仓库修复一次后长期受益,常规服务器走方案 A;无法出网的内网机器走方案 B,并用 --resolve 保证依赖完整。

十、升级与版本管理

10.1 版本天花板与升级方式

CentOS 8 已 EOL,vault 源不会再发布任何新版本,dnf upgrade 只会重装当前的 2.3.8-9.el8,没有可升级空间。日常维持即可:

dnf upgrade -y dovecot

实测输出(节选,无更新时):

Nothing to do.
Complete!

10.2 锁定版本

防止误操作引起版本漂移:

dnf install -y 'dnf-command(versionlock)'
dnf versionlock add dovecot-2.3.8-9.el8
dnf versionlock list

实测输出(节选):

dovecot-1:2.3.8-9.el8.*

解除锁定用 dnf versionlock delete dovecot-2.3.8-9.el8。

10.3 查询已装版本

rpm -q dovecot && dnf list --showduplicates dovecot | tail -2

十一、常见问题(FAQ)

Q1:dnf makecache 报 All mirrors were tried? CentOS 8 停服后官方 mirrorlist 全部下线所致,按第四章把仓库切到 centos-vault 归档(baseurl 必须带 8.4.2105 这类具体小版本号)。这是 CentOS 8 机器装任何软件都会遇到的通用问题。

Q2:登录 IMAP 后操作邮箱报 Internal error occurred? 日志里必有 Mail storage autodetection failed with home=/home/mailuser(见 6.2 实测)。根因是 mail_location 未显式配置、家目录为空导致自动探测失败。按 6.1 设置 mail_location = maildir:~/Maildir 并 systemctl restart dovecot。

Q3:为什么 CentOS 版没有明文 143 端口登录的机会,而文档说 Ubuntu 有 LOGINDISABLED 提示? CentOS 默认 ssl = required(6.4 节实测),比 Ubuntu 默认 ssl = yes 更严格:所有非 TLS 连接在握手后即被要求升级 TLS,明文 LOGIN 直接拒绝。这是发行版打包策略差异,生产环境建议保持 required。

Q4:ss -tlnp 监听正常但客户端连不上? 检查 firewalld:firewall-cmd --list-all 看 services 是否含 imap/imaps/pop3/pop3s;云机器再查安全组。放行命令见 7.1 注意项。

Q5:dnf install 时报仓库校验和失败(Failed to synchronize cache)? 多为归档源缓存过期或 baseurl 版本号与系统不符。核对 cat /etc/centos-release 与 baseurl 中版本一致,然后 dnf clean all && dnf makecache 重建。

十二、卸载与清理

12.1 停止并卸载

systemctl stop dovecot
dnf remove -y dovecot

实测输出(节选):

Removed:
  dovecot-1:2.3.8-9.el8.x86_64
  openssl-1:1.1.1g-15.el8_3.x86_64

Complete!

💡 说明:dnf remove 会把作为依赖带入的 openssl、clucene-core 一并移除(若无其他包依赖它们)。

12.2 验证与残留处理

rpm -q dovecot
ls /etc/dovecot
ls -ld /home/mailuser/Maildir

实测输出:

package dovecot is not installed
conf.d
drwx------ 5 mailuser mailuser 4096 Oct 16 15:38 /home/mailuser/Maildir

💡 说明:rpm 卸载保留 /etc/dovecot/conf.d/ 配置目录(RHEL 系惯例,防误删本地配置),确认不再需要可 rm -rf /etc/dovecot;证书目录 /etc/pki/dovecot/ 亦保留,同样按需删除。用户邮箱 /home/mailuser/Maildir 实测不受卸载影响;连同用户清理用 userdel -r mailuser。

十三、参考链接