Dovecot 2.3.16 进阶实战与运维

Dovecot 2.3.16 进阶实战——openssl 自签证书替换与 TLS 验证、10MB 配额全链路实测(552 拒收、GETQUOTAROOT、quota-warning)、mail_debug 调试与 doveadm log、dsync 备份迁移(maildir 备份/增量同步/mdbox 格式转换)与常见故障速查。

Dovecot2026/10/17

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 commandimap 协议缺 imap_quota 插件mail_plugins = $mail_plugins quota imap_quota(3.6 Q1)
doveadm quota 报 Unknown commanddoveadm 未加载插件前缀 -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 替换并验证

七、参考链接