Dovecot 2.3.16 配置参数详解

以 doveconf 工具族为主线逐项详解 Dovecot 2.3.16 核心配置文件(10-mail/10-auth/10-ssl/10-master/20-imap/15-lda),每个参数均给默认值查询与实测验证,含 passwd-file 虚拟用户全流程与权限排障实录。

Dovecot2026/10/17

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.confTLS 证书与加密策略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:~/MaildirMaildir 格式,家目录下 Maildir 目录(本篇采用)
mbox:~/mail:INBOX=/var/mail/%umbox 格式,收件箱在系统邮件池(Ubuntu 出厂默认)
maildir:/var/vmail/%d/%n/Maildir虚拟域场景,按域名分目录(配合 SQL/LDAP 用户库)
mdbox:~/mdboxmdbox 高密度格式

出厂默认与修改记录:

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 出厂把特权组设为 mail。Dovecot 进程处理邮件时通常以对应用户身份运行(最小权限),但创建 /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 块是否被误注释。

十、参考链接