Dada Mail 常用 CLI 命令详解

Dada Mail 11.22.0 命令行实操:mail.cgi 自检调用、subscribe_email.pl 订阅脚本、官方迁移备份脚本、_schedules 调度入口、mysqldump 删表恢复回环与日志排查,含未实测项清单。

Dada Mail邮件Perl 语言2026/10/28

Dada Mail 常用 CLI 命令详解

基于 Dada Mail v11.22.0 在 Ubuntu 22.04 实测(2026-10-28)。Dada Mail 的"命令行"由四类构成:mail.cgi 本体调用、官方维护/迁移脚本(extras/scripts/)、cron 调度 URL、以及围绕 SQL 与文件目录的备份恢复操作。文中环境与《Dada Mail Ubuntu 22.04 安装部署指南》一致:程序目录 /usr/lib/cgi-bin/dada,数据目录 /var/lib/dadamail/.dada_files,示例列表 devops。

一、mail.cgi 本体的命令行调用

mail.cgi 是标准 CGI 程序,直接以 perl 运行会输出完整 HTTP 响应(不进 Web 服务器)。实测:

cd /usr/lib/cgi-bin/dada && perl ./mail.cgi | head -7

实测回显(照抄):

Expires: Wed, 11 Jan 1984 05:00:00 GMT
Date: Wed, 28 Oct 2026 04:45:21 GMT
Cache-control: max-age=0, no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: text/html; charset=UTF-8

<!doctype html>

可用来做程序健康自检:能打出这组头即说明 Perl 环境、Config 加载、模块链路全部正常。

二、官方维护与迁移脚本(extras/scripts/)

发行包自带脚本清单(实测 ls):

dada3_to_dada4_sql.pl  dada_archives_backup_to_sql.pl  dada_archives_db_to_sql.pl
dada_clickthrough_plaintext_to_sql.pl  dada_settings_backup_to_sql.pl
dada_settings_db_to_sql.pl  dada_subscribers_plaintext_to_sql.pl
subscribe  tracker_add_missing_num_subs.cgi  webservices

2.1 CLI 订阅:subscribe/subscribe_email.pl

参数(源码 GetOptions 定义):--email 收件地址、--list 列表短名、--fields "key=value" 自定义档案字段、--verbose 打印结果。

正常订阅:

cd /usr/lib/cgi-bin/dada
perl extras/scripts/subscribe/subscribe_email.pl \
  --email 'alice@example.com' --list devops --verbose

实测回显(照抄):

Email: alice@example.com
List: devops
Fields:

$VAR1 = {
          'errors' => {},
          'status' => 1
        };

status => 1 即成功。入库验证(实测):

# mysql dadamail -e 'SELECT email,list FROM dada_subscribers;'
email               list
alice@example.com   devops

带档案字段批量订阅:

perl extras/scripts/subscribe/subscribe_email.pl \
  --email 'bob@example.com' --list devops --fields 'name=Bob'

实测回显(verbose 关闭时无输出,静默成功):

Email: bob@example.com
List: devops
Fields:

$VAR1 = {
          'errors' => {},
          'status' => 1
        };

失败分支:对不存在的列表运行(--list nosuchlist),脚本静默退出、无输出、退出码 0;加 --verbose 才会打印包含 invalid_list => 1 的诊断结构。运维上建议封装时统一带 --verbose 并解析 status 字段。

2.2 备份→SQL 迁移脚本

把老式文件存储(.backup 文件)中的设置/归档迁移进 SQL:

cd /usr/lib/cgi-bin/dada
perl extras/scripts/dada_settings_backup_to_sql.pl

实测回显(照抄):

Content-Type: text/html; charset=ISO-8859-1

<pre>beginning...
Done.
perl extras/scripts/dada_archives_backup_to_sql.pl

实测回显:

Content-Type: text/html; charset=ISO-8859-1

<pre>beginning...
Done.

两个脚本对全新安装(无历史 .backup 文件)会直接 beginning... Done. 空跑一遍,可安全执行。

2.3 其余脚本速查

脚本用途
dada3_to_dada4_sql.plDada 3 老版数据升 4+ SQL 结构
dada_settings_db_to_sql.pl / dada_archives_db_to_sql.pl跨 SQL 后端搬迁(库到库)
dada_subscribers_plaintext_to_sql.pl明文订户文件导入 SQL
dada_clickthrough_plaintext_to_sql.pl点击日志明文→SQL
tracker_add_missing_num_subs.cgiTracker 统计补偿
webservices/第三方语言(PHP/Perl)调用样例

以上迁移类脚本除 2.2 两个外未逐一实测,用法以脚本头注释与官方文档为准。

三、cron 调度入口(_schedules URL)

官方唯一的后台任务驱动入口,覆盖 Mailing Monitor、定时群发、Bounce Handler、Bridge:

http://<主机>:8150/cgi-bin/dada/mail.cgi/_schedules/_all/_all/_silent/

URL 四段参数为:_schedules(flavor)/ _all(列表范围)/ _all(任务范围)/ _silent(静默模式)。

实测触发:

# curl -s -o /dev/null -w '%{http_code}\n' \
  'http://localhost:8150/cgi-bin/dada/mail.cgi/_schedules/_all/_all/_silent/'
200

配合 .dada_config 中 $SCHEDULED_JOBS_OPTIONS 的 log => 1(见配置篇生效实录),每次触发都会在 .logs/cronjob_output.txt 落一条运行记录(实测内容):

Started: Wed Oct 28 05:00:53 2026 UTC
PID: 8933
Running as uid:, www-data
Running as dedicated schedule.

crontab 生产写法(每 5 分钟,www-data 身份):

*/5 * * * * /bin/curl --user-agent "Mozilla/5.0 (compatible;)" --silent --get --url "http://localhost:8150/cgi-bin/dada/mail.cgi/_schedules/_all/_all/_silent/" > /dev/null

四、日志查看命令

运行日志全部位于 .dada_files/.logs/(实测目录内容:dada.txt、errors.txt、cronjob_output.txt):

tail -f /var/lib/dadamail/.dada_files/.logs/dada.txt    # 订阅/退订/列表操作审计
tail -f /var/lib/dadamail/.dada_files/.logs/errors.txt  # 程序错误

dada.txt 实测样例(照抄,创建列表时落的一条审计):

[Wed Oct 28 04:51:41 2026]	devops	127.0.0.0	List Created	remote_host:,ip_address:127.0.0.1

errors.txt 实测样例(探测无效 flavor 时产生,可佐证排障):

unknown param called: "list_viewer" REMOTE HOST:  REMOTE_ADDR: 127.0.0.1 at /usr/lib/cgi-bin/dada/DADA/App.pm line 651, <CONFIG> line 1.

五、备份与恢复实测

5.1 备份策略概览

对象备份物命令
SQL 数据(订户/设置/归档等 21 张表)mysqldump 转储mysqldump dadamail
全局配置.configs/.dada_configcp
日志/模板/临时文件.dada_files 其余目录tar

5.2 mysqldump 备份实测

mkdir -p /var/backups/dadamail
mysqldump dadamail > /var/backups/dadamail/dadamail-$(date +%F).sql
ls -lh /var/backups/dadamail/

实测回显:

total 28K
-rw-r--r-- 1 root root 25K Oct 28 04:54 dadamail-2026-10-28.sql

5.3 删表→恢复回环实测

模拟灾难(删除订户表)后用备份恢复:

mysql dadamail -e 'DROP TABLE dada_subscribers;'
mysql dadamail < /var/backups/dadamail/dadamail-2026-10-28.sql
mysql dadamail -e 'SELECT email,list FROM dada_subscribers;'

恢复后实测回显:

email               list
alice@example.com   devops
bob@example.com     devops

数据完整回环,恢复即"导入转储文件"一步。

5.4 .dada_files 打包备份

tar czf /var/backups/dadamail/dadafiles-$(date +%F).tar.gz \
  -C /var/lib/dadamail .dada_files

恢复时解回原位并保持属主为运行用户(www-data):

tar xzf dadafiles-2026-10-28.tar.gz -C /var/lib/dadamail
chown -R www-data:www-data /var/lib/dadamail/.dada_files

六、订户数据的直接查询与导出

排查层面可直接查库(实测):

# mysql dadamail -e 'SELECT email,list FROM dada_subscribers;'
# mysql dadamail -e 'SELECT COUNT(*) FROM dada_subscribers;'

面向运营的订户导出(CSV)走管理端:登录列表控制面板 → Members(View List)→ 右上角 Export,按向导选择字段导出 CSV;导入用同页 Import(支持 CSV 上传与"字段-列"映射)。此链路属管理端图形操作,本文未做逐帧截图级实测,操作路径以官方文档《Dada Mail Members/View List》为准;应急场景可用 5.3 的 SQL 方式等价替代。

七、发信链路的命令行验证

Dada Mail 默认经 sendmail 兼容命令发信($MAILPROG = '/usr/sbin/sendmail')。验证底层通道连通性(与 Dada Mail 无关、纯系统级):

printf 'Subject: sendmail-test\nTo: root@localhost\n\nhello from sendmail\n' | sendmail root@localhost
cat /var/mail/root | head -5

实测回显(本地 Postfix 投递成功):

From root@dadamail-lab  Wed Oct 28 04:52:52 2026
Return-Path: <root@dadamail-lab>
X-Original-To: root@localhost
Delivered-To: root@localhost
Received: by dadamail-lab (Postfix, from userid 0)

从 Dada Mail 管理端发起群发/测试信后,可用 mailq 观察队列、.logs/dada.txt 观察发送审计。管理端群发的完整表单流程(Send a Message → 确认 → 队列发送)属图形操作,本文未实测到投递回执级别;预期行为以官方文档《Sending Messages》为准:消息入队后由 Mailing Monitor(即 _schedules 调度)分批投递。

八、未实测项清单

项原因建议
管理端群发全流程投递回执表单链路图形化操作,未逐帧实测依据官方文档操作,配合 mailq 与日志观察
View List CSV 导出/导入管理端图形链路按 Members 页面向导执行
Bounce Handler / Bridge 的 POP 收信需要可收信的真实邮箱配置 POP 后由 cron 调度自动拉取
dada3_to_dada4_sql.pl 等迁移脚本无老版本数据源迁移前在测试环境演练
Bundle::DadaMailXXL 全量安装需要较长时间编译官方完成页建议执行

相关文档