编程 Dovecot 2.4 拒读 2.3 的 dovecot.conf:dovecot_config_version 必须第一行,mail_location 已拆成三项

2026-11-08 00:03:53

Dovecot 2.3 升 2.4:缺失 dovecot_config_version 的旧配置会被直接拒读

官方配置转换器: 2.4 示例配置(已按新语法改写):

现象

把 Dovecot 从 2.3 升到 2.4 之后,沿用原 dovecot.conf 的表现是:服务起不来,或起来了但配置不生效。2.3 的配置不按新语法改写,完全不工作。这里说两条最容易忽略的前置设置,以及后续的逐项改法。

必改的前置两项

dovecot.conf 的第一个设置必须是 dovecot_config_version,例如:

dovecot_config_version = 2.4.0

另一个新必需设置是 dovecot_storage_version:

dovecot_storage_version = 2.4.0

结构与过滤器语义

配置不再是层级结构。所有设置都是全局设置,可以写在任意位置,作用域靠 named filter / named list filter 限定。

父过滤器名称前缀会自动补全,所以

passdb sql {
query = ...
}

等价于 passdb_sql_query。但 passdb sql2 { query = ... } 会展开成并不存在的 passdb_sql2_query,不生效。

插件同理:plugin { ... } 段取消,插件设置与其它设置一样全局。mail_plugins 改为 boollist:

mail_plugins {
quota = yes
}

不再需要 mail_plugins = $mail_plugins quota 这种自引用。

具体逐条改法

变量引用

配置里的 $setting 引用必须写成 $SET:name。旧的单字母变量全部移除,改为新语法并用 | 串联过滤器:

旧新
%d%{user | domain}
%n%{user | username}
%u%{user}
%h%{home}
%r%{remote_ip}

%s 分场景:在 login/auth 设置里是 %{protocol},在 storage 设置里是 %{service}。

旧 %2.256Nu 这类写法改为:

%{user | md5 | substr(0, 8) % 256 | hex(2)}

%Hu 没有对应写法。未知或非法的 %{var} 直接报错,可能表现为认证失败。共享 namespace 里的 %%u %%n %%d 变为 $user $username $domain,其它设置里用 %{owner_user} 等。

passdb / userdb

段必须带名字。passdb { } 报错,要写成:

passdb passwd-file {
passwd_file_path = ...
}

旧的 args = 一串参数 改为独立设置,例如:

userdb static {
fields {
uid = ...
gid = ...
}
}

userdb 字段可以设空值;在 2.3 里空值会变成 yes。

mail_location 拆分

# before
mail_location = maildir:~/Maildir:LAYOUT=fs

# after
mail_driver = maildir
mail_path = ~/Maildir
mailbox_list_layout = fs

旧串里的 INDEX= / CONTROL= 变成 mail_index_path / mail_control_path。mail_home 里的 %d / %n 改成 %{user | domain} / %{user | username}。

SSL

证书路径去掉行首的 <,设置名一并更换:

# before
ssl_cert = </etc/ssl/fullchain.pem
ssl_key = </etc/ssl/private.key
ssl_dh = </etc/ssl/dh.pem
ssl_prefer_server_ciphers = yes
disable_plaintext_auth = yes

# after
ssl_server_cert_file = /etc/ssl/fullchain.pem
ssl_server_key_file = /etc/ssl/private.key
ssl_server_dh_file = /etc/ssl/dh.pem
ssl_server_prefer_ciphers = server
auth_allow_cleartext = no

ssl_server_prefer_ciphers 取值是 client / server,不再是 yes/no,默认 client。ssl_min_protocol 默认已是 TLSv1.2;auth_allow_cleartext = no 也是默认值。保留 < 写旧语法会报 "SSL certificates too long"。

.conf.ext 外部文件

dovecot-sql.conf.ext、LDAP 那套外部文件取消,SQL/LDAP 配置改为普通设置,dovecot-sql.conf.ext 可以删掉。MySQL 连接写成:

mysql 127.0.0.1 {
user = ...
password = ...
}
sql_driver = mysql

口令进了主配置,建议 chmod 600 dovecot.conf。

默认值变化

设置2.32.4
protocolsimap pop3 lmtp不启用任何协议,须显式 protocols { imap = yes }
mail_cache_max_headers_countunlimited100(要旧行为设 0)
mail_cache_max_header_name_lengthunlimited100(要旧行为设 0)
mailbox_list_drop_noselectnoyes,\NoSelect 文件夹被丢弃
anvilchroot不再 chroot,以 root 运行
service/auth-worker/process_limit130
mail_log_prefix旧变量改用新变量语法

被移除的功能

  • director:改用 Lua Director,小规模部署没有对应替代。
  • replicator:改用 NFS 等共享文件系统。
  • Global ACL 目录:改 acl 设置。
  • IMAP SETQUOTA:set_quota 设置删除。
  • IPC 进程:并入 anvil。
  • fts-lucene / fts-squat:改用 fts-flatcurve / fts-solr。
  • dsync 命令:改用 doveadm sync。
  • TCP wrapper。
  • 弱口令方案默认禁用,需 auth_allow_weak_schemes。
  • ssl-parameters.dat 不再自动转换。

验证与回退

doveconf -n 输出规范化后的配置,会剥掉被父过滤器匹配的前缀;dovecot -n 同理。!include 失败即报错,通配符无匹配不算错,可用 !include_try。

Sieve 相关要单独处理:全局 Sieve 脚本需要重新 sievec 编译;sieve_script 段要手写,段名只是标识符,global 类型必须显式写 sieve_script_type = global。

实战上,改完先跑一遍 doveconf -n 再重启;升级路径是先升到 2.3 最新版再升 2.4,不要从更早版本一步跳过去;发行版层面,Arch 同时提供 dovecot 与 dovecot23(2.3 只收安全更新),Debian Trixie 直接跳到 2.4、旧配置不再兼容,急用时可先用 dovecot23 包兜底。

推荐文章

程序员茄子在线接单