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 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(写) |
| IMAP | imap_host | 'localhost:143' | IMAP 服务器地址:端口 |
| IMAP | imap_cache | null | IMAP 元数据缓存 TTL(null=关) |
| IMAP | messages_cache | false | 邮件消息体缓存(存数据库) |
| SMTP | smtp_host | 'localhost:587' | SMTP 提交服务器 |
| SMTP | smtp_user / smtp_pass | '%u' / '%p' | SMTP 认证用户/密码占位符 |
| SMTP | smtp_timeout | 0 | 连接超时秒数(0=不限制) |
| 界面 | product_name | 'Roundcube Webmail' | 站点名称(标题、页脚等) |
| 界面 | skin | 'elastic' | 皮肤(1.7 仅内置 elastic) |
| 界面 | language | null | 强制界面语言(null=跟随浏览器) |
| 界面 | timezone | 'auto' | 时区('auto' 跟随浏览器) |
| 界面 | default_charset | 'ISO-8859-1' | 缺省字符集 |
| 登录 | login_lc | 2 | 用户名转小写(2=登录时转换) |
| 登录 | username_domain | '' | 给不带 @ 的用户名自动补域 |
| 登录 | identities_level | 0 | 身份管理自由度(0=用户任意增改) |
| 安全 | des_key | 'rcmail-!24ByteDESkey*Str' | 会话数据加密密钥(必改) |
| 安全 | cipher_method | 'DES-EDE3-CBC' | 加密算法(配套 24 字节密钥) |
| 安全 | enable_installer | false | 是否启用 Web 安装器 |
| 安全 | ip_check | false | 绑定客户端 IP 校验会话 |
| 安全 | referer_check | false | 校验 Referer 防 CSRF |
| 安全 | force_https / use_https | false / false | 强制 HTTPS(链接生成/登录检测) |
| 会话 | session_lifetime | 10 | 会话有效期(分钟,实测最小 120 秒) |
| 插件 | plugins | [] | 启用的插件列表 |
| 日志 | log_driver | 'file' | 日志驱动(file/syslog/stdout) |
| 日志 | log_logins | false | 记录登录成败日志 |
| 杂项 | support_url | '' | 帮助/支持链接(空=隐藏入口) |
| 杂项 | useragent | null | 发信 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 配置参数详解