Ubuntu 22.04 安装 Dada Mail 11.22.0 指南
在 Ubuntu 22.04 上从零安装 Dada Mail 11.22.0 的实测全流程:apt 与 cpanm 依赖、Apache prefork 调优、MariaDB 建库、Web 安装向导、定时任务、建列表与发信闭环验证,附离线部署与排障实录。
Ubuntu 22.04 安装 Dada Mail 11.22.0 指南
目标:在 Ubuntu 22.04 服务器上从零安装 Dada Mail 11.22.0,跑通「环境准备 → 依赖安装 → Web 安装向导 → 建列表 → 订阅确认 → 群发投递」的完整闭环,并沉淀排障实录。全部命令与回显均在实测环境(Apache 2.4.52 + MariaDB 10.6.23 + Perl 5.34.0,Web 端口 8146)照实记录;选型背景与产品能力参见 《Dada Mail 11.22.0 介绍与选型指南》。
一、环境信息
实测环境组件与版本(dpkg -l、perl -v、cat /etc/os-release 实测回显):
| 组件 | 实测版本 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS | PRETTY_NAME="Ubuntu 22.04.5 LTS" |
| Perl | 5.34.0 | This is perl 5, version 34, subversion 0 (v5.34.0) built for x86_64-linux-gnu-thread-multi |
| Apache | 2.4.52 | apache2 2.4.52-1ubuntu4.25,mpm_prefork + mod_cgi |
| MariaDB | 10.6.23 | mariadb-server 1:10.6.23-0ubuntu0.22.04.1 |
| Postfix | 3.6.4 | postfix 3.6.4-1ubuntu1.4,本地发信与投递 |
| Dada Mail | 11.22.0 | 发布标识 v11_22_0_stable_2023-09-18 |
| Web 端口 | 8146 | Listen 8146(实测 ss -ltnp 命中 apache2 进程) |
文中示例统一使用以下约定(均为实测环境取值,部署时按需替换):
| 项 | 示例值 |
|---|---|
| 服务器地址 | 10.89.70.2 |
| Dada Mail Root Password | q1w2e3r4(管理端登录用) |
| MySQL 库名 / 用户 / 密码 | dadamail / dadamail / q1w2e3r4 |
| 程序目录 | /usr/lib/cgi-bin/dada |
| 数据目录 | /var/lib/dadamail/.dada_files |
二、前置条件
- 系统权限:root 或具备 sudo 的账号;
- 端口:8146 未被占用(
ss -ltnp | grep 8146无输出即可); - 数据库:MariaDB(或 MySQL 5.7+)可登录并具备建库权限;
- 邮件链路:建议预装 Postfix,用于群发与确认邮件的实际投递验证;
- 网络:方案 A 要求能访问 SourceForge 下载发行包(约 29 MB);方案 B 见第五节;
- 浏览器:Web 安装向导在浏览器中完成,无需命令行交互。
三、版本选型说明
- 版本:11.22.0,官方最新稳定版(发布标识
v11_22_0_stable_2023-09-18),官网下载页与 GitHub Releases 页口径一致(查证于 2026-10-28); - 发行物:
dada_mail-v11_22_0_stable_2023-09-18.tar.gz,官方托管于 SourceForge,下载直达地址https://sourceforge.net/projects/dadamail/files/dada_mail-v11_22_0_stable_2023-09-18.tar.gz/download,实测文件大小 29,738,745 字节(约 29 MB); - 安装形态:发行包解压后为一个
dada/目录(tar tzf实测回显前三行:dada/、dada/DADA/、dada/installer-disabled/),整体放入cgi-bin/dada即完成程序部署;数据库表结构与全局配置由 Web 安装向导自动生成; - 免费版限制:最多 3 个列表、每列表 100 订户(选型依据详见 《Dada Mail 11.22.0 介绍与选型指南》)。
四、方案 A:官方 tarball 在线安装(推荐)
4.1 安装系统依赖
apt-get update
apt-get install -y apache2 mariadb-server postfix mailutils cpanminus \
libdbd-mysql-perl libdbd-sqlite3-perl libarchive-zip-perl libjson-perl \
libtext-csv-perl libtext-csv-xs-perl libtext-template-perl libwww-perl
实测安装后的关键包版本(dpkg -l 照实摘录):
apache2 2.4.52-1ubuntu4.25
cpanminus 1.7045-1
libarchive-zip-perl 1.68-1
libdbd-mysql-perl:amd64 4.050-5ubuntu0.22.04.1
libdbd-sqlite3-perl:amd64 1.70-3build1
libjson-perl 4.04000-1
libtext-csv-perl 2.01-1
libtext-csv-xs-perl:amd64 1.47-1build1
libtext-template-perl 1.60-1
libwww-perl 6.61-1ubuntu0.1
mailutils 1:3.14-1
mariadb-server 1:10.6.23-0ubuntu0.22.04.1
perl 5.34.0-3ubuntu1.9
postfix 3.6.4-1ubuntu1.4
说明:
libdbd-sqlite3-perl虽然最终使用 MySQL 后端,但 Dada Mail 部分内部逻辑(会话等)依赖 SQLite 驱动,缺失时首次访问会直接报错(见第八节 8.2)。
4.2 安装 CPAN 模块
apt 仓库覆盖了绝大多数依赖,实测仅剩 HTML::Packer 与 CSS::Packer 需经 cpanm 安装(群发时会用到,缺失报错见第八节 8.6):
cpanm -n HTML::Packer CSS::Packer
实测依赖链(cpanm 工作目录照实摘录,8 个模块全部装成):
Algorithm-Diff-1.201
CSS-Packer-2.09
HTML-Packer-2.11
JavaScript-Packer-2.12
Regexp-RegGrp-2.01
Safe-Isa-1.000010
Test-File-Contents-0.242
Text-Diff-1.46
4.3 下载并解压发行包
mkdir -p /opt/pkg && cd /opt/pkg
wget -O dada_mail-v11_22_0_stable_2023-09-18.tar.gz \
"https://sourceforge.net/projects/dadamail/files/dada_mail-v11_22_0_stable_2023-09-18.tar.gz/download"
tar tzf dada_mail-v11_22_0_stable_2023-09-18.tar.gz | head -3
tar xzf dada_mail-v11_22_0_stable_2023-09-18.tar.gz
tar tzf 实测回显(前三行,确认包结构):
dada/
dada/DADA/
dada/installer-disabled/
解压后得到 dada/ 目录;installer-disabled 是官方对安装器的默认"上锁"形态(改名后才能运行向导)。
4.4 部署程序目录
将整个 dada/ 目录移动到 CGI 目录下,并交给 Web 服务运行用户:
mv /opt/pkg/dada /usr/lib/cgi-bin/dada
chown -R www-data:www-data /usr/lib/cgi-bin/dada
部署完成后程序目录结构(ls /usr/lib/cgi-bin/dada/ 实测回显):
DADA
data
extensions
extras
installer-disabled
mail.cgi
plugins
static
templates
其中 mail.cgi 是唯一入口程序;installer-disabled 即安装器目录(目录内容实测为 install.cgi、installer_errors.txt、lib、templates)。
4.5 配置 Apache 虚拟主机
关键点:必须使用 mpm_prefork + mod_cgi 组合。Ubuntu 22.04 的 Apache 默认启用 mpm_event(配合 cgid 模块),实测访问 mail.cgi 会出现 503(原因与处置见第八节 8.1),需先行切换:
a2dismod mpm_event
a2enmod mpm_prefork cgi
在 /etc/apache2/ports.conf 中加入监听端口(实测文件中该行为 Listen 8146),然后新建站点配置 /etc/apache2/sites-available/dadamail.conf:
<VirtualHost *:8146>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
启用站点并重启(ScriptAlias 交由系统自带的 /etc/apache2/conf-available/serve-cgi-bin.conf 处理 /cgi-bin/ 映射,默认将 /usr/lib/cgi-bin/ 暴露为 /cgi-bin/,无需额外配置):
a2ensite dadamail
systemctl restart apache2
实测验证回显(apache2ctl -M | grep -E "cgi|mpm" 与 ss -ltnp | grep 8146):
cgi_module (shared)
cgid_module (shared)
mpm_prefork_module (shared)
LISTEN 0 511 0.0.0.0:8146 0.0.0.0:* users:(("apache2",pid=6493,fd=3))
4.6 创建数据库与账号
使用 root 登录 MariaDB 后执行(示例账号 dadamail/q1w2e3r4,密码请自行调整):
CREATE DATABASE dadamail CHARACTER SET utf8mb4;
CREATE USER 'dadamail'@'localhost' IDENTIFIED BY 'q1w2e3r4';
GRANT ALL PRIVILEGES ON dadamail.* TO 'dadamail'@'localhost';
FLUSH PRIVILEGES;
此时 dadamail 库为空库,全部 dada_* 表由安装向导创建。
4.7 运行 Web 安装向导
第一步:解锁安装器。 将 installer-disabled 改名为 installer(官方要求),可附加随机后缀避免被扫描:
mv /usr/lib/cgi-bin/dada/installer-disabled /usr/lib/cgi-bin/dada/installer-K7q2mXe9pT
第二步:浏览器访问向导。 地址为 http://10.89.70.2:8146/cgi-bin/dada/installer-K7q2mXe9pT/install.cgi(实测向导目录内入口文件名为 install.cgi)。向导按页引导完成:
- 欢迎与许可确认页;
- 环境自检页(逐项检查 Perl 模块、目录权限、数据库连接,全部通过后才放行下一步);
- 数据库参数页:依次填写数据库类型
MySQL、主机localhost、端口3306、库名dadamail、用户dadamail、密码q1w2e3r4; - 文件与 URL 路径页:数据目录实测填写
/var/lib/dadamail/.dada_files(向导自动创建该目录并授权给 www-data),程序 URL 填http://10.89.70.2:8146/cgi-bin/dada/mail.cgi; - 管理密码页:设置 Dada Mail Root Password(本文示例
q1w2e3r4),这是今后登录所有列表管理端的最高密码; - 完成页:向导写出全局配置文件并完成建表。
第三步:确认生成的配置文件。 完成后查看 /var/lib/dadamail/.dada_files/.configs/.dada_config,实测文件头部(照实摘录):
# The location of your .dada_config directory:
$DIR = '/var/lib/dadamail/.dada_files';
# The URL to access Dada Mail:
$PROGRAM_URL = 'http://10.89.70.2:8146/cgi-bin/dada/mail.cgi';
$S_PROGRAM_URL = 'http://10.89.70.2:8146/cgi-bin/dada/mail.cgi';
$RUNNING_UNDER = 'CGI';
数据库参数段(照实摘录):
$BACKEND_DB_TYPE = 'SQL';
%SQL_PARAMS = (
dbserver => 'localhost',
database => 'dadamail',
port => '3306',
dbtype => 'mysql',
user => 'dadamail',
pass => 'q1w2e3r4',
);
4.8 安装完成验证
表结构验证:安装向导在 dadamail 库中创建了 21 张表,SHOW TABLES 实测完整回显:
dada_archives
dada_bounce_scores
dada_clickthrough_url_log
dada_clickthrough_urls
dada_confirmation_tokens
dada_consent_activity
dada_consents
dada_email_message_previews
dada_mass_mailing_event_log
dada_message_drafts
dada_password_protect_directories
dada_privacy_policies
dada_profile_fields
dada_profile_fields_attributes
dada_profile_settings
dada_profiles
dada_rate_limit_hits
dada_sessions
dada_settings
dada_simple_auth_str
dada_subscribers
数据目录验证:ls /var/lib/dadamail/.dada_files/ 实测回显:
.archives
.backups
.configs
.lists
.logs
.templates
.tmp
.htaccess
主程序验证:curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8146/cgi-bin/dada/mail.cgi 实测返回 200。
安装器安全处置:安装完成后必须将安装器目录改回 installer-disabled(或直接删除),否则向导入口始终暴露。实测处置与验证:
mv /usr/lib/cgi-bin/dada/installer-K7q2mXe9pT /usr/lib/cgi-bin/dada/installer-disabled
处置后向导地址实测返回 404,主程序仍为 200。
4.9 配置定时任务
Dada Mail 的定时发送、队列调度依赖 _schedules 入口被周期触发。官方建议写入 web 服务运行用户的 crontab,实测配置(crontab -u www-data -e 后 grep dada /var/spool/cron/crontabs/www-data 回显):
*/5 * * * * /usr/bin/curl --user-agent "Mozilla/5.0 (compatible;)" --silent --get --url "http://127.0.0.1:8146/cgi-bin/dada/mail.cgi/_schedules/_all/_all/_silent/" > /dev/null
即每 5 分钟静默触发一次调度入口,负责到期群发、周期任务等后台动作。
4.10 创建列表与发信闭环验证
至此安装完成。以下为实测跑通的业务闭环(操作均在管理端 Web 界面完成):
- 登录管理端:访问
http://10.89.70.2:8146/cgi-bin/dada/mail.cgi,输入列表短名devops与 Root Passwordq1w2e3r4进入创建流程; - 创建列表:填写列表名
DevOps Weekly、列表密码List2026pass、列表所有者邮箱admin@example.com(列表密码不能与 Root Password 相同,且需含大小写字母与数字,实测见第八节 8.4); - 订阅确认:在列表订阅表单填入
admin@example.com并勾选同意条款提交,邮箱侧实测收到确认邮件;点击邮件中的确认链接,经过一次令牌中转页后提示订阅成功,订户随即收到欢迎邮件; - 群发验证:以列表密码登录
devops列表管理端,撰写主题为DevOps Weekly #1 - Hello from the Lab的消息并提交群发,调度入口在数十秒内完成投递; - 收信验证:列表所有者邮箱对应的本地邮箱
/var/mail/root实测共收到 4 封(主题照实摘录):
Subject: DevOps Weekly Mailing List Subscription Confirmation
Subject: Welcome to DevOps Weekly
Subject: DevOps Weekly #1 - Hello from the Lab
Subject: DevOps Weekly #1 - Hello from the Lab
第 3、4 封即为群发消息的两次投递记录,闭环成立。
五、方案 B:离线部署
适用于内网服务器无法访问公网的场景。实测验证依据:Web 安装向导的全部页面、环境自检、建表动作均只与本机及数据库交互,整个安装过程不访问任何外部地址——本方案的关键差异仅在于"物料如何进入内网"。
5.1 物料清单与预置
- 发行包:在外网下载
dada_mail-v11_22_0_stable_2023-09-18.tar.gz后传输至内网服务器; - 系统依赖:在同类外网机器上用
apt-get download <包名>连同依赖下载.deb文件,拷入内网后dpkg -i *.deb安装;或在有本地镜像源的机房直接apt-get install; - CPAN 模块:在外网机器执行
cpanm -L /opt/dadamail-perl HTML::Packer CSS::Packer(生成自包含目录),连同-L指定的目录整体拷入内网,运行期通过PERL5LIB=/opt/dadamail-perl/lib/perl5注入; - Postfix/MariaDB:同样走
.deb离线安装。
5.2 部署步骤
4.4 至 4.9 节的全部步骤在内网按原样执行(程序部署、Apache 配置、建库、向导安装、定时任务),向导内网可正常完成——实测环境中向导建表、生成 .dada_config、21 张表、闭环发信均在隔离网段完成,可作为内网可行性依据。
5.3 共享主机方式(简述,未实测)
官方另提供面向无 shell 权限共享主机的 uncompress_dada.cgi 单文件自解压方案:上传该脚本至可执行目录后经浏览器触发,自动解包发行包并引导进入向导。该路径本次未实测,细节以官方安装文档为准。
六、方案对比与选择建议
| 维度 | 方案 A:tarball 在线安装 | 方案 B:tarball 离线部署 | 共享主机自解压(未实测) |
|---|---|---|---|
| 适用场景 | 有公网访问的独立服务器 | 内网/隔离网段服务器 | 无 shell 权限的托管主机 |
| 依赖获取 | apt + cpanm 在线安装 | .deb/自包含目录预置 | 由主机环境决定,常受限 |
| 安装器 | Web 向导(必须) | Web 向导(实测内网可完成) | 浏览器触发自解压后进向导 |
| root 权限 | 需要 | 需要 | 通常不需要 |
| 可控性/可重复性 | 高,脚本化友好 | 高,物料可固化 | 低 |
| 实测状态 | 全流程实测闭环 | 关键环节实测(向导离线可行) | 未实测 |
建议:独立服务器优先方案 A;内网环境选方案 B 并提前固化物料;共享主机仅在无 root 权限时考虑。
七、安装后配置说明
安装向导生成的 .dada_config 只显式写出"与环境强相关"的少量变量,其余全部沿用程序内置默认值(DADA/Config.pm),形成三层配置体系:
| 层级 | 位置 | 作用域 | 实测要点 |
|---|---|---|---|
| 默认层 | 程序目录 DADA/Config.pm | 全局默认值 | 不建议直接修改 |
| 全局层 | 数据目录 .configs/.dada_config | 全局覆盖 | 向导生成,实测含 $DIR、$PROGRAM_URL、$RUNNING_UNDER、$SUPPORT_FILES、$BACKEND_DB_TYPE、%SQL_PARAMS |
| 列表层 | 数据库 dada_settings 表 | 单个列表 | 管理端界面修改 |
安装后最常核对的三处:
$PROGRAM_URL:对外访问地址,换域名/端口后必须同步修改(实测文件第 16~17 行);%SQL_PARAMS:数据库连接四要素,改库密码后同步更新;$SUPPORT_FILES:静态资源目录与 URL(实测指向/var/www/html/dada_mail_support_files),由向导自动部署 CKEditor 等前端组件。
配置项的逐项语义、取值与调优实践见本专栏后续《配置参数详解》篇。
八、常见问题与排障实录
以下问题均在实测安装过程中真实遇到,现象、原因与处置照实沉淀。
8.1 mail.cgi 返回 503,error.log 报 AH01257
现象:访问 mail.cgi 返回 503 Service Unavailable,/var/log/apache2/error.log 出现 cgid 相关的 AH01257 错误。
原因:Ubuntu 22.04 的 Apache 默认 mpm_event 多路处理模块配合 cgid 守护进程转发 CGI 请求,实测中 cgid 守护与请求进程间连接失败。
处置:切换为 mpm_prefork + mod_cgi(CGI 进程由 Apache 直接拉起,无 cgid 中转):
a2dismod mpm_event
a2enmod mpm_prefork cgi
systemctl restart apache2
处置后 apache2ctl -M 实测确认三个模块共存:
cgi_module (shared)
cgid_module (shared)
mpm_prefork_module (shared)
(cgid_module 仅残留注册,实际生效路径为 cgi_module。)mail.cgi 随即返回 200。
8.2 首次访问报 install_driver(SQLite) failed
现象:装完程序首次访问 mail.cgi,页面报 install_driver(SQLite) failed。
原因:Dada Mail 内部会话等组件默认依赖 DBD::SQLite 驱动,apt 依赖清单漏装。
处置:apt-get install -y libdbd-sqlite3-perl,无需重启 Apache,刷新即恢复。
8.3 脚本驱动向导时的表单解析失配
现象:用 curl/脚本模拟浏览器过向导时,按 HTML 属性正则抽取表单字段失败。 原因:向导页面 HTML 属性值内含换行,逐行正则会漏配。 处置:解析前先把整页 HTML 归一化为单行(空白折叠)再做字段抽取;人工浏览器操作则完全无感。若坚持脚本化,还需注意向导的 CSRF 令牌机制:会话 cookie 中的令牌为 URL 编码形态,回传字段时需先做 URL 解码。
8.4 列表密码被拒
现象:创建列表时提交 q1w2e3r4(与 Root Password 相同)被拒;改用 q1w2e3r4list 仍被拒。
原因:Dada Mail 双重校验——列表密码不允许与 Root Password 相同;同时要求包含大小写字母与数字的组合。
处置:改用 List2026pass 实测通过。部署文档中应提前约定列表密码规范。
8.5 命令行订阅报 list_consent_check_failed
现象:使用程序自带 CLI 脚本 subscribe_email.pl 订阅 admin@example.com 时报 list_consent_check_failed。
原因:列表开启了同意条款(Consent)校验,而该 CLI 脚本的参数不携带同意项,无法通过校验(源码校验逻辑如此,非配置错误)。
处置:走 Web 订阅表单提交并勾选同意项,实测闭环成功;或将列表的同意条款关闭后再用 CLI。另一相关现象:用 root@<主机名> 这类无点域名做订阅邮箱会被判 invalid_email,为本地收信测试可将测试域加入 Postfix 的 mydestination(实测 postconf mydestination 回显 dadamail-lab, lab.internal, localhost.localdomain, localhost)。
8.6 群发时报 cannot use HTML::Packer
现象:管理端提交群发后,投递报错日志出现 cannot use HTML::Packer: Can't locate HTML/Packer.pm。
原因:消息体打包压缩功能依赖 HTML::Packer(及其依赖 CSS::Packer),apt 源无此二包。
处置:cpanm -n HTML::Packer CSS::Packer 安装后重试,群发正常投递(依赖链见 4.2 节)。
九、卸载与清理
按依赖反向拆除,实测验证过"备份 → 删表 → 回环恢复"流程:
# 1. 备份数据库(实测 mysqldump 导出成功)
mysqldump -udadamail -pq1w2e3r4 dadamail > /opt/dadamail_backup.sql
# 2. 移除定时任务
crontab -u www-data -r
# 3. 停用站点并卸载程序目录
a2dissite dadamail && systemctl reload apache2
rm -rf /usr/lib/cgi-bin/dada
# 4. 删除数据目录
rm -rf /var/lib/dadamail
# 5. 删除数据库(若需彻底清理)
mysql -uroot -e "DROP DATABASE dadamail; DROP USER 'dadamail'@'localhost';"
回环验证:实测以 mysqldump 备份后删除全部 21 张表,再以备份文件回灌,表结构与数据完整恢复,mail.cgi 访问如常——该流程可直接用作升级前快照与故障回滚手段。
十、参考链接
- 本专栏:《Dada Mail 11.22.0 介绍与选型指南》——产品定位、架构与选型对比;
- 官方安装文档:https://dadamailproject.com/d/install_dada_mail.pod.html (查询日期 2026-10-28);
- 官方下载页:https://dadamailproject.com/download/ (查询日期 2026-10-28);
- 发行包直达地址:https://sourceforge.net/projects/dadamail/files/dada_mail-v11_22_0_stable_2023-09-18.tar.gz/download (查询日期 2026-10-28);
- 全局配置变量手册:https://dadamailproject.com/d/global_variables.pod.html (查询日期 2026-10-28)。