Ubuntu 22.04 安装 Dada Mail 11.22.0 指南

在 Ubuntu 22.04 上从零安装 Dada Mail 11.22.0 的实测全流程:apt 与 cpanm 依赖、Apache prefork 调优、MariaDB 建库、Web 安装向导、定时任务、建列表与发信闭环验证,附离线部署与排障实录。

DadaMail邮件Perl 语言Ubuntu22.042026/10/28

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 LTSPRETTY_NAME="Ubuntu 22.04.5 LTS"
Perl5.34.0This is perl 5, version 34, subversion 0 (v5.34.0) built for x86_64-linux-gnu-thread-multi
Apache2.4.52apache2 2.4.52-1ubuntu4.25,mpm_prefork + mod_cgi
MariaDB10.6.23mariadb-server 1:10.6.23-0ubuntu0.22.04.1
Postfix3.6.4postfix 3.6.4-1ubuntu1.4,本地发信与投递
Dada Mail11.22.0发布标识 v11_22_0_stable_2023-09-18
Web 端口8146Listen 8146(实测 ss -ltnp 命中 apache2 进程)

文中示例统一使用以下约定(均为实测环境取值,部署时按需替换):

项示例值
服务器地址10.89.70.2
Dada Mail Root Passwordq1w2e3r4(管理端登录用)
MySQL 库名 / 用户 / 密码dadamail / dadamail / q1w2e3r4
程序目录/usr/lib/cgi-bin/dada
数据目录/var/lib/dadamail/.dada_files

二、前置条件

  1. 系统权限:root 或具备 sudo 的账号;
  2. 端口:8146 未被占用(ss -ltnp | grep 8146 无输出即可);
  3. 数据库:MariaDB(或 MySQL 5.7+)可登录并具备建库权限;
  4. 邮件链路:建议预装 Postfix,用于群发与确认邮件的实际投递验证;
  5. 网络:方案 A 要求能访问 SourceForge 下载发行包(约 29 MB);方案 B 见第五节;
  6. 浏览器: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)。向导按页引导完成:

  1. 欢迎与许可确认页;
  2. 环境自检页(逐项检查 Perl 模块、目录权限、数据库连接,全部通过后才放行下一步);
  3. 数据库参数页:依次填写数据库类型 MySQL、主机 localhost、端口 3306、库名 dadamail、用户 dadamail、密码 q1w2e3r4;
  4. 文件与 URL 路径页:数据目录实测填写 /var/lib/dadamail/.dada_files(向导自动创建该目录并授权给 www-data),程序 URL 填 http://10.89.70.2:8146/cgi-bin/dada/mail.cgi;
  5. 管理密码页:设置 Dada Mail Root Password(本文示例 q1w2e3r4),这是今后登录所有列表管理端的最高密码;
  6. 完成页:向导写出全局配置文件并完成建表。

第三步:确认生成的配置文件。 完成后查看 /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 界面完成):

  1. 登录管理端:访问 http://10.89.70.2:8146/cgi-bin/dada/mail.cgi,输入列表短名 devops 与 Root Password q1w2e3r4 进入创建流程;
  2. 创建列表:填写列表名 DevOps Weekly、列表密码 List2026pass、列表所有者邮箱 admin@example.com(列表密码不能与 Root Password 相同,且需含大小写字母与数字,实测见第八节 8.4);
  3. 订阅确认:在列表订阅表单填入 admin@example.com 并勾选同意条款提交,邮箱侧实测收到确认邮件;点击邮件中的确认链接,经过一次令牌中转页后提示订阅成功,订户随即收到欢迎邮件;
  4. 群发验证:以列表密码登录 devops 列表管理端,撰写主题为 DevOps Weekly #1 - Hello from the Lab 的消息并提交群发,调度入口在数十秒内完成投递;
  5. 收信验证:列表所有者邮箱对应的本地邮箱 /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 物料清单与预置

  1. 发行包:在外网下载 dada_mail-v11_22_0_stable_2023-09-18.tar.gz 后传输至内网服务器;
  2. 系统依赖:在同类外网机器上用 apt-get download <包名> 连同依赖下载 .deb 文件,拷入内网后 dpkg -i *.deb 安装;或在有本地镜像源的机房直接 apt-get install;
  3. CPAN 模块:在外网机器执行 cpanm -L /opt/dadamail-perl HTML::Packer CSS::Packer(生成自包含目录),连同 -L 指定的目录整体拷入内网,运行期通过 PERL5LIB=/opt/dadamail-perl/lib/perl5 注入;
  4. 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 表单个列表管理端界面修改

安装后最常核对的三处:

  1. $PROGRAM_URL:对外访问地址,换域名/端口后必须同步修改(实测文件第 16~17 行);
  2. %SQL_PARAMS:数据库连接四要素,改库密码后同步更新;
  3. $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 实测通过。部署文档中应提前约定列表密码规范。

现象:使用程序自带 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 访问如常——该流程可直接用作升级前快照与故障回滚手段。

十、参考链接