Dovecot 2.3.16 配置参数详解
以 doveconf 工具族为主线逐项详解 Dovecot 2.3.16 核心配置文件(10-mail/10-auth/10-ssl/10-master/20-imap/15-lda),每个参数均给默认值查询与实测验证,含 passwd-file 虚拟用户全流程与权限排障实录。
Dovecot 2.3.16 配置参数详解
目标:系统讲解 Dovecot 2.3.16 的配置文件体系与核心参数,以
doveconf工具族的实测输出为主线,覆盖邮件存储(10-mail)、认证(10-auth)、TLS(10-ssl)、进程与服务(10-master)、协议插件(20-imap 等)五大板块,每个参数给默认值、改法与验证回显。全部命令已在 Ubuntu 22.04.5 LTS(Dovecot 2.3.16)实测通过。
一、环境信息
本篇实测环境(与安装指南一致,可直接复现):
- 操作系统:Ubuntu 22.04.5 LTS(x86_64,内核 6.8.0-138-generic)
- 软件版本:Dovecot 2.3.16 (7e2e900c1a),Pigeonhole 0.5.16
- 服务器主机名:mail.example.com
- 配置目录:
/etc/dovecot/(入口dovecot.conf,分片conf.d/*.conf) - 邮件存储:
maildir:~/Maildir(系统用户 mailuser uid=1000) - 前置条件:Dovecot 已按《Dovecot 2.3.16 Ubuntu 22.04 安装指南》安装并运行(
systemctl is-active dovecot为active)
二、配置文件体系与 doveconf 工具族
2.1 配置文件的加载结构
Dovecot 配置以 /etc/dovecot/dovecot.conf 为唯一入口,其核心是三行包含指令:
grep -nE '^!include' /etc/dovecot/dovecot.conf
实测输出:
12:!include conf.d/*.conf
23:!include_try /usr/share/dovecot/protocols.d/*.protocol
24:!include conf.d/*.conf
逐项说明:!include conf.d/*.conf 按文件名字典序把 conf.d/ 下所有分片配置引入(前缀数字即加载顺序:10- 基础 → 15- 投递/邮箱 → 20- 协议 → 90- 插件 → auth-*.conf.ext 认证后端模板);!include_try 与 !include 的区别是前者文件缺失不报错——protocols.d/ 下每个已安装协议包会放一个 .protocol 文件(如 lmtp.protocol),内容就是 protocols = $protocols lmtp,这是「装包自动启用协议」的机制。
文件名与职责速查(本篇全部实测):
| 文件 | 职责 | 核心参数 |
|---|---|---|
| 10-mail.conf | 邮件存储位置与目录 | mail_location、namespace、first_valid_uid |
| 10-auth.conf | 认证策略与后端 | disable_plaintext_auth、auth_mechanisms、passdb/userdb |
| 10-ssl.conf | TLS 证书与加密策略 | ssl、ssl_cert/ssl_key、ssl_min_protocol |
| 10-master.conf | 进程与套接字拓扑 | service 块、process_limit、unix_listener |
| 15-mailboxes.conf | 预置特殊邮箱 | mailbox Drafts/Trash/Sent + special_use |
| 15-lda.conf | 投递代理 | postmaster_address |
| 20-imap.conf / 20-pop3.conf / 20-lmtp.conf | 各协议开关与插件 | mail_plugins、imap_logout_format |
| 90-quota.conf | 配额插件 | quota、quota_rule(详见《进阶实战与运维》) |
2.2 doveconf 工具族:查看配置的四种姿势
Dovecot 所有参数查询都走 doveconf,四个常用形态实测如下:
doveconf -n
实测输出(本机当前状态,即「与默认值不同的全部项」):
# 2.3.16 (7e2e900c1a): /etc/dovecot/dovecot.conf
# Pigeonhole version 0.5.16 (09c29328)
# OS: Linux 6.8.0-138-generic x86_64 Ubuntu 22.04.5 LTS
# Hostname: mail.example.com
auth_username_format = %n
mail_debug = yes
mail_location = maildir:~/Maildir
mail_privileged_group = mail
namespace inbox {
inbox = yes
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
passdb {
driver = pam
}
passdb {
args = scheme=CRYPT username_format=%u /etc/dovecot/users
driver = passwd-file
}
plugin {
quota = maildir:User quota
quota_rule = *:storage=10M
quota_rule2 = Trash:storage=+10M
quota_warning = storage=95%% quota-warning 95 %u
}
postmaster_address = postmaster@mail.example.com
protocols = " imap lmtp pop3"
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
group = postfix
mode = 0600
user = postfix
}
}
service quota-warning {
executable = /usr/lib/dovecot/quota-warning.sh -d %u
unix_listener quota-warning {
user = dovecot
}
}
ssl_cert = </etc/dovecot/ssl/dovecot.pem
ssl_client_ca_dir = /etc/ssl/certs
ssl_dh = # hidden, use -P to show it
ssl_key = # hidden, use -P to show it
userdb {
driver = passwd
}
userdb {
args = username_format=%u /etc/dovecot/users
driver = passwd-file
}
protocol lmtp {
mail_plugins = " quota"
}
protocol imap {
mail_plugins = " quota imap_quota"
}
protocol pop3 {
mail_plugins = " quota"
}
💡 说明:
-n输出「非默认值」,是发求助帖/工单时的标准配置快照(官方明确要求用它代替全量配置)。头三行注释记录版本、Pigeonhole 版本与 OS;ssl_key显示为# hidden出于安全考虑,加-P参数才显示实际值。本快照中plugin配额块与protocol插件行为《Dovecot 2.3.16 进阶实战与运维》配额实验后的真实状态;auth_mechanisms虽在 10-auth.conf 中显式写为plain,但因与出厂默认一致而不出现在-n里——这正是-n「只看差异」的含义。
其余三个形态:
doveconf -a | head -7
实测输出(-a 输出全部参数及当前值,含未改动的默认项,节选):
# 2.3.16 (7e2e900c1a): /etc/dovecot/dovecot.conf
# Pigeonhole version 0.5.16 (09c29328)
# OS: Linux 6.8.0-138-generic x86_64 Ubuntu 22.04.5 LTS
# Hostname: mail.example.com
# NOTE: Send doveconf -n output instead when asking for help.
auth_anonymous_username = anonymous
auth_cache_negative_ttl = 1 hours
doveconf -d mail_location ssl_min_protocol disable_plaintext_auth mail_max_userip_connections first_valid_uid auth_mechanisms default_process_limit
实测输出(-d 查参数出厂默认值,无需记住默认是多少):
mail_location =
ssl_min_protocol = TLSv1.2
disable_plaintext_auth = yes
mail_max_userip_connections = 10
first_valid_uid = 500
auth_mechanisms = plain
default_process_limit = 100
doveconf -h mail_location protocols
实测输出(-h 只打值不打参数名,适合脚本取值):
maildir:~/Maildir
imap pop3
💡 说明:参数排错的三板斧——改之前
doveconf -d mail_location看默认值,改之后doveconf -h mail_location看生效值,全量核对用doveconf -n。三个命令读的都是磁盘配置文件当前解析结果,无需重启即可预览。
2.3 配置生效方式
修改 conf.d 下任何 .conf 文件后:
doveconf -n
确认无误后重启服务:
systemctl restart dovecot && systemctl is-active dovecot
实测输出:
active
⚠️ 注意:Dovecot 有
doveadm reload(重载配置,不断连接),但改动涉及 service/套接字/listener 结构时必须 restart;拿不准就 restart。配置语法错误的典型报错是启动失败 +journalctl -u dovecot里出现Fatal: Error in configuration file ... line N,按行号修正即可。
三、10-mail.conf:邮件存储参数
3.1 mail_location:存储位置与格式
本参数决定每个用户的邮箱在哪、用什么格式,是 Dovecot 最重要的单条参数:
doveconf -h mail_location
实测输出:
maildir:~/Maildir
格式语法:<格式>:<路径>,路径中可用变量——~ 用户家目录;%u 完整用户名;%n 用户名去掉域名;%d 域名;%h 家目录(等价 ~)。常用取值示例:
| 写法 | 含义 |
|---|---|
maildir:~/Maildir | Maildir 格式,家目录下 Maildir 目录(本篇采用) |
mbox:~/mail:INBOX=/var/mail/%u | mbox 格式,收件箱在系统邮件池(Ubuntu 出厂默认) |
maildir:/var/vmail/%d/%n/Maildir | 虚拟域场景,按域名分目录(配合 SQL/LDAP 用户库) |
mdbox:~/mdbox | mdbox 高密度格式 |
出厂默认与修改记录:
doveconf -d mail_location
实测输出:
mail_location =
⚠️ 注意:默认值为空,空值意味着 Dovecot 在用户家目录做存储自动探测。家目录非空的存量用户可能探测成功,全新用户大概率报
Mail storage autodetection failed with home=/home/mailuser(CentOS 8 安装指南 6.2 节有完整实测)——因此 mail_location 必须显式配置。修改方法:编辑/etc/dovecot/conf.d/10-mail.conf第 30 行:
grep -n '^mail_location' /etc/dovecot/conf.d/10-mail.conf
实测输出:
30:mail_location = maildir:~/Maildir
3.2 namespace:命名空间与预置邮箱
doveconf -n 里的 namespace inbox 块来自 10-mail.conf 的默认命名空间与 15-mailboxes.conf 的预置邮箱:
grep -vE '^\s*#|^\s*$' /etc/dovecot/conf.d/15-mailboxes.conf
实测输出:
namespace inbox {
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Trash {
special_use = \Trash
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
}
逐项说明:namespace inbox 定义默认私有命名空间(prefix = 空,inbox = yes 表示 INBOX 挂在这里,全部来自 10-mail.conf 与默认值);mailbox <名字> 预置特殊邮箱,special_use 把它们映射到 IMAP 特殊用途标志(\Drafts 草稿、\Junk 垃圾、\Trash 回收站、\Sent 已发送),邮件客户端靠这些标志识别各功能目录而不必猜名字;auto 属性可控制预置邮箱的创建时机(默认 auto = create 以外的值需手工设置,首次访问时按需创建)。
验证:IMAP 会话里 LIST 能看到 INBOX,且 STATUS 正常(详见安装指南 7.3 节实测回显)。
3.3 mail_privileged_group:特权组
doveconf -h mail_privileged_group
实测输出:
mail
💡 说明:Ubuntu 出厂把特权组设为
/var/mail下收件箱等公共位置文件需要 mail 组特权。使用纯 Maildir(邮箱全在家目录内)时该参数不参与工作,保留默认即可;改成空(mail_privileged_group =)在生产纯 Maildir 场景也可运行。
3.4 first_valid_uid:允许登录的最小 UID
doveconf -h first_valid_uid
实测输出:
500
💡 说明:UID 小于 500 的系统账号(root、daemon、www-data 等系统服务账号)默认禁止作为邮箱用户登录/收信,防止系统账号被邮箱体系滥用。mailuser 的 uid=1000 大于 500 故正常。若要给某个低 UID 专用账号开邮箱(不推荐),可下调该值或用 userdb
allow_uid覆盖;反之提高该值可进一步收紧白名单范围。
四、10-auth.conf:认证参数
4.1 disable_plaintext_auth:明文认证开关
doveconf -h disable_plaintext_auth
实测输出:
yes
💡 说明:
yes(出厂默认,10-auth.conf 第 10 行注释里的默认值)表示非加密连接一律拒绝明文密码,远程连接的 capability 里会带LOGINDISABLED,强行明文登录收到NO [PRIVACYREQUIRED] Plaintext authentication disallowed on non-secure (SSL/TLS) connections.(安装指南 7.5 节实测回显)。本机 localhost 连接被视为安全例外。生产保持默认,不要改成 no。
4.2 auth_mechanisms:认证机制
doveconf -h auth_mechanisms
实测输出:
plain
💡 说明:
plain是最基础的明文凭证机制,依赖 TLS 保护传输。可叠加login(兼容老客户端的 LOGIN 命令),写成auth_mechanisms = plain login。机制本身只定义「密码怎么传」,密码存在哪由 passdb 决定——这正是下一个参数组。该参数在 10-auth.conf 第 100 行为显式出厂值(auth_mechanisms = plain),因其与默认一致而不出现在doveconf -n里,查看请用doveconf -h auth_mechanisms。
💡 技术拓展:passdb(密码库)后端不止一种,常见对比——
后端 原理 适用场景 pam + passwd 系统用户认证(/etc/passwd + PAM) 服务器用户即邮箱用户,小规模 passwd-file 单个 passwd 格式文件存用户与哈希 少量虚拟用户、测试环境 sql(MySQL/PostgreSQL) 数据库表存用户 中大规模虚拟域托管 ldap 目录服务认证 企业统一身份 dict/static 键值库/静态规则 特殊定制 本文主用系统用户(pam/passwd,Dovecot 出厂即启用),并完整实测 passwd-file 作为虚拟用户后端;sql/ldap 属于企业集成专题。
4.3 认证后端包含机制
10-auth.conf 尾部通过 !include 决定启用哪些后端:
grep -n '!include auth' /etc/dovecot/conf.d/10-auth.conf
实测输出:
119:#!include auth-deny.conf.ext
120:#!include auth-master.conf.ext
122:!include auth-system.conf.ext
123:#!include auth-sql.conf.ext
124:#!include auth-ldap.conf.ext
125:!include auth-passwdfile.conf.ext
126:#!include auth-checkpassword.conf.ext
127:#!include auth-static.conf.ext
逐项说明:出厂只启用 auth-system.conf.ext(第 122 行,即 pam + passwd);本机实测加启了第 125 行 auth-passwdfile.conf.ext(虚拟用户实验)。启用的后端可以并存,Dovecot 逐个尝试直到命中。
4.4 auth_username_format:用户名格式化(LMTP 集成关键)
doveconf -h auth_username_format
实测输出:
%n
💡 说明:
%n表示「取 @ 前的用户名部分」。出厂默认注释(值为空,不格式化)。开启它的原因:Postfix 经 LMTP 投递时收件人恒为完整地址user@domain,不做截断会导致 userdb 查不到用户、LMTP 回550 5.1.1 User doesn't exist(《快速入门与 Postfix 集成示例》8.1 有完整实录)。修改位置在/etc/dovecot/conf.d/10-auth.conf第 51 行:
grep -n '^auth_username_format' /etc/dovecot/conf.d/10-auth.conf
实测输出:
51:auth_username_format = %n
其他取值:%Lu(小写全名)、%Ld(只取域名,多域场景分库用)、%Ln@%Ld(小写用户@域名,需 userdb 配套)。
4.5 实战:passwd-file 虚拟用户全流程
以下为本机完整实测,演示不依赖系统用户的虚拟邮箱账号。auth-passwdfile.conf.ext 的出厂内容:
cat /etc/dovecot/conf.d/auth-passwdfile.conf.ext
实测输出:
passdb {
driver = passwd-file
args = scheme=CRYPT username_format=%u /etc/dovecot/users
}
userdb {
driver = passwd-file
args = username_format=%u /etc/dovecot/users
# Default fields that can be overridden by passwd-file
#default_fields = quota_rule=*:storage=1G
# Override fields from passwd-file
#override_fields = home=/home/virtual/%u
}
逐项说明:passdb/userdb 都指向 /etc/dovecot/users 这一个文件;scheme=CRYPT 表示接受 {SCHEME}哈希 形式的密码字段;userdb 从同一文件的 uid/gid/home 字段取得投递属性。
第一步,生成密码哈希(SHA512-CRYPT 算法):
doveadm pw -s SHA512-CRYPT -p q1w2e3r4
实测输出:
{SHA512-CRYPT}$6$TON6MnoPBfX2rM4Q$WS5vsZxdKHvoUtSRmofJMEAtIX33fAXPG23nwgQ19ZW3LK7Tpsr3DoDD.6ZaG2mkWevT3rkht5N2KV9ZRIM.W1
💡 说明:
doveadm pw是官方口令哈希工具,-s指定算法(可选 SHA512-CRYPT/BLF-CRYPT/PLAIN/SSHA 等),-p直接跟明文(生产建议省略-p走交互避免口令留 shell 历史)。每次加随机盐,同明文两次生成结果不同属正常。
第二步,写用户文件(字段格式:用户名:密码:uid:gid:gecos:家目录:shell):
echo 'vuser:{SHA512-CRYPT}$6$TON6MnoPBfX2rM4Q$WS5vsZxdKHvoUtSRmofJMEAtIX33fAXPG23nwgQ19ZW3LK7Tpsr3DoDD.6ZaG2mkWevT3rkht5N2KV9ZRIM.W1:1000:1000::/var/vmail/vuser::' > /etc/dovecot/users
chown root:dovecot /etc/dovecot/users && chmod 640 /etc/dovecot/users
mkdir -p /var/vmail/vuser && chown -R 1000:1000 /var/vmail
ls -l /etc/dovecot/users
实测输出:
-rw-r----- 1 root dovecot 157 Oct 16 15:29 /etc/dovecot/users
⚠️ 注意:文件权限是本环节唯一但必踩的坑(排障实录见 Q1)。uid/gid 用 1000:1000(本机已有该 UID;生产中通常专门创建
vmail系统用户并把文件中的 uid/gid 写成它的)。家目录/var/vmail/vuser配合mail_location = maildir:~/Maildir,邮箱即落在/var/vmail/vuser/Maildir。
第三步,验证登录(虚拟用户不在 /etc/passwd 中,仅凭 passwd-file 即可登录):
printf 'a1 LOGIN vuser q1w2e3r4\r\na2 LIST "" *\r\na3 LOGOUT\r\n' | openssl s_client -connect localhost:993 -quiet
实测输出(节选):
a1 OK [CAPABILITY IMAP4rev1 ... SPECIAL-USE] Logged in
* LIST (\HasNoChildren) "." INBOX
a2 OK List completed (0.001 + 0.000 + 0.001 secs).
* BYE Logging out
a3 OK Logout completed.
ls -la /var/vmail/vuser/Maildir/ | head -5
实测输出:
total 12
drwx------ 2 1000 1000 4096 Oct 16 15:30 .
drwxr-xr-x 3 1000 1000 4096 Oct 16 15:30 ..
-rw------- 1 1000 1000 80 Oct 16 15:30 dovecot.list.index.log
4.6 FAQ:认证相关排障
Q1:登录报 NO [UNAVAILABLE] Temporary authentication failure?
查 journalctl -u dovecot,实测指纹:
auth: Error: passwd-file /etc/dovecot/users:open(/etc/dovecot/users) failed: Permission denied (euid=106(dovecot) egid=109(dovecot) missing +r perm: /etc/dovecot/users, dir owned by 0:0 mode=0755)
根因:认证子进程以 dovecot 系统用户运行,读不了 0600/root:root 的密码文件。解决:chown root:dovecot /etc/dovecot/users && chmod 640 /etc/dovecot/users(属主组给 dovecot,组可读)。
Q2:密码明明正确却认证失败?
三查:doveadm pw -t '<哈希>' -p '<明文>' 可反向校验哈希与明文是否匹配;passdb args 的 scheme 与哈希前缀(如 {SHA512-CRYPT})是否一致;passwd-file 中字段是否恰好 7 个(多冒号少冒号都会解析错位)。
Q3:如何临时打开认证调试?
10-auth.conf 设 auth_debug = yes(出厂 doveconf -d auth_debug 为 no),重启后日志会输出完整的 passdb/userdb 查找链路;排障完记得关掉(调试日志会暴露登录尝试细节)。
五、10-ssl.conf:TLS 参数
5.1 ssl:TLS 总开关与三级策略
doveconf -h ssl
doveconf -d ssl
实测输出:
yes
yes
💡 说明:
ssl三个取值——yes(默认):支持 TLS,同时按disable_plaintext_auth规则拒绝明文登录;required:所有连接强制 TLS(CentOS 8 包出厂即 required,比 Ubuntu 更严格);no:完全关闭 TLS(仅限纯内网受控环境,严禁公网)。修改位置/etc/dovecot/conf.d/10-ssl.conf第 6 行。
5.2 ssl_cert / ssl_key:证书与私钥
grep -nE '^ssl_cert|^ssl_key' /etc/dovecot/conf.d/10-ssl.conf
实测输出(本机已替换为自签证书,出厂为 /etc/dovecot/private/dovecot.pem/key):
12:ssl_cert = </etc/dovecot/ssl/dovecot.pem
13:ssl_key = </etc/dovecot/ssl/dovecot.key
💡 说明:值开头的
<表示「把文件内容读进来」(PEM 格式),不是重定向符——这是 Dovecot 特有语法,写错会直接启动失败。证书替换的完整实操(openssl 自签 → 生效验证)见《进阶实战与运维》。私钥文件权限必须 0600 且属主 root。
5.3 ssl_min_protocol:最低 TLS 版本
doveconf -h ssl_min_protocol
doveconf -d ssl_min_protocol
实测输出:
TLSv1.2
TLSv1.2
💡 说明:2.3.16 出厂即 TLSv1.2,TLSv1.0/1.1 被拒。合规要求更严的场景可设
TLSv1.3(代价是老客户端失联,设置前评估客户端版本分布)。修改位置10-ssl.conf的ssl_min_protocol行。
5.4 ssl_cipher_list 与 ssl_prefer_server_ciphers
doveconf -h ssl_cipher_list ssl_prefer_server_ciphers
实测输出:
ALL:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
no
逐项说明:出厂套件串排除了匿名(!aNULL)、弱加密(!EXPORT !DES !3DES)、已知不安全算法(!MD5 !RC4)与静态 RSA 密钥交换(!kRSA,强制前向保密);ssl_prefer_server_ciphers = no 让客户端优先选算法(现代 TLS1.2+ 的主流做法)。验证实际协商结果:
echo | openssl s_client -connect localhost:993 2>/dev/null | grep -E 'Protocol|Cipher'
实测输出:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
六、10-master.conf:服务与进程参数
6.1 service 块总览
grep -n '^service ' /etc/dovecot/conf.d/10-master.conf
实测输出:
17:service imap-login {
38:service pop3-login
48:service submission-login {
54:service lmtp {
62:service imap {
71:service pop3 {
76:service submission {
81:service auth {
110:service auth-worker {
117:service dict {
💡 说明:
*-login是预认证进程(处理端口监听、TLS 握手、凭证转发,数量小而常驻);imap/pop3是认证后的每连接工作进程;auth是认证中转(所有 login 进程向它查询);lmtp是投递入口(《快速入门与 Postfix 集成示例》5.2 改造的套接字就在这个块里)。
6.2 进程数限制:default_process_limit 与服务级覆盖
doveconf -h default_process_limit
doveconf service/imap 2>/dev/null | grep -E 'executable|process_limit'
doveconf service/pop3 2>/dev/null | grep -E 'executable|process_limit'
实测输出:
100
executable = imap
process_limit = 1024
executable = pop3
process_limit = 1024
💡 说明:全局默认每服务最多 100 进程(
doveconf -d default_process_limit),但 imap/pop3 在出厂配置里被单独放宽到 1024——意味着单机最多 1024 个并发 IMAP 会话(再叠加每用户连接数限制 6.3)。大用户量场景按内存余量调整服务块内process_limit;每个 imap 进程约 3–5 MB 常驻,1024 上限对应内存峰值约 3–5 GB。
6.3 mail_max_userip_connections:单用户连接上限
doveconf -h mail_max_userip_connections
实测输出:
10
💡 说明:同一用户从同一 IP 最多 10 个并发连接(防止客户端疯狂重连拖垮服务)。手机 + 电脑 + 网页三端同时在线的一般个人用户够用;若用户群大量使用移动端多账号聚合 App(连接数敏感),在
20-imap.conf的protocol imap块调大,如mail_max_userip_connections = 25,改后doveconf -h核对。
6.4 unix_listener:套接字三要素
10-master.conf 中所有 unix_listener <路径> 块都由三要素构成(以 5.2/4.5 节实测过的 lmtp 套接字为例):
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
逐项说明:mode 套接字文件权限(0600 仅属主可用,0600+user 即最小授权;给 doveadm 用的 auth-userdb 套接字默认 0666 依赖属主限制);user/group 决定套接字文件属主与「谁连得上」——对方进程用户必须与之一致或有组权限,否则连接报 Permission denied。套接字在 systemctl restart dovecot 时重建,改完块配置必须 restart 而非 reload。
七、协议级配置(20-imap / 20-pop3 / 20-lmtp / 15-lda)
7.1 protocol 块与 mail_plugins
每个协议文件里的 protocol <名> 块控制该协议的行为,最常用的是 mail_plugins(为该协议加载邮件处理插件):
grep -n -B1 '^ mail_plugins' /etc/dovecot/conf.d/20-imap.conf
实测输出(本机已为配额实验启用插件,出厂为注释状态):
protocol imap {
mail_plugins = $mail_plugins quota imap_quota
💡 说明:
$mail_plugins引用全局mail_plugins值再追加,是叠加式写法。插件分两层:quota是存储层配额引擎(pop3/lmtp/imap 通用,负责执行限制);imap_quota是 IMAP 协议扩展插件(负责向客户端暴露 QUOTA 能力与 GETQUOTAROOT 命令)。只加载 quota 不加载 imap_quota 时,IMAP 客户端看不到配额——实测指纹为BAD Error in IMAP command GETQUOTAROOT: Unknown command(《进阶实战与运维》有完整实录与修复)。
7.2 20-lmtp.conf 与 15-lda.conf
20-lmtp.conf 的 protocol lmtp 块同样用 mail_plugins 挂配额插件(LMTP 投递时执行配额检查,超限回 552 的能力来自这里);15-lda.conf 的关键参数是退信地址:
grep -n '^postmaster_address' /etc/dovecot/conf.d/15-lda.conf
实测输出:
7:postmaster_address = postmaster@mail.example.com
💡 说明:LDA/LMTP 生成退信通知时以
postmaster_address为发件人,出厂注释为空——用 LDA 前必须设置,否则投递报Fatal: postmaster_address not set(《快速入门与 Postfix 集成示例》9.1 有实测)。纯 LMTP 收外部邮件的场景也建议设置,格式为postmaster@你的邮件域。
八、生产配置模板(单机 Maildir 场景)
适用场景:单台 4 GB 内存 / NVMe SSD / 100 用户以内的部门级邮件服务器,系统用户 + Maildir + Postfix LMTP 投递。以下为本机逐条实测过的配置汇总(每条均可在前文找到验证回显):
# /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
# /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_username_format = %n
# /etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_min_protocol = TLSv1.2
# /etc/dovecot/conf.d/15-lda.conf
postmaster_address = postmaster@mail.example.com
# /etc/dovecot/conf.d/20-imap.conf(protocol imap 块内)
mail_plugins = $mail_plugins quota imap_quota
逐项说明:mail_location 固定 Maildir 避免自动探测失败;disable_plaintext_auth 保持出厂严格策略;auth_username_format = %n 服务 LMTP 完整地址收件人;ssl_min_protocol 保持 TLSv1.2 出厂水位;postmaster_address 兜底退信;配额插件按需启用(不需要配额则省略最后一行,出厂即注释态)。
九、常见问题(FAQ)
Q1:改了 conf.d 配置但 doveconf -h 显示旧值?
doveconf 读的是磁盘文件当前内容,读出旧值说明改动没写进它实际加载的文件——常见原因是同名参数在两个文件里都出现,后加载的覆盖先加载的(加载序见 2.1 速查表)。用 grep -rn '参数名' /etc/dovecot/conf.d/ 找出所有出现点,只保留一处。
Q2:doveconf -n 报错 Fatal: Error in configuration file?
按报错里的文件名与行号修正语法(常见:块缺 }、值里未转义的 %、路径少了 < 前缀)。修完再跑 doveconf -n,无输出错误即通过,最后 systemctl restart dovecot。
Q3:如何查某参数的出厂默认值?
doveconf -d 参数名(2.2 节实测形态),不必翻文档猜。批量浏览全部默认值用 doveconf -a | less。
Q4:服务启动正常但端口没监听?
doveconf -h protocols 核对协议列表(本机实测 " imap pop3");doveconf service/imap 2>/dev/null | grep inet_listener 核对监听地址端口;两者正常则查 10-master.conf 对应 service 块是否被误注释。
十、参考链接
- Dovecot 官方配置手册:
https://doc.dovecot.org/configuration_manual/ - doveconf(1) 手册页:https://manpages.debian.org/jammy/dovecot-core/doveconf.1.en.html
- 认证数据库(AuthDatabase)文档:
https://doc.dovecot.org/configuration_manual/authentication/ - 相关文档:《Dovecot 2.3.16 Ubuntu 22.04 安装指南》《Dovecot 2.3.16 快速入门与 Postfix 集成示例》《Dovecot 2.3.16 进阶实战与运维》