Zammad 7.2.2 配置参数详解

Zammad 7.2.2 核心配置参数逐项实测:Setting 体系与三种读写方式,product_name、fqdn、notification_sender、ticket_hook、工单编号策略等 7 组参数的改→生效→验证闭环与参数速查表。

Zammad工单系统邮件服务器2026/10/21

Zammad 7.2.2 配置参数详解

目标:讲清楚 Zammad 7.2.2 的配置体系怎么运作,并把运维最常用的 7 组核心参数逐项跑通「读取默认值 → 修改 → 验证生效」的完整闭环。本文全部命令与回显均在 Zammad 7.2.2 实测环境(Ubuntu 22.04 包安装,见《Ubuntu 22.04 安装 Zammad 指南》)执行通过(2026-10-21)。

一、环境信息

  • 操作系统:Ubuntu 22.04 (jammy),x86_64
  • Zammad 版本:7.2.2-1792508402.43c767a.ubuntu22(/opt/zammad/VERSION,包安装)
  • 服务组件:PostgreSQL 14.24 / Redis 6.0.16 / Nginx 1.18.0 / Elasticsearch 9.5.5(已按官方三步连接并重建索引)
  • 管理员账号:admin(Admin + Agent 角色,Basic 认证与 Web 登录均可用)
  • 配置读取方式:zammad run rails r "..."(Rails runner,无需进入交互控制台)

💡 说明:本文参数名与默认值直接取自本机 Setting 表实测,与官方 Web 管理界面(Settings → System)中的配置项一一对应;改值同时会影响 Web 界面,反之亦然。

二、配置体系总览

Zammad 的配置分三层,定位不同,运维时先分清该改哪一层:

层载体典型内容生效方式
Setting 参数层PostgreSQL settings 表界面名称、FQDN、发件人、工单编号策略、搜索集成等业务参数Setting.set 即时生效,无需重启
配置文件层/opt/zammad/config/database.yml 等数据库连接、Redis 连接等启动期配置改后 systemctl restart zammad
Web 服务器层/etc/nginx/sites-available/zammad.conf监听端口、TLS、反代 upstream改后 systemctl restart nginx

日常运维 90% 的参数调整发生在 Setting 层,读写都通过 Rails 控制台(也可在管理界面可视化操作,二者同源):

# 读:查看当前值
zammad run rails r "puts Setting.get('product_name')"
# 写:设置新值
zammad run rails r "Setting.set('product_name', 'Quzuo Lab Helpdesk')"
# 列:按前缀检索参数名(参数多时先列名再取值)
zammad run rails r "puts Setting.where('name LIKE ?', 'ticket_%').pluck(:name).sort.join(\"\n\")"

实测回显(列名命令,输出节选):

ticket_agent_default_notifications
ticket_allow_expert_conditions
ticket_auto_assignment
ticket_auto_assignment_selector
...
ticket_subject_fwd
ticket_subject_re
ticket_subject_size
ticket_trigger_loop_protection_articles_per_ticket
ticket_trigger_loop_protection_articles_total
ticket_trigger_recursive
ticket_trigger_recursive_max_loop

⚠️ 注意:Setting.set 的值即时生效且持久化到数据库,升级 Zammad 不会丢失;但 Zammad 版本迭代会调整参数名(例如本文实测确认 notification.sender.email 这类旧文档参数名在 7.2.2 中已演化为 notification_sender),改参数前先在本机列名确认,不要照抄旧教程。

三、核心参数详解(实测闭环)

以下 7 组参数每项均按「默认值 → 修改 → 回读验证」实测,验证回显均为真实执行结果。

3.1 product_name(系统名称,界面与邮件文案的根)

  • 默认值:"Zammad Helpdesk"
  • 作用:Web 界面标题、邮件通知文案中引用的系统名称;notification_sender 等参数以模板变量 config.product_name 引用它(见 3.3)。
  • 读写方式:Setting.get / Setting.set
zammad run rails r "Setting.set('product_name', 'Quzuo Lab Helpdesk')"
zammad run rails r "puts Setting.get('product_name')"

实测回显:

"Zammad Helpdesk"
"Quzuo Lab Helpdesk"

交叉验证(界面生效):改值后浏览器页面 <title> 立即变化——

curl -s http://localhost/ | grep -oE "<title>[^<]+" | head -1

实测回显:

<title>Quzuo Lab Helpdesk

3.2 fqdn 与 http_type(系统对外地址)

  • 默认值:fqdn = "zammad.example.com",http_type = "http"
  • 作用:fqdn 是 Zammad 对外宣称的主机名,邮件通知里的工单链接、Webhook 回调地址、API 文档示例 URL 都由 http_type://fqdn 拼出;http_type 取 http 或 https。生产环境启用 TLS 后必须把 http_type 改为 https 并把 fqdn 改为真实域名,否则通知邮件里的链接全部指错。
  • 读写方式:Setting.get / Setting.set
zammad run rails r "Setting.set('fqdn', 'zammad.lab.local')"
zammad run rails r "puts Setting.get('fqdn'), Setting.get('http_type')"

实测回显:

"zammad.example.com"
"http"
"zammad.lab.local"

⚠️ 注意:fqdn 改完立即生效于新生成的链接;notification_sender 这类引用 config.fqdn 的参数会在下次求值时用新值(见 3.3 实测)。

3.3 notification_sender(邮件发件人,动态模板参数)

  • 默认值:模板字符串 "#{config.product_name} <noreply@#{config.fqdn}>"(数据库中保存的是模板;读取时按当前 product_name 与 fqdn 求值)
  • 作用:所有系统通知邮件的发件人地址。
  • 读写方式:Setting.get / Setting.set

实测发现(重要):该参数是动态求值的——在完成 3.1 与 3.2 的修改后读取它,返回值不再是模板原文,而是用新 product_name、fqdn 渲染后的结果:

zammad run rails r "puts Setting.get('notification_sender')"

实测回显(3.1/3.2 改值后):

"Quzuo Lab Helpdesk" <noreply@zammad.lab.local>

显式固定发件人(不再跟随模板求值):

zammad run rails r "Setting.set('notification_sender', 'Quzuo Service Desk <support@lab.local>')"

实测回显:

"Quzuo Service Desk <support@lab.local>"

3.4 ticket_hook 系(工单编号引用格式)

  • 默认值:ticket_hook = "Ticket#",ticket_hook_divider = "",ticket_hook_position = "right"
  • 作用:ticket_hook 是工单编号的引用前缀(默认邮件里出现 Ticket#12345)。客户回复邮件时,Zammad 靠在主题中扫描这个前缀 + 编号来把回复挂回原工单;ticket_hook_position 决定前缀出现在编号左侧(right 指编号在 hook 右侧)。改它必须同步通知客户侧的存量邮件模板,否则旧邮件引用失效。
  • 读写方式:Setting.get / Setting.set
zammad run rails r "Setting.set('ticket_hook', 'SR#')"
zammad run rails r "puts Setting.get('ticket_hook')"

实测回显:

"Ticket#"
"SR#"

3.5 ticket_number 与编号生成策略

  • 默认值:ticket_number = "Ticket::Number::Increment"(自增策略),ticket_number_increment = {"checksum" => false, "min_size" => 5}
  • 作用:工单编号生成器。自增策略下 min_size 控制编号最小位数(不足左补零)、checksum 控制是否附加校验位。官方另提供日期策略 Ticket::Number::Date(ticket_number_date 参数组,按日期+序号编码)。自增策略可读性好,日期策略按天重置适合高吞吐场景。
  • 读写方式:Setting.get / Setting.set(值是结构体)
zammad run rails r "Setting.set('ticket_number_increment', { 'checksum' => false, 'min_size' => 8 })"
zammad run rails r "puts Setting.get('ticket_number_increment').inspect"

实测回显:

{"checksum" => false, "min_size" => 5}
{"checksum" => false, "min_size" => 8}

3.6 ticket_subject_size 与 ticket_subject_re(回复主题规范)

  • 默认值:ticket_subject_size = "110",ticket_subject_re = "RE"
  • 作用:ticket_subject_size 限制系统生成的邮件主题长度(字符数,超长截断),防止客户邮箱端主题溢出;ticket_subject_re 定义回复主题的 RE: 前缀关键字,与 ticket_hook 一样参与「回复邮件归并到原工单」的判定。
  • 读写方式:Setting.get / Setting.set
zammad run rails r "Setting.set('ticket_subject_size', '60')"
zammad run rails r "puts Setting.get('ticket_subject_size')"

实测回显:

"110"
"60"

3.7 ui_ticket_create_default_type(工单创建默认渠道类型)

  • 默认值:"phone-in"
  • 作用:坐席在 Web 界面手动新建工单时,默认选中的工单类型(phone-in 来电 / email 邮件 / web 网页表单等)。按支持中心实际主渠道调整可减少坐席误选。
  • 读写方式:Setting.get / Setting.set
zammad run rails r "Setting.set('ui_ticket_create_default_type', 'email')"
zammad run rails r "puts Setting.get('ui_ticket_create_default_type')"

实测回显:

"phone-in"
"email"

3.8 es_url / es_user / es_password(Elasticsearch 集成)

  • 默认值:新装系统 es_url 为空(未启用搜索);连接后如本文环境 es_url = "https://localhost:9200"、es_user = "elastic"、es_index = "zammad"
  • 作用:全文搜索与报表的搜索引擎集成。三参数与 CA 证书共同决定 Zammad ⇄ ES 的连接;改完必须重建索引(zammad run rake zammad:searchindex:rebuild)才生效。
  • 读写方式:Setting.get / Setting.set + rake 重建
  • 完整闭环:见《Ubuntu 22.04 安装 Zammad 指南》4.7 节实测(三条 Setting.set + 证书导入 + 索引重建回显),此处不重复。

四、参数速查表

参数名默认值(7.2.2 实测)作用生效方式
product_name"Zammad Helpdesk"界面名称、邮件文案根变量即时生效,无需重启
fqdn"zammad.example.com"对外主机名,链接拼接即时生效
http_type"http"对外协议(http/https)即时生效
notification_sender模板 #{config.product_name} <noreply@#{config.fqdn}>通知邮件发件人(动态求值)即时生效
ticket_hook"Ticket#"工单编号引用前缀即时生效
ticket_hook_divider""前缀与编号分隔符即时生效
ticket_hook_position"right"编号相对前缀位置即时生效
ticket_number"Ticket::Number::Increment"编号生成策略新工单起生效
ticket_number_increment{"checksum"=>false, "min_size"=>5}自增策略参数新工单起生效
ticket_subject_size"110"邮件主题长度上限即时生效
ticket_subject_re"RE"回复主题前缀关键字即时生效
ui_ticket_create_default_type"phone-in"新建工单默认类型即时生效
es_url / es_user / es_password未启用(连接后见 3.8)Elasticsearch 集成需重建搜索索引

五、常见问题(FAQ)

Q1:Setting.set 改完要重启服务吗?

不需要。Setting 参数存储在 PostgreSQL settings 表中,应用每次读取都取实时值——本文 3.1 的页面标题交叉验证(改完直接 curl 看到新 title)即为实证。需要重启的只有配置文件层(database.yml 等)与 Nginx 层的改动。

Q2:zammad run rails r "load '/tmp/xxx.rb'" 报 cannot load such file?

zammad run 包装器切换到 zammad 用户的隔离环境,/tmp 不可见(实测确认:脚本复制到 /tmp 后 runner 找不到文件,报 cannot load such file -- /tmp/xxx.rb)。把脚本放到 /opt/zammad/ 下再 load 绝对路径即可(实测可用),执行完记得删除。

Q3:改了参数,但 Web 界面里看到的是旧值?

三种可能:① 浏览器缓存了旧界面数据,强刷(Ctrl+Shift+R);② 改的不是同一个参数名(参数名在版本间有演化,先 Setting.where('name LIKE ?').pluck(:name) 确认存在);③ 该参数属于「新工单起生效」类(如编号策略),对存量工单不追溯。

Q4:怎么把参数改回默认?

Setting.set 写回默认值即可(速查表已列出本文涉及参数的默认值)。例如:zammad run rails r "Setting.set('product_name', 'Zammad Helpdesk')"。

六、参考链接