Dovecot 2.3.16 进阶实战与运维
Dovecot 2.3.16 进阶实战——openssl 自签证书替换与 TLS 验证、10MB 配额全链路实测(552 拒收、GETQUOTAROOT、quota-warning)、mail_debug 调试与 doveadm log、dsync 备份迁移(maildir 备份/增量同步/mdbox 格式转换)与常见故障速查。
Dovecot 2.3.16 进阶实战与运维
目标:在生产视角下完成 Dovecot 2.3.16 的四项进阶运维——SSL/TLS 证书配置与验证、用户配额(quota)全链路、日志与调试、基于 dsync 的备份与迁移,每项均含实测排障实录。全部命令已在 Ubuntu 22.04.5 LTS(Dovecot 2.3.16 + Postfix 3.6.4)实测通过。
一、环境信息
本篇实测环境(承接安装与集成篇的基础配置):
- 操作系统:Ubuntu 22.04.5 LTS(x86_64,内核 6.8.0-138-generic)
- 软件版本:Dovecot 2.3.16 (7e2e900c1a)、Pigeonhole 0.5.16、Postfix 3.6.4(LMTP 投递)
- 服务器主机名:mail.example.com
- 邮件存储:
mail_location = maildir:~/Maildir(测试用户 mailuser,uid=1000) - 配置目录:
/etc/dovecot/conf.d/ - 前置条件:Dovecot 已安装运行(
systemctl is-active dovecot为active),LMTP 收发闭环可用(见《Dovecot 2.3.16 快速入门与 Postfix 集成示例》)
二、SSL/TLS 证书配置与验证
2.1 出厂证书的问题
apt 安装时 Dovecot 自动生成一对自签名证书(符号链接指向 ssl-cert 包的 snakeoil 证书):
grep -nE '^ssl_cert|^ssl_key' /etc/dovecot/conf.d/10-ssl.conf
实测输出(出厂状态):
12:ssl_cert = </etc/dovecot/private/dovecot.pem
13:ssl_key = </etc/dovecot/private/dovecot.key
出厂证书的通用名是构建机默认值而非你的邮件域名,客户端连接 993 时必然报「证书与域名不匹配」。内网测试可直接接受;正式对外前必须替换。生产首选受信 CA 签发的免费证书(如 Let's Encrypt,其获取与续期属于证书申请专题),本节实测自签名证书的完整替换流程——流程与替换受信证书完全一致,只差签发方。
2.2 自签名证书签发
mkdir -p /etc/dovecot/ssl
openssl req -new -x509 -days 3650 -nodes -newkey rsa:2048 \
-keyout /etc/dovecot/ssl/dovecot.key -out /etc/dovecot/ssl/dovecot.pem \
-subj '/C=CN/ST=Beijing/L=Beijing/O=Example/OU=IT/CN=mail.example.com' \
-addext 'subjectAltName=DNS:mail.example.com'
实测输出(openssl 生成密钥的进度点为正常输出,节选首尾):
..+............+....+...+...........+.+...++++...(中间省略进度点)...+....++++
-----
chmod 600 /etc/dovecot/ssl/dovecot.key
ls -l /etc/dovecot/ssl/
openssl x509 -in /etc/dovecot/ssl/dovecot.pem -noout -subject -issuer -dates
实测输出:
total 8
-rw------- 1 root root 1704 Oct 16 15:31 dovecot.key
-rw-r--r-- 1 root root 1387 Oct 16 15:31 dovecot.pem
subject=C = CN, ST=Beijing, L=Beijing, O=Example, OU=IT, CN=mail.example.com
issuer=C = CN, ST=Beijing, L=Beijing, O=Example, OU=IT, CN=mail.example.com
notBefore=Oct 16 15:31:33 2026 GMT
notAfter=Oct 13 15:31:33 2036 GMT
逐项说明:-new -x509 自签发证而非 CSR;-days 3650 十年有效期;-nodes 私钥不加密(Dovecot 需要无口令私钥,否则启动时等待输入口令);-newkey rsa:2048 RSA 2048 位;-subj 非交互指定主题;-addext subjectAltName 补充 SAN——现代客户端(Chrome/Thunderbird 新版)只认 SAN 不再只看 CN。issuer 与 subject 相同即自签名特征。x509 -noout -subject 是验书标准命令。
2.3 替换配置并生效
编辑 /etc/dovecot/conf.d/10-ssl.conf,把 2.1 的两行路径改到新证书:
sed -i -e 's|^ssl_cert = </etc/dovecot/private/dovecot.pem|ssl_cert = </etc/dovecot/ssl/dovecot.pem|' \
-e 's|^ssl_key = </etc/dovecot/private/dovecot.key|ssl_key = </etc/dovecot/ssl/dovecot.key|' \
/etc/dovecot/conf.d/10-ssl.conf
grep -nE '^ssl_cert|^ssl_key' /etc/dovecot/conf.d/10-ssl.conf
systemctl restart dovecot && systemctl is-active dovecot
实测输出:
12:ssl_cert = </etc/dovecot/ssl/dovecot.pem
13:ssl_key = </etc/dovecot/ssl/dovecot.key
active
2.4 验证服务端实际下发的证书
echo | openssl s_client -connect localhost:993 2>/dev/null | openssl x509 -noout -subject -issuer
实测输出:
subject=C = CN, ST=Beijing, L=Beijing, O=Example, OU=IT, CN=mail.example.com
issuer=C = CN, ST=Beijing, L=Beijing, O=Example, OU=IT, CN=mail.example.com
💡 说明:s_client 连进去看到的就是客户端真实收到的证书——subject 已是 mail.example.com 即替换生效。顺带看协商结果:
echo | openssl s_client -connect localhost:993 2>/dev/null | grep -E 'Protocol|Cipher'
实测输出:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
2.5 ssl 三档策略的选择
doveconf -d ssl
实测输出:
yes
💡 说明:Ubuntu 出厂
ssl = yes(允许 TLS + 按明文策略拒绝非 TLS 登录),CentOS 8 出厂ssl = required(一切连接强制 TLS)。生产建议required——改法为10-ssl.conf第 8 行ssl = required后重启,远程客户端只能走 993/995 或 143 端口的 STARTTLS。
三、用户配额(quota)全链路实战
3.1 配额后端选型
💡 技术拓展:Dovecot 配额的后端不止一种,常见对比——
后端 原理 适用场景 maildir(本篇采用) 直接读取 Maildir 目录字节数实时计算 Maildir 存储的通用默认,无需额外组件 dict 配额值存键值库(SQL/Redis 等),跨服务共享 多服务器共享存储(NFS/GFS)需全局一致配额 fs 文件系统配额(quota 工具) 已在 OS 层做了磁盘配额的环境 count 邮件计数为主 对「封数」而非「字节」限控的场景 本文采用 maildir 后端:单机 Maildir 场景零依赖、实时准确;仅当多台 Dovecot 共享同一存储时才需要 dict 后端保证配额一致。
3.2 配置 quota 插件
编辑 /etc/dovecot/conf.d/90-quota.conf(出厂只有空 plugin 块),写入:
plugin {
quota = maildir:User quota
quota_rule = *:storage=10M
quota_rule2 = Trash:storage=+10M
}
service quota-warning {
executable = /usr/lib/dovecot/quota-warning.sh -d %u
unix_listener quota-warning {
user = dovecot
}
}
plugin {
quota_warning = storage=95%% quota-warning 95 %u
}
逐项说明:quota = maildir:User quota 定义后端与配额根名(客户端 GETQUOTAROOT 看到的名字);quota_rule = *:storage=10M 全部邮箱总上限 10 MB;quota_rule2 = Trash:storage=+10M 回收站额外再给 10 MB(+ 表示在配额上限外加量,删除文件不挤占收件空间);quota_warning = storage=95%% 到 95% 时触发告警服务(配置文件中 %% 是字面百分号的转义);service quota-warning 定义告警执行的套接字与脚本,user = dovecot 以低权限运行。
同时在三个协议的配置里加载插件(各文件的 protocol 块内):
grep -n '^ mail_plugins' /etc/dovecot/conf.d/20-imap.conf /etc/dovecot/conf.d/20-pop3.conf /etc/dovecot/conf.d/20-lmtp.conf
实测输出(本机三处均为 mail_plugins = $mail_plugins quota,IMAP 处最终为 quota imap_quota):
/etc/dovecot/conf.d/20-imap.conf:94: mail_plugins = $mail_plugins quota imap_quota
/etc/dovecot/conf.d/20-pop3.conf:94: mail_plugins = $mail_plugins quota
/etc/dovecot/conf.d/20-lmtp.conf:39: mail_plugins = $mail_plugins quota
⚠️ 注意:三处缺一不可——lmtp 管投递时的限制执行、pop3/imap 管删除释放;IMAP 处还要加
imap_quota(协议扩展插件),只装 quota 内核时客户端执行 GETQUOTAROOT 会报BAD Unknown command(排障实录见 3.6 Q1)。
3.3 创建 quota-warning 告警脚本
service quota-warning 引用的脚本 Dovecot 不随包提供,需按官方模板手工创建 /usr/lib/dovecot/quota-warning.sh:
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@mail.example.com
Subject: Warning: your mailbox is now $PERCENT% full
Your mailbox is now $PERCENT% full.
EOF
chmod +x /usr/lib/dovecot/quota-warning.sh
逐项说明:脚本收到两个参数(百分比、用户名),用 dovecot-lda 给该用户发一封告警邮件;-o plugin/quota=...:noenforcing 关键——投递告警邮件本身不能再受配额限制(否则邮箱满时告警邮件投不进去,用户永远收不到提醒)。
⚠️ 注意:服务块
executable必须指向真实存在的脚本路径。漏建脚本时 restart 直接失败,实测指纹(journalctl -u dovecot):
dovecot[12629]: Fatal: service(quota-warning) access(/usr/lib/dovecot/quota-warning) failed: No such file or directory
3.4 重启并核对配额生效
systemctl restart dovecot && systemctl is-active dovecot
doveadm -o mail_plugins=quota quota get -u mailuser
实测输出:
active
Quota name Type Value Limit %
User quota STORAGE 2 10240 0
User quota MESSAGE 3 - 0
⚠️ 注意:
doveadm quota是插件命令,doveadm 进程自己也要加载插件才能执行——不带-o mail_plugins=quota时实测报错(排障实录见 3.6 Q2):Fatal: Unknown command 'quota', but plugin quota exists. Try to set mail_plugins=quota
输出解读:STORAGE 单位 KB,当前 2 KB / 上限 10240 KB(10M);MESSAGE 计 3 封、无上限(-)。
3.5 超额拒收实测(552 全链路)
构造第一封约 7 MB 的邮件并投递(占满约 70% 配额):
{ printf 'From: root@mail.example.com\nTo: mailuser@mail.example.com\nSubject: Big Mail A\n\n'; base64 /dev/zero | head -c 7340000; } > /tmp/bigmail-a.eml
sendmail -t < /tmp/bigmail-a.eml
sleep 3
doveadm -o mail_plugins=quota quota get -u mailuser
实测输出:
Quota name Type Value Limit %
User quota STORAGE 7171 10240 70
User quota MESSAGE 4 - 0
再发第二封 7 MB(总量将超 10 MB 上限):
{ printf 'From: root@mail.example.com\nTo: mailuser@mail.example.com\nSubject: Big Mail B over quota\n\n'; base64 /dev/zero | head -c 7340000; } > /tmp/bigmail-b.eml
sendmail -t < /tmp/bigmail-b.eml
sleep 3
journalctl --no-pager -n 25 | grep -E 'postfix/lmtp' | tail -2
实测输出:
postfix/lmtp[12696]: 282BC1DABA5F: to=<mailuser@mail.example.com>, relay=mail.example.com[private/dovecot-lmtp], delay=0.11, delays=0.05/0/0.01/0.04, dsn=2.0.0, status=sent (250 2.0.0 <mailuser@mail.example.com> sTdWDKFD0mqZMQAAYIgGOA Saved)
postfix/lmtp[12696]: 0D3171DABA5F: to=<mailuser@mail.example.com>, relay=mail.example.com[private/dovecot-lmtp], delay=0.08, delays=0.06/0/0/0.02, dsn=5.2.2, status=bounced (host mail.example.com[private/dovecot-lmtp] said: 552 5.2.2 <mailuser@mail.example.com> Quota exceeded (mailbox for user is full) (in reply to end of DATA command))
💡 说明:第一封
status=sent、第二封status=bounced ... 552 5.2.2 Quota exceeded (mailbox for user is full)——LMTP 在 DATA 阶段检查配额并拒收,Postfix 按标准 SMTP 状态码向发件方退信。这就是配额「拒收」的真实闭环证据。
3.6 IMAP 客户端侧配额读取与排障
printf 'a1 LOGIN mailuser q1w2e3r4\r\na2 GETQUOTAROOT INBOX\r\na3 GETQUOTA ""\r\na4 LOGOUT\r\n' | openssl s_client -connect localhost:993 -quiet
实测输出(节选):
a1 OK [CAPABILITY IMAP4rev1 ... NOTIFY SPECIAL-USE QUOTA] Logged in
* QUOTAROOT INBOX "User quota"
* QUOTA "User quota" (STORAGE 7171 10240)
a2 OK Getquotaroot completed (0.001 + 0.000 + 0.001 secs).
a3 NO Quota root doesn't exist (0.001 + 0.000 + 0.001 secs).
a4 OK Logout completed.
💡 说明:capability 里出现
QUOTA;* QUOTA "User quota" (STORAGE 7171 10240)与 doveadm 输出完全一致。a3 NO Quota root doesn't exist不是故障——配额根名叫User quota(3.2 里定义),空字符串""只在存在匿名根名时有效,客户端应引用真实根名或直接用 GETQUOTAROOT。
Q1:GETQUOTAROOT 报 BAD Error in IMAP command GETQUOTAROOT: Unknown command?
20-imap.conf 的 protocol imap 块只加载了 quota 内核插件,没加载 IMAP 扩展插件 imap_quota。改为 mail_plugins = $mail_plugins quota imap_quota 后 systemctl restart dovecot,capability 出现 QUOTA 即恢复(本节实测即修复后的状态)。
Q2:doveadm quota get 报 Fatal: Unknown command 'quota'?
doveadm 进程未加载插件,加 -o mail_plugins=quota 前缀(3.4 实测指纹与原文)。
Q3:清理后配额数字没降? 删除邮件只是打 \Deleted 标记,物理释放需 expunge(IMAP CLOSE/EXPUNGE 或 doveadm)。实测清理与重算:
doveadm -o mail_plugins=quota expunge -u mailuser mailbox INBOX subject Big
doveadm -o mail_plugins=quota quota recalc -u mailuser
doveadm -o mail_plugins=quota quota get -u mailuser
实测输出:
Quota name Type Value Limit %
User quota STORAGE 2 10240 0
User quota MESSAGE 3 - 0
💡 说明:
expunge按mailbox + subject条件物理删除(亦可用BEFORE 30days等搜索条件);quota recalc强制重算索引(maildir 后端平时实时计数,异常时手动 recalc 对账)。
四、日志与调试
4.1 日志去哪了
doveadm log find
实测输出:
Looking for log files from /var/log
Debug: Not found
Info: Not found
Warning: Not found
Error: Not found
Fatal: Not found
💡 说明:Dovecot 出厂
log_path = syslog(facility mail),日志交给系统日志服务——Ubuntu 上 systemd 环境落在 journald,用journalctl -u dovecot或journalctl | grep dovecot查看;doveadm log find扫不到文件正说明走的是 syslog 通道。若要独立日志文件,在10-logging.conf设log_path = /var/log/dovecot.log(注意 logrotate 轮转配置)。
4.2 mail_debug:打开调试看决策细节
10-logging.conf 第 58 行改为 mail_debug = yes 后重启,登录一次并观察:
sed -i 's|^#mail_debug = no|mail_debug = yes|' /etc/dovecot/conf.d/10-logging.conf
grep -n '^mail_debug' /etc/dovecot/conf.d/10-logging.conf
systemctl restart dovecot
journalctl --no-pager -n 30 | grep 'Debug' | tail -5
实测输出:
58:mail_debug = yes
dovecot[12873]: imap(mailuser)<12881><iQtC6/Zd2tt/AAAB>: Debug: Quota rule: root=User quota mailbox=Trash bytes=+10485760 messages=0
dovecot[12873]: imap(mailuser)<12881><iQtC6/Zd2tt/AAAB>: Debug: Quota warning: bytes=9961472 (95%) messages=0 reverse=no command=quota-warning 95 mailuser
dovecot[12873]: imap(mailuser)<12881><iQtC6/Zd2tt/AAAB>: Debug: Namespace inbox: type=private, prefix=, sep=, inbox=yes, hidden=no, list=yes, subscriptions=yes location=maildir:~/Maildir
dovecot[12873]: imap(mailuser)<12881><iQtC6/Zd2tt/AAAB>: Debug: maildir++: root=/home/mailuser/Maildir, index=, indexpvt=, control=, inbox=/home/mailuser/Maildir, alt=
dovecot[12873]: imap(mailuser)<12881><iQtC6/Zd2tt/AAAB>: Debug: quota: quota_over_flag check: quota_over_script unset - skipping
💡 说明:Debug 行完整暴露每用户会话的决策链——配额规则解析(Trash 加 10 MB)、95% 告警阈值(9961472 字节)、命名空间与 maildir 根路径。排障「邮箱位置不对/配额没生效」先开 mail_debug 看这一段,查完务必关回(调试日志量大且含敏感细节)。
4.3 日志字段解读与错误汇总
常规连接日志(info 级)字段实测样例:
dovecot[3317]: imap-login: Login: user=<mailuser>, method=PLAIN, rip=172.17.0.9, lip=172.17.0.9, mpid=3558, secured, session=<RbZYufZdXoasEQAJ>
dovecot[3317]: imap(mailuser)<3558><RbZYufZdXoasEQAJ>: Disconnected: Logged out in=9 out=482 deleted=0 expunged=0 trashed=0 hdr_count=0 hdr_bytes=0 body_count=0 body_bytes=0
逐项说明:rip/lip 远端与本地 IP;secured 表示 TLS 或受信网络连接(明文远程会话此处为空);in=/out= 本会话收发字节数;deleted/expunged/trashed 会话内的删信动作统计——审计邮箱行为时很有用。
Dovecot 运行以来的历史错误一键汇总:
doveadm log errors
实测输出(节选):
Oct 16 15:39:35 Error: lmtp(12905): lmtp-server: conn unix:pid=12904,uid=105 [1]: rcpt root@mail.example.com: Failed to lookup user root@mail.example.com: Invalid settings in userdb: userdb returned 0 as uid
Oct 16 15:40:36 Warning: lmtp(12905): Event 0x5c2c47ea0980 leaked (parent=0x5c2c47e994f0): mail-storage-service.c:1350
...
💡 说明:
doveadm log errors汇总 Error/Fatal 级历史记录,是巡检第一条命令。本例中的 Error 是给 root 发信的实测副产物——root 的 uid=0 小于first_valid_uid(默认 500),userdb 拒绝为其建立邮箱,这是设计行为:不要把系统账号当邮箱用户。Event leaked 是 2.3.16 已知的无害告警,可忽略。
五、备份与迁移(dsync)
5.1 dsync 是什么
doveadm backup / doveadm sync 统称 dsync,是 Dovecot 内置的邮箱级复制引擎:按消息 UID 与索引状态做差异比较,支持 maildir/mdbox/sdbox 任意格式间互转,可本地目录、亦可经 SSH 到远端 Dovecot。
💡 技术拓展:邮箱备份工具不止 dsync,常见对比——
工具 原理 适用场景 doveadm backup/sync(dsync) 理解邮箱索引与 UID 结构的增量复制 邮箱迁移、格式转换、主备同步(本篇采用) rsync -a 文件级镜像 冷备份归档;不感知索引一致性,恢复后需 recalc tar 整目录打包 全量快照 离线归档、一次性留存 本文主用 dsync:只有它能在「不停止服务、保持 UID 不变」的前提下迁移邮箱(客户端不会丢已读状态与 UID 缓存)。
5.2 备份到本地目录(maildir → maildir)
chown mailuser:mailuser /backup
doveadm backup -u mailuser maildir:/backup/mailuser
echo exit:$?
实测输出:
exit:0
⚠️ 注意:
/backup目录必须预先创建且属主为目标用户。实测先建 root 属主的目录时报错(排障实录):dsync(mailuser): Error: mkdir(/backup/mailuser) failed: Permission denied (euid=1000(mailuser) egid=1000(mailuser) missing +w perm: /backup, dir owned by 0:0 mode=0755)dsync 以
-u指定的用户身份写备份,chown mailuser:mailuser /backup后重跑即成功。
核对备份产物与可用性:
ls -la /backup/mailuser/ | head -8
doveadm -o mail_location=maildir:/backup/mailuser mailbox list -u mailuser
doveadm -o mail_location=maildir:/backup/mailuser search ALL -u mailuser
实测输出:
total 40
drwx------ 5 mailuser mailuser 4096 Oct 16 15:35 .
drwxr-xr-x 3 mailuser mailuser 4096 Oct 16 15:35 ..
drwx------ 2 mailuser mailuser 4096 Oct 16 15:35 cur
-rw------- 1 mailuser mailuser 220 Oct 16 15:35 dovecot-uidlist
-rw------- 1 mailuser mailuser 8 Oct 16 15:35 dovecot-uidvalidity
-r--r--r-- 1 mailuser mailuser 0 Oct 16 15:35 dovecot-uidvalidity.6ad24431
-rw------- 1 mailuser mailuser 1340 Oct 16 15:35 dovecot.index.cache
INBOX
1872650be840d26aa00d000060880638 1
1872650be840d26aa00d000060880638 2
1872650be840d26aa00d000060880638 3
💡 说明:验证备份可用性的标准姿势是
-o mail_location=...临时把邮箱位置指到备份目录再执行 mailbox list / search——能列出 INBOX 且消息 UID 一致,备份即有效。恢复(反向)就是把方向倒过来:doveadm backup -u mailuser maildir:/backup/mailuser中源与目标互换的用法见 5.4。
5.3 增量同步
备份后再来新邮件,重跑 sync 只传输差异:
echo 'sync test' | mail -s 'Mail after backup' mailuser
sleep 2
doveadm sync -u mailuser maildir:/backup/mailuser
doveadm -o mail_location=maildir:/backup/mailuser search ALL -u mailuser | wc -l
实测输出:
sync-exit:0
4
💡 说明:
backup(单向镜像,目标多出的会被删)与sync(双向增量合并)的选择:定时备份用 backup 保证与源一致;主备双活用 sync。生产排程示例:0 2 * * * doveadm backup -u mailuser maildir:/backup/mailuser写入 mailuser 可读的 crontab(或 root 下带 -u 批量列用户逐个执行)。
5.4 maildir → mdbox 格式迁移
dsync 直接跨格式复制(迁移到大邮箱量场景的官方路径):
doveadm -o namespace/inbox/separator=. backup -u mailuser mdbox:/var/vmail/mailuser-mdbox
echo exit:$?
ls -R /var/vmail/mailuser-mdbox/ | head -10
doveadm -o mail_location=mdbox:/var/vmail/mailuser-mdbox -o namespace/inbox/separator=. search ALL -u mailuser
实测输出:
exit:0
/var/vmail/mailuser-mdbox/:
dovecot.list.index.log
mailboxes
storage
/var/vmail/mailuser-mdbox/mailboxes/INBOX:
dbox-Mails
1872650be840d26aa00d000060880638 1
1872650be840d26aa00d000060880638 2
1872650be840d26aa00d000060880638 3
1872650be840d26aa00d000060880638 5
⚠️ 注意:直接执行
doveadm backup -u mailuser mdbox:...(不带-o namespace/inbox/separator=.)实测报错:dsync(mailuser): Error: Mail locations must use the same virtual mailbox hierarchy separator (specify separator for the default namespace)根因:maildir 层级分隔符是
.,mdbox 位置未显式声明分隔符,dsync 拒绝猜测。按报错提示给默认命名空间显式指定 separator(源是 maildir 就写.)即可完成迁移。迁移完成后把10-mail.conf的mail_location改为mdbox:~/mdbox即整体切换;回滚同理反向执行一次 backup。
六、常见故障速查表
| 现象 | 根因 | 处置(本篇实测依据) |
|---|---|---|
投递回 552 5.2.2 Quota exceeded | 收件箱达到 quota_rule 上限 | 清理邮件或调大 quota_rule(三、3.5) |
GETQUOTAROOT 报 BAD Unknown command | imap 协议缺 imap_quota 插件 | mail_plugins = $mail_plugins quota imap_quota(3.6 Q1) |
doveadm quota 报 Unknown command | doveadm 未加载插件 | 前缀 -o mail_plugins=quota(3.6 Q2) |
| restart 报 quota-warning 脚本缺失 | 未创建 /usr/lib/dovecot/quota-warning.sh | 按 3.3 模板创建并 chmod +x |
dsync 报 mkdir ... Permission denied | 备份目录属主不是目标用户 | chown <user> /backup(5.2) |
dsync 报 separator 错误 | 源/目标命名空间分隔符未声明 | -o namespace/inbox/separator=.(5.4) |
LMTP 拒收 userdb returned 0 as uid | 给 uid<500 的系统账号(root)发信 | 用普通用户收信(4.3 实测) |
| 证书告警「与域名不匹配」 | 出厂 snakeoil 自签证书 | 按 2.2–2.4 替换并验证 |
七、参考链接
- Dovecot 官方文档(配额):
https://doc.dovecot.org/configuration_manual/quota/ - dsync 官方文档:
https://doc.dovecot.org/admin_manual/migrating_mailstores/ - SSL/TLS 配置文档:
https://doc.dovecot.org/configuration_manual/ssl/ - Let's Encrypt 证书:https://letsencrypt.org/zh-cn/docs/
- 相关文档:《Dovecot 2.3.16 Ubuntu 22.04 安装指南》《Dovecot 2.3.16 快速入门与 Postfix 集成示例》《Dovecot 2.3.16 配置参数详解》