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 安装与卸载清理全流程。
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单独提供。
三、前置条件
- 一台 CentOS 8(8.x)x86_64 机器,root 权限;
- 主机名与解析已配置(邮件服务强依赖主机名,本篇实测机为
mail.example.com,hostnamectl set-hostname mail.example.com); - 能访问 EOL 后的归档镜像源(第四章处理;CentOS 8 官方源已全部下线);
- 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 定位过程
- 查看
dnf config-manager --dump-variables可得$releasever=8、$contentdir=centos,仓库 URL 形如http://mirror.centos.org/$contentdir/$releasever/...; - CentOS 8 停服后
mirror.centos.org已下线,mirrorlist 解析不出任何镜像——这就是"All mirrors were tried"的根因; - 把仓库切换到官方归档 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。
十三、参考链接
- Dovecot 官网:https://dovecot.org
- Dovecot 官方文档(2.3):
https://doc.dovecot.org/configuration_manual/ - CentOS Vault 官方归档说明:
https://www.centos.org/centos-linux-eol/ - 阿里云 CentOS 归档镜像:https://mirrors.aliyun.com/centos-vault/
- 相关文档:《Dovecot 2.3.16 Ubuntu 22.04 安装指南》《Dovecot 2.3.16 快速入门与 Postfix 集成示例》《Dovecot 2.3.16 配置参数详解》《Dovecot 2.3.16 进阶实战与运维》