Roundcube 1.7.5 配置参数详解

Roundcube 1.7.5 配置体系(defaults.inc.php 与 config.inc.php 覆盖机制)与关键参数逐项实测:数据库、IMAP/SMTP 连接、界面(product_name/language/skin)、登录(login_lc/username_domain)、安全(des_key/enable_installer/support_url)、会话(session_lifetime 的 120 秒下限与滑动过期)、插件与日志,每项均给出默认值、修改→生效→验证的闭环回显与生产配置模板。

Roundcube邮件服务器Webmail2026/10/21

Roundcube 1.7.5 配置参数详解

目标:把 Roundcube 1.7.5 最常用的配置参数讲清楚——每个参数给三层信息:官方默认值(从安装包 config/defaults.inc.php 原样摘录)、参数语义(做什么用)、实测验证(改完之后用真实命令验证生效的回显)。实测环境与部署过程见本专栏《Ubuntu 22.04 安装 Roundcube 1.7.5 指南》:Ubuntu 22.04.5 LTS,PHP 8.1.2,Apache 2.4.52,MariaDB 10.6.23,Dovecot 2.3.16 / Postfix 3.6.4 作为本机邮件后端。

1. 配置体系:为什么只改 config.inc.php

Roundcube 的配置由两层组成:

  • config/defaults.inc.php:官方全量默认值(1.7.5 共约 1900 行),永远不要直接修改——升级会被覆盖,也便于 diff 排查;
  • config/config.inc.php:部署方自己的覆盖层,只写需要偏离默认值的参数。1.7.5 的安装包不带这个文件,需要自建(参考同目录 config.inc.php.sample)。

一个历史包袱要提前说:老文档里常见的 default_host(IMAP 服务器)、smtp_server 等参数名在 1.6 起已更名为 imap_host、smtp_host,旧名在 1.7 的 defaults.inc.php 中已不存在,照抄老配置只会静默失效。

另一个实测踩坑必须先讲:PHP Opcache 会缓存 config.inc.php 的内容。实测中改完配置立即刷新页面,读到的是旧值(如 username_domain 迟迟"不生效");执行 systemctl reload apache2(重置 opcache)后立即生效。排查"改了没反应"时先怀疑这一条。

2. 参数总览(默认值均摘自 1.7.5 的 defaults.inc.php)

分组参数默认值一句话语义
数据库db_dsnw'mysql://roundcube:@localhost/roundcubemail'主数据库 DSN(写)
IMAPimap_host'localhost:143'IMAP 服务器地址:端口
IMAPimap_cachenullIMAP 元数据缓存 TTL(null=关)
IMAPmessages_cachefalse邮件消息体缓存(存数据库)
SMTPsmtp_host'localhost:587'SMTP 提交服务器
SMTPsmtp_user / smtp_pass'%u' / '%p'SMTP 认证用户/密码占位符
SMTPsmtp_timeout0连接超时秒数(0=不限制)
界面product_name'Roundcube Webmail'站点名称(标题、页脚等)
界面skin'elastic'皮肤(1.7 仅内置 elastic)
界面languagenull强制界面语言(null=跟随浏览器)
界面timezone'auto'时区('auto' 跟随浏览器)
界面default_charset'ISO-8859-1'缺省字符集
登录login_lc2用户名转小写(2=登录时转换)
登录username_domain''给不带 @ 的用户名自动补域
登录identities_level0身份管理自由度(0=用户任意增改)
安全des_key'rcmail-!24ByteDESkey*Str'会话数据加密密钥(必改)
安全cipher_method'DES-EDE3-CBC'加密算法(配套 24 字节密钥)
安全enable_installerfalse是否启用 Web 安装器
安全ip_checkfalse绑定客户端 IP 校验会话
安全referer_checkfalse校验 Referer 防 CSRF
安全force_https / use_httpsfalse / false强制 HTTPS(链接生成/登录检测)
会话session_lifetime10会话有效期(分钟,实测最小 120 秒)
插件plugins[]启用的插件列表
日志log_driver'file'日志驱动(file/syslog/stdout)
日志log_loginsfalse记录登录成败日志
杂项support_url''帮助/支持链接(空=隐藏入口)
杂项useragentnull发信 X-Mailer(null=内置默认)
杂项max_message_size'100M'单封邮件大小上限

3. 数据库与邮件后端连接参数

3.1 db_dsnw —— 应用数据库

$config['db_dsnw'] = 'mysql://roundcube:q1w2e3r4@localhost/roundcube';

DSN 格式为 <driver>://<user>:<pass>@<host>/<db>,驱动支持 mysql/postgres/sqlite。这里存的是应用数据(用户表 users、会话 session、缓存 cache/cache_messages/cache_index、通讯录 contacts 等 18 张表),不是邮件本身。实测中只要 DSN 正确、库已初始化,登录后 users 表会自动出现登录用户记录:

# mysql roundcube -e "SELECT username, mail_host FROM users;"
username        mail_host
admin   localhost

3.2 imap_host —— 收件后端

$config['imap_host'] = 'localhost:143';

指向任意 IMAP4 rev1 服务器;可写多个条目做"服务器选择登录"(数组形式,键为显示名)。实测登录链路:imap_host=localhost:143 指向本机 Dovecot,admin/q1w2e3r4 登录返回 302 进入收件箱(完整回显见安装篇 2.8 节)。若配错端口或密码错误,登录页会提示 Connection to storage server failed / Login failed,同时 Apache 错误日志出现 IMAP Error: Login failed。

3.3 smtp_host / smtp_user / smtp_pass —— 发件后端

$config['smtp_host'] = 'localhost:25';
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';

%u/%p 是占位符,表示"用当前登录用户的 IMAP 用户名/密码向 SMTP 认证"(与 Dovecot/Postfix 的 SASL 对接时最常用)。只用本机 Postfix 免认证提交时可整组留空。生效验证不用发信——官方 bin/healthcheck.sh 会直接探测三者连通性:

# cd /var/www/roundcube && php bin/healthcheck.sh
DB: OK
IMAP: OK (localhost:143)
SMTP: OK (localhost:25)

4. 界面与本地化参数

4.1 product_name —— 站点名称(实测闭环)

默认 'Roundcube Webmail'。改为 'Quzuo Mail 邮件系统' 后刷新登录页:

# curl -s http://localhost/ | grep -oE "<title>[^<]*</title>"
<title>Quzuo Mail 邮件系统 :: 欢迎使用 Quzuo Mail 邮件系统</title>

标题、页脚版权行同步变化——最直观的"改配置生效"验证参数。

4.2 language —— 界面语言(实测闭环)

默认 null(跟随浏览器 Accept-Language)。设为 'zh_CN' 后,语言为其他值的浏览器也会看到中文界面:

# curl -s http://localhost/ | grep -oE "(用户名|密码|登录)" | sort -u
密码
用户名
登录

可选值即 program/localization/ 下的目录名(Complete 包自带全部语言包),如 zh_CN、en_US、zh_TW。

4.3 skin —— 皮肤(实测闭环,含错误示范)

默认 'elastic',1.7.5 也只内置这一套皮肤:

# ls /var/www/roundcube/skins/
elastic

把它设为老版本经典的 'larry'(1.7 包中不存在)会直接白屏报错——登录页返回 404,logs/errors.log 记录:

[xx-Oct-2026 ... +0000]: <xxxxxxx> Error loading template for login
 in /var/www/roundcube/skins/larry/templates/login.html (GET /)

结论:升级到 1.7 后老皮肤必须重新安装为第三方主题,或保持 elastic。

4.4 timezone / default_charset

timezone 默认 'auto'(跟随浏览器),需要统一服务器口径时固定如 'Asia/Shanghai';default_charset 默认 'ISO-8859-1',中文环境建议显式 UTF-8,可避免部分历史邮件解析时出现乱码。

5. 登录与账号参数

5.1 login_lc

默认 2(登录时把用户名转小写)。用于容忍用户大小写输入差异;Linux 系统用户名区分大小写,若后端存在大小写敏感的同形账号需谨慎。

5.2 username_domain —— 自动补域名(实测闭环,含 Dovecot 配套)

$config['username_domain'] = 'example.local';

语义:登录时用户名若不带 @,自动补上该域(用于 IMAP 后端要求完整邮箱地址登录的场景)。实测闭环分三步:

第一步,配置后用 admin 登录——登录失败,Roundcube 日志显示 Failed login for admin,而 Dovecot 侧收到的用户名已是 admin@example.local,系统用户表里没有这个用户,认证被拒。这恰好证明参数已生效(用户名在认证前被追加了域名)。

第二步,让 Dovecot 剥离域名后用系统用户认证(/etc/dovecot/conf.d/10-auth.conf):

# sed -i 's/^#auth_username_format = %Lu/auth_username_format = %Ln/' /etc/dovecot/conf.d/10-auth.conf
# systemctl restart dovecot

第三步,重新登录——成功,且 Roundcube 以带域名的用户名落库:

# tail -1 /var/www/roundcube/logs/userlogins.log
[xx-Oct-2026 ... +0000]: <xxxxxxx> Successful login for admin@example.local (ID: 4) from 127.0.0.1 in session jr26q0je9gr0f6jnrpe4dovgr3
# mysql roundcube -e "SELECT username, mail_host FROM users;"
username              mail_host
admin@example.local   localhost

注意:启用后 users.username 存储的值带域名,历史用户记录(不带域名的)会变成两条——该参数适合新部署一次性定好。

5.3 identities_level

默认 0:用户可自由增删改发件身份。设为 1 则身份邮箱强制等于登录名对应邮箱、用户不能新建身份。多租户/托管场景建议收紧。

6. 安全类参数

6.1 des_key —— 会话加密密钥(必改)

默认样例值 'rcmail-!24ByteDESkey*Str' 在官方文档中被反复警告必须替换。配套 cipher_method 默认 DES-EDE3-CBC,要求 24 字节密钥。实测:设成 9 字符的 'short-key' 后登录并不报错——PHP OpenSSL 会把短密钥零填充到算法所需长度;但等价于把密钥熵降到 9 字符,属于弱化。正确做法是生成 24 字符随机串:

# tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 24; echo
qz1234567890abcdefghijkl

6.2 enable_installer —— Web 安装器开关(实测闭环)

默认 false。安装器入口在 public_html/installer.php(302 到安装向导)。true 时向导正常渲染:

# curl -sL http://localhost/installer.php -w "\nHTTP %{http_code}\n" | grep -E "Check environment|HTTP"
Check environment
HTTP 200

改回 false 后再访问,标题仍是 "Roundcube Webmail Installer",但正文被替换为禁用提示:

The installer is disabled! To enable it again, set the enable_installer option in config/config.inc.php ...

生产建议:装完立即 false,且干脆删除 installer/ 目录。

6.3 support_url —— 帮助入口(实测闭环)

默认 ''(设置页"关于"里不显示支持链接)。设为 'https://support.example.local' 后:

# curl -s -b rc.jar "http://localhost/?_task=settings&_action=about" | grep -oE "support.example.local" | head -1
support.example.local

6.4 ip_check / referer_check / force_https / use_https

  • ip_check(默认 false):把会话与会话建立时的客户端 IP 绑定,IP 变化即会话失效。校园网/移动网络频繁换 IP 的用户会莫名掉线,慎开。
  • referer_check(默认 false):校验 POST 的 Referer 防 CSRF,额外一层防护。
  • force_https(默认 false):HTTPS 反代后强制所有生成链接走 https;use_https(默认 false):登录时检测 https 并要求。公网部署配 TLS 后两者都应打开。

7. 会话参数:session_lifetime(实测闭环,两个反直觉点)

默认 10(分钟)。实测把它设为 1(1 分钟)做极值验证:

# sed -i "s/^\$config\['session_lifetime'\]/\$config['session_lifetime'] = 1;/" config.inc.php  # 覆盖式写入
# systemctl reload apache2

登录后观察数据库会话行的过期时间:

# mysql roundcube -e "SELECT sess_id, expires_at, NOW() FROM session\G"
sess_id: jr26q0je9gr0f6jnrpe4dovgr3
expires_at: 2026-10-21 03:38:22
NOW(): 2026-10-21 03:36:22

expires_at 比 NOW() 晚了 120 秒而不是 60 秒——第一个反直觉点:源码 rcube_session::set_lifetime() 有下限保护 max(120, lifetime*60),配置小于 2 分钟也按 2 分钟生效。

第二个反直觉点:滑动过期。每次请求都会刷新 expires_at(上面的行在后续请求后变成了 03:39:28),所以"过期"指的是"最后一次活动后 N 分钟"。静置超过 expires_at 后再请求,会话被销毁、踢回登录页:

# mysql roundcube -e "SELECT expires_at, NOW() FROM session WHERE sess_id='jr26q0je9gr0f6jnrpe4dovgr3';"
expires_at           NOW()
2026-10-21 03:40:32  2026-10-21 03:40:34
# curl -s -b rc.jar "http://localhost/?_task=mail" | grep -oE "<title>[^<]*</title>" | head -1
<title>Quzuo Mail 邮件系统 :: 欢迎使用 Quzuo Mail 邮件系统</title>

标题从"收件箱"变回"欢迎使用"——会话过期生效闭环完成。

8. 插件参数:plugins(实测闭环,含错误示范)

默认 []。1.7.5 在 plugins/ 目录内置 36 个官方插件:

# ls /var/www/roundcube/plugins/ | tr '\n' ' '
acl additional_message_headers archive attachment_reminder autologon autologout
database_attachments debug_logger emoticons enigma example_addressbook
filesystem_attachments help hide_blockquote http_authentication identicon
identity_select jqueryui krb_authentication managesieve markasjunk markdown_editor
new_user_dialog new_user_identity newmail_notifier password reconnect
redundant_attachments show_additional_headers squirrelmail_usercopy
subscriptions_option userinfo vcard_attachments virtuser_file virtuser_query
zipdownload

启用列表写法 $config['plugins'] = ['archive', 'zipdownload'];。写一个不存在的插件名不会白屏,但每页请求都会写错误日志——实测加入 'nosuchplugin' 后:

PHP Error in /var/www/roundcube/program/lib/Roundcube/rcube_plugin_api.php (line 216):
Failed to load plugin file /var/www/roundcube/plugins/nosuchplugin/nosuchplugin.php

部署后应检查 logs/errors.log 为空。常用组合:archive(归档文件夹)、zipdownload(整箱打包下载)、managesieve(用户级过滤规则,需 Dovecot ManageSieve 服务,端口 4190)、password(用户自助改密)、enigma(PGP 加解密)。

9. 日志参数

  • log_driver(默认 'file'):日志落到 log_dir(默认 logs/,安装时已 chown 给 www-data)。
  • log_logins(默认 false):打开后每次登录成败都会写 logs/userlogins(实测回显见 5.2 节)。
  • 错误日志恒写 logs/errors.log(skin 缺失、插件加载失败、IMAP 认证失败等都会落在这里,排障第一站)。

10. 生产配置模板

一份经过实测、可直接落地的最小生产模板(在本机 Dovecot/Postfix 环境全链路验证通过):

<?php
$config = [];

// —— 数据库与邮件后端 ——
$config['db_dsnw'] = 'mysql://roundcube:<强密码>@localhost/roundcube';
$config['imap_host'] = 'localhost:143';          // 生产指向邮件服务器,如 'mail.example.com:993?ssl=tlsv12'
$config['smtp_host'] = 'localhost:25';           // 生产建议 'tls://smtp.example.com:587'
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';

// —— 站点标识 ——
$config['product_name'] = 'Quzuo Mail';
$config['skin'] = 'elastic';
$config['language'] = 'zh_CN';
$config['timezone'] = 'Asia/Shanghai';

// —— 安全 ——
$config['des_key'] = '<24字符随机串>';            // 必须替换样例值
$config['force_https'] = true;                   // 配好 TLS 后开启
$config['use_https'] = true;
$config['enable_installer'] = false;             // 装完即关

// —— 功能 ——
$config['plugins'] = ['archive', 'zipdownload'];

// —— 会话与日志 ——
$config['session_lifetime'] = 60;                // 分钟;注意最小 120 秒
$config['log_logins'] = true;

11. 常见问题

Q1:改了 config.inc.php 完全不生效? 九成是 Opcache 缓存(见第 1 节),systemctl reload apache2;剩下检查语法(php -l)——实测中一次手滑写成 [' 混引号直接 PHP 500。

Q2:username_domain 配了却"没生效"? 先看 Dovecot 是否真的收到了带域名的用户名(journalctl -u dovecot),再确认是否需要 auth_username_format = %Ln 配套;最后确认 users 表里旧记录与新格式并存的问题。

Q3:登录后收件箱为空但 Webmail 不报错? 与配置无关,检查后端账号的邮箱实际位置(doveadm search -u admin mailbox INBOX ALL),以及 Postfix 本地投递目标 /var/mail/<user> 与 Dovecot 的 mail_location 是否一致。

Q4:如何回滚某个参数? 删掉 config.inc.php 中对应行即可——defaults.inc.php 的默认值始终兜底;改完 reload Apache。

参考资料

  • 源码包内 config/defaults.inc.php(全部默认值与注释,本文默认值摘录自 1.7.5 Complete 包)
  • 源码包内 program/include/rcmail.php(username_domain 应用逻辑)、program/lib/Roundcube/rcube_session.php(lifetime 下限 max(120, ...))、program/lib/Roundcube/session/db.php(滑动过期实现)
  • 本站相关文档:Ubuntu 22.04 安装 Roundcube 1.7.5 指南、Dovecot 2.3.16 配置参数详解