Apache SpamAssassin 安装指南
面向 Ubuntu 22.04 服务器从零部署 Apache SpamAssassin 3.4.6 垃圾邮件过滤系统,覆盖软件源在线安装与官方源码编译两套方案、systemd 托管 spamd、GTUBE 标准样例判定验证、sa-update 规则更新与卸载清理,命令与回显均实测。
Apache SpamAssassin 安装指南
目标:在真实 Ubuntu 22.04 服务器上从零安装 Apache SpamAssassin 3.4.6(基于 Perl 的垃圾邮件过滤器),覆盖软件源在线安装、官方源码编译两套方案、systemd 托管 spamd 守护进程、GTUBE 标准测试邮件判定验证与卸载清理。以下命令与回显均在 Ubuntu 22.04.5 LTS(主机名 mail01.example.com)真实环境逐步实测。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- 主机名:mail01.example.com
- Perl:5.34.0(系统自带,SpamAssassin 的运行基础)
- Apache SpamAssassin:3.4.6(Ubuntu 软件源包
3.4.6-1ubuntu0.22.04.1) - 安装产物:
/usr/bin/spamassassin、/usr/bin/spamc、/usr/sbin/spamd、/usr/bin/sa-learn、/usr/bin/sa-update、/usr/bin/sa-compile - 服务名:
spamassassin.service(spamd 守护进程,监听 127.0.0.1:783) - 配置目录:
/etc/mail/spamassassin/ - 规则状态目录:
/var/lib/spamassassin/ - 运行用户:root(软件包自动创建
debian-spamd系统用户供降权使用)
💡 说明:SpamAssassin 由 Perl 编写,不依赖 Java;
spamassassin是单封邮件的命令行过滤前端,spamd是常驻守护进程,spamc是与 spamd 配对的轻量客户端。
二、前置条件
- 一台 Ubuntu 22.04 服务器,root 权限。
- 可访问
archive.ubuntu.com软件源(方案 A);或可访问archive.apache.org下载源码包(方案 B)。 - 基础工具
wget、net-tools(含netstat)、perl-doc(查看参数手册)按需安装,命令见后文。 - 邮件投递链路(Postfix/Sendmail 等 MTA)按需对接;本文聚焦 SpamAssassin 本身的安装与验证,不依赖 MTA 也可完成全部判定测试。
三、版本选型说明
| 项目 | 实测版本 | 说明 |
|---|---|---|
| Apache SpamAssassin | 3.4.6(3.4.6-1ubuntu0.22.04.1) | Ubuntu 22.04 jammy-updates 官方源中的当前版本;上游最新 3.4.x 系列 |
| Perl | 5.34.0 | Ubuntu 22.04 自带,spamassassin --version 回显一并打印 |
| spamd 监听端口 | 783/TCP | 默认仅监听 127.0.0.1,供本机 spamc 调用 |
| 源码包 | Mail-SpamAssassin-3.4.6.tar.gz(6,572,574 字节) | archive.apache.org 官方发布,sha256 见第五章 |
💡 版本查询命令:
apt-cache policy spamassassin(软件源视角)与spamassassin --version(安装后)。上游新版本发布后,Ubuntu 会以jammy-updates源推送修订号(-1ubuntu0.x),保留 3.4.6 主版本。
四、安装方案 A:Ubuntu 官方软件源在线安装(推荐)
4.1 更新软件源并查询可装版本
apt-get update -qq
apt-cache policy spamassassin spamc
真实回显:
spamassassin:
Installed: 3.4.6-1ubuntu0.22.04.1
Candidate: 3.4.6-1ubuntu0.22.04.1
Version table:
*** 3.4.6-1ubuntu0.22.04.1 500
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
100 /var/lib/dpkg/status
3.4.6-1build3 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
spamc:
Installed: 3.4.6-1ubuntu0.22.04.1
Candidate: 3.4.6-1ubuntu0.22.04.1
Version table:
*** 3.4.6-1ubuntu0.22.04.1 500
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
100 /var/lib/dpkg/status
3.4.6-1build3 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
💡
Candidate指向jammy-updates中的3.4.6-1ubuntu0.22.04.1,直接安装即为当前受支持版本,无需添加第三方源。
4.2 安装 spamassassin 与 spamc
DEBIAN_FRONTEND=noninteractive apt-get install -y spamassassin spamc
真实回显(末段):
Setting up libhttp-cookies-perl (6.10-1) ...
Setting up libmail-authenticationresults-perl (2.20210915-1) ...
Setting up libhtml-tree-perl (5.07-2) ...
Setting up libnet-dns-sec-perl (1.19-1build2) ...
Setting up libhtml-format-perl (2.12-1) ...
Setting up libnet-dkim-perl (1.20200907-1) ...
Setting up liblwp-protocol-https-perl (6.10-1) ...
Setting up libwww-perl (6.61-1ubuntu0.1) ...
Setting up spamassassin (3.4.6-1ubuntu0.22.04.1) ...
Adding system user `debian-spamd' (UID 103) ...
Adding new group `debian-spamd' (GID 104) ...
Adding new user `debian-spamd' (UID 103) with group `debian-spamd' ...
Not creating home directory `/var/lib/spamassassin'.
/usr/sbin/policy-rc.d returned 101, not running 'start spamassassin.service'
Setting up sa-compile (3.4.6-1ubuntu0.22.04.1) ...
Running sa-compile (may take a long time)
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...
Processing triggers for ca-certificates (20260601~22.04.1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
💡 说明:
policy-rc.d returned 101表示软件包脚本按策略未立即拉起服务,第四章 4.5 节手动托管即可;软件包同时自动创建了系统用户debian-spamd(UID 103),供 spamd 降权运行。
4.3 核对版本与安装产物
spamassassin --version
spamc -V
spamd -V
which spamassassin spamc spamd sa-learn sa-update
真实回显:
SpamAssassin version 3.4.6
running on Perl version 5.34.0
SpamAssassin Client version 3.4.6
compiled with SSL support (OpenSSL 3.0.2 15 Mar 2022)
SpamAssassin Server version 3.4.6
running on Perl 5.34.0
with SSL support (IO::Socket::SSL 2.074)
with zlib support (Compress::Zlib 2.102)
/usr/bin/spamassassin
/usr/bin/spamc
/usr/sbin/spamd
/usr/bin/sa-learn
/usr/bin/sa-update
4.4 配置文件与目录结构
ls /etc/mail/spamassassin/
真实回显:
65_debian.cf
init.pre
local.cf
local.cf.orig
sa-compile.pre
sa-update-hooks.d
sa-update-keys
v310.pre
v312.pre
v320.pre
v330.pre
v340.pre
v341.pre
v342.pre
v343.pre
local.cf:站点主配置文件(管理员编辑入口),local.cf.orig是带注释的原始模板;init.pre、v310.pre~v343.pre:插件加载清单,如init.pre中loadplugin Mail::SpamAssassin::Plugin::URIDNSBL、loadplugin Mail::SpamAssassin::Plugin::SPF;65_debian.cf:Debian/Ubuntu 发行版补充配置。
4.5 systemd 托管 spamd
Ubuntu 软件包已自带服务单元 /lib/systemd/system/spamassassin.service:
[Unit]
Description=Perl-based spam filter using text analysis
After=network.target
[Service]
Type=forking
PIDFile=/run/spamd.pid
EnvironmentFile=-/etc/default/spamassassin
ExecStart=/usr/sbin/spamd -d --pidfile=/run/spamd.pid $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
StandardOutput=null
StandardError=null
Restart=always
[Install]
WantedBy=multi-user.target
启动参数由 /etc/default/spamassassin 提供(有效行):
OPTIONS="--create-prefs --max-children 5 --helper-home-dir"
PIDFILE="/var/run/spamd.pid"
CRON=0
设置开机自启并启动服务:
systemctl enable spamassassin
systemctl start spamassassin
systemctl status spamassassin --no-pager -l
真实回显:
Synchronizing state of spamassassin.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable spamassassin
Created symlink /etc/systemd/system/multi-user.target.wants/spamassassin.service → /lib/systemd/system/spamassassin.service.
● spamassassin.service - Perl-based spam filter using text analysis
Loaded: loaded (/lib/systemd/system/spamassassin.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2026-10-12 00:45:53 UTC; 3s ago
Process: 4809 ExecStart=/usr/sbin/spamd -d --pidfile=/run/spamd.pid $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 4811 (spamd)
Tasks: 3 (limit: 5753)
Memory: 97.1M
CPU: 1.273s
CGroup: /system.slice/spamassassin.service
├─4811 /usr/bin/perl "-T -w" /usr/sbin/spamd -d --pidfile=/run/spamd.pid --create-prefs --max-children 5 --helper-home-dir
├─4813 "spamd child"
└─4814 "spamd child"
确认监听端口:
netstat -lntp | grep 783
真实回显:
tcp 0 0 127.0.0.1:783 0.0.0.0:* LISTEN 5635/perl
⚠️ 默认只监听
127.0.0.1:783,仅允许本机spamc连接;如需跨机器调用,须调整OPTIONS增加-i 0.0.0.0 -A 允许网段(访问控制参数见《Apache SpamAssassin 常用 CLI 命令与工具详解》第六章)。
4.6 GTUBE 标准测试邮件判定验证
GTUBE(Generic Test for Unsolicited Bulk Email)是 SpamAssassin 官方标准测试串,命中即记 1000 分。创建测试邮件:
mkdir -p /var/mailtest
cat > /var/mailtest/gtube.eml <<'EOF'
From: Sender <sender@example.net>
To: Recipient <recipient@example.com>
Subject: Test spam mail (GTUBE)
Date: Thu, 09 Oct 2026 08:00:00 +0800
Message-ID: <GTUBE1@example.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
This is the GTUBE, the
Generic
Test for
Unsolicited
Bulk
Email
If your spam filter supports it, the GTUBE provides a test by which you
can verify that the filter is installed correctly and is detecting incoming
spam. You can send yourself a test mail containing the following string of
characters (in upper case and with no white spaces and line breaks):
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
You should send this test mail from an account outside of your network.
EOF
命令行过滤验证:
spamassassin -t /var/mailtest/gtube.eml
真实回显(头部与评分摘要):
Received: from localhost by mail01.example.com
with SpamAssassin (version 3.4.6);
Mon, 12 Oct 2026 00:44:24 +0000
From: Sender <sender@example.net>
To: Recipient <recipient@example.com>
Subject: Test spam mail (GTUBE)
Date: Thu, 09 Oct 2026 08:00:00 +0800
Message-Id: <GTUBE1@example.net>
X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mail01.example.com
X-Spam-Flag: YES
X-Spam-Level: **************************************************
X-Spam-Status: Yes, score=1000.0 required=5.0 tests=GTUBE,NO_RECEIVED,
NO_RELAYS autolearn=no autolearn_force=no version=3.4.6
经 spamd + spamc 链路验证:
spamc -c < /var/mailtest/gtube.eml
真实回显(退出码为 1,表示判定为垃圾邮件):
1000.0/5.0
再准备一封正常邮件确认不误判:
cat > /var/mailtest/ham.eml <<'EOF'
From: Alice Zhang <alice@example.com>
To: Bob Li <bob@example.com>
Subject: Weekly project meeting minutes
Date: Fri, 10 Oct 2026 10:20:00 +0800
Message-ID: <20261010102000@example.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Hi Bob,
Here are the minutes from this week project meeting:
1. The new feature branch was merged into main.
2. QA finished the regression pass, no blockers found.
3. Next milestone demo is scheduled for next Tuesday.
Please review and add anything I missed.
Best regards,
Alice
EOF
spamc -c < /var/mailtest/ham.eml
真实回显(退出码为 0,判定为正常邮件):
0.0/5.0
五、安装方案 B:官方源码 tarball 编译安装(离线/定制)
5.1 安装编译工具链
apt-get install -y wget build-essential
5.2 下载源码包并校验
cd /opt
wget -O Mail-SpamAssassin-3.4.6.tar.gz \
https://archive.apache.org/dist/spamassassin/source/Mail-SpamAssassin-3.4.6.tar.gz
sha256sum Mail-SpamAssassin-3.4.6.tar.gz
tar -xzf Mail-SpamAssassin-3.4.6.tar.gz
真实回显:
2026-10-12 00:57:10 (3.48 MB/s) - 'Mail-SpamAssassin-3.4.6.tar.gz' saved [6572574/6572574]
500c7e2a7cdf3aa4dd822d97aaff2ab22235a60cf17a68ab817861d215a4e568 Mail-SpamAssassin-3.4.6.tar.gz
💡 源码包 6,572,574 字节(约 6.3MB),sha256 为
500c7e2a7cdf3aa4dd822d97aaff2ab22235a60cf17a68ab817861d215a4e568,下载后务必核对。
5.3 生成 Makefile
cd /opt/Mail-SpamAssassin-3.4.6
perl Makefile.PL
真实回显(依赖检查段与结尾):
Warning: prerequisite Digest::SHA1 0 not found.
dependency check complete...
optional module missing: Digest::SHA1
optional module missing: GeoIP2::Database::Reader
optional module missing: Geo::IP
optional module missing: IP::Country::DB_File
optional module missing: Net::CIDR::Lite
optional module missing: Razor2
optional module missing: DBI
optional module missing: Encode::Detect::Detector
optional module missing: Net::Patricia
optional module missing: BSD::Resource
optional module missing: Archive::Zip
optional module missing: IO::String
optional binary missing or nonfunctional: curl
optional binary missing or nonfunctional: fetch
warning: some functionality may not be available,
please read the above report before continuing!
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Mail::SpamAssassin
Writing MYMETA.yml and MYMETA.json
Makefile written by ExtUtils::MakeMaker 7.62
⚠️ 可选依赖缺失只影响对应功能(地理 IP 库、Razor2 协同过滤等),核心判定不受影响。缺什么补什么,例如
apt-get install -y libdbi-perl libarchive-zip-perl libio-string-perl libnet-cidr-lite-perl libencode-detect-perl libnet-patricia-perl;Digest::SHA1在 Ubuntu 22.04 已无对应包(E: Unable to locate package libdigest-sha1-perl),为可选依赖可跳过。
5.4 编译与安装
cd /opt/Mail-SpamAssassin-3.4.6
make
make install
真实回显(make 末段):
cp spamd/spamd blib/script/spamd
"/usr/bin/perl" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/spamd
Manifying 9 pod documents
Manifying 28 pod documents
Manifying 25 pod documents
Manifying 26 pod documents
真实回显(make install 末段):
"/usr/bin/perl" build/preprocessor -Mvars -DVERSION="3.004006" -DPREFIX="/usr/local" -DDEF_RULES_DIR="/usr/local/share/spamassassin" -DLOCAL_RULES_DIR="/etc/mail/spamassassin" -DLOCAL_STATE_DIR="/var/lib/spamassassin" -DINSTALLSITELIB="/usr/local/share/perl/5.34.0" -DCONTACT_ADDRESS="the administrator of that system" -DRE2C_BIN="re2c" -m644 -Irules -O/usr/local/share/spamassassin user_prefs.template languages sa-update-pubkey.txt
chmod 755 /usr/local/share/spamassassin
安装位置核对:
which -a spamassassin spamd
/usr/local/bin/spamassassin --version
真实回显:
/usr/local/bin/spamassassin
/usr/bin/spamassassin
/bin/spamassassin
/usr/local/bin/spamd
/usr/sbin/spamd
/sbin/spamd
SpamAssassin version 3.4.6
running on Perl version 5.34.0
⚠️ 源码安装前缀为
/usr/local,/usr/local/bin在 PATH 中先于/usr/bin,同版本时会优先使用源码版;若机器上同时存在软件包版本,升级任一方时注意区分路径。
5.5 规则初始化与 systemd 托管
源码安装的规则状态目录 /var/lib/spamassassin 初始没有版本化规则文件,直接启动会失败(真实踩坑回显):
Oct 12 01:03:56 mail01.example.com systemd[1]: Starting SpamAssassin spamd daemon (source install)...
Oct 12 01:03:56 mail01.example.com spamd[10515]: config: no rules were found! Do you need to run 'sa-update'?
Oct 12 01:03:56 mail01.example.com systemd[1]: spamassassin-local.service: Failed with result 'exit-code'.
解决:先执行一次源码版的规则更新:
/usr/local/bin/sa-update
真实回显(退出码 0,静默成功):
SA_UPDATE_EXIT=0
编写 systemd 单元 /etc/systemd/system/spamassassin-local.service:
cat > /etc/systemd/system/spamassassin-local.service <<'EOF'
[Unit]
Description=SpamAssassin spamd daemon (source install)
After=network.target
[Service]
Type=forking
PIDFile=/run/spamd-local.pid
ExecStart=/usr/local/bin/spamd -d --pidfile=/run/spamd-local.pid --create-prefs --max-children 5 --helper-home-dir
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable spamassassin-local
systemctl start spamassassin-local
systemctl status spamassassin-local --no-pager
真实回显:
● spamassassin-local.service - SpamAssassin spamd daemon (source install)
Loaded: loaded (/etc/systemd/system/spamassassin-local.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2026-10-12 01:04:17 UTC; 5s ago
Process: 10548 ExecStart=/usr/local/bin/spamd -d --pidfile=/run/spamd-local.pid --create-prefs --max-children 5 --helper-home-dir (code=exited, status=0/SUCCESS)
Main PID: 10550 (spamd)
Tasks: 3 (limit: 5753)
Memory: 100.4M
5.6 判定验证
spamc -c < /var/mailtest/gtube.eml
真实回显(退出码 1):
1000.0/5.0
⚠️ 源码安装与软件包安装的 spamd 默认同样只监听
127.0.0.1:783,两者不能同时运行(端口冲突);若方案 A、B 并存,用systemctl stop spamassassin停掉其一再验证。
六、多方案对比与选择建议
| 维度 | 方案 A:软件源在线安装 | 方案 B:源码 tarball 编译安装 |
|---|---|---|
| 版本 | 3.4.6-1ubuntu0.22.04.1(随 jammy-updates 更新) | 3.4.6(上游任意版本可选) |
| 是否需联网 | 需访问 archive.ubuntu.com | 需访问 archive.apache.org(可离线预下载) |
| 安装方式 | apt 自动解决 Perl 依赖 | 手工编译,可选依赖按需补齐 |
| systemd 来源 | 软件包自带 spamassassin.service | 自行编写 unit(5.5 节) |
| 安装前缀 | /usr(/usr/bin、/usr/sbin) | /usr/local(/usr/local/bin) |
| 升级/降级 | apt upgrade 一条命令 | 重新下载新版源码编译 |
| 适用场景 | 常规服务器,首选 | 需要定制前缀、离线部署、跟随上游最新版 |
选择建议:可联网服务器一律选方案 A,安装与升级成本最低;无外网或需固定上游版本的场景选方案 B,提前在有网环境下载 tarball 与依赖包。
七、配置说明
7.1 站点配置文件 local.cf
两种方案的主配置文件均为 /etc/mail/spamassassin/local.cf(源码安装同样使用该路径,make install 时 LOCAL_RULES_DIR 指向此处)。最小可用配置:
cat > /etc/mail/spamassassin/local.cf <<'EOF'
# 统一判定阈值
required_score 5.0
# 判定为垃圾邮件时改写主题
rewrite_header Subject *****SPAM*****
# 可信内网网段(本机 MSA 转发来源)
trusted_networks 192.168.1.0/24
# 报告模板:垃圾邮件以 MIME 附件形式附加
report_safe 1
# 启用 Bayes 自适应学习
use_bayes 1
bayes_auto_learn 1
bayes_min_ham_num 200
bayes_min_spam_num 200
# 关闭未部署的协同过滤组件
use_razor2 0
use_pyzor 0
EOF
改完必须校验语法:
spamassassin --lint
真实回显(退出码 0,无输出即通过):
LINT_EXIT=0
修改配置后重启服务生效:
systemctl restart spamassassin
systemctl is-active spamassassin
真实回显:
active
7.2 规则更新 sa-update
sa-update
真实回显(首次执行会下载规则集,退出码 0):
EXIT=0
核对更新结果:
ls -la /var/lib/spamassassin/3.004006/
真实回显:
total 16
drwxr-xr-x 3 root root 4096 Oct 12 00:48 .
drwxr-xr-x 5 debian-spamd debian-spamd 4096 Oct 12 00:47 ..
drwxr-xr-x 2 root root 4096 Oct 12 00:48 updates_spamassassin_org
-rw-r--r-- 1 root root 3163 Oct 12 00:48 updates_spamassassin_org.cf
grep -E "^# UPDATE" /var/lib/spamassassin/3.004006/updates_spamassassin_org.cf
真实回显:
# UPDATE version 1938768
💡 规则集共 72 个文件落地在
/var/lib/spamassassin/3.004006/updates_spamassassin_org/。CRON=0时建议以 cron 每日执行sa-update并在更新成功后systemctl reload spamassassin。
7.3 全链路复核
spamassassin --lint
systemctl is-active spamassassin
spamc -c < /var/mailtest/gtube.eml
spamc -c < /var/mailtest/ham.eml
真实回显:
active
1000.0/5.0
0.0/5.0
八、注意事项
spamd默认只监听回环地址127.0.0.1:783,跨主机调用必须显式配置监听地址与允许网段,否则存在被外部任意调用的风险。required_score保持 5.0 起步;在线检测规则(DNSBL、SPF)依赖 DNS 解析,隔离网段部署时相关测试不可用,评分以本地规则为主。- Bayes 分类器需要
bayes_min_ham_num与bayes_min_spam_num(默认各 200 封)样本量达标后才会参与评分,前期X-Spam-Status中看不到 BAYES 系列规则属正常现象。 - 方案 A 安装时触发的
sa-compile依赖re2c;若首次启动日志出现Can't locate Mail/SpamAssassin/CompiledRegexps/body_0.pm,执行apt-get install -y re2c && sa-compile后重启服务即可(见第九章 Q3)。 - 修改任何
.cf/.pre文件后先spamassassin --lint再重启,避免语法错误导致 spamd 拒绝加载配置。
九、常见问题(FAQ)
Q1:spamassassin --lint 报 config: failed to parse line ... use_dcc 0 怎么办?
use_dcc 对应的 DCC 插件默认未在 .pre 文件中 loadplugin,未加载插件时写该指令会解析失败。真实回显:
Oct 12 00:47:25.798 [5573] warn: config: failed to parse line, skipping, in "/etc/spamassassin/local.cf": use_dcc 0
Oct 12 00:47:26.422 [5573] warn: lint: 1 issues detected, please rerun with debug enabled for more information
处理:删除 use_dcc 0 行(DCC 未部署时无需配置),重新 spamassassin --lint 直至退出码 0。
Q2:--lint 报 netset: cannot include 127.0.0.1/8 as it has already been included 怎么办?
回环网段默认已包含在信任网络内,在 trusted_networks/internal_networks 中重复声明 127.0.0.1/8 会触发告警。真实回显:
Oct 12 00:47:25.798 [5573] warn: netset: cannot include 127.0.0.1/8 as it has already been included
处理:从 trusted_networks 中去掉 127.0.0.1/8,只保留业务内网段(如 trusted_networks 192.168.1.0/24)。
Q3:启动后日志出现 Can't locate Mail/SpamAssassin/CompiledRegexps/body_0.pm 怎么办?
软件包安装时自动触发的 sa-compile 未完成,spamd 尝试加载编译规则失败(不影响基本判定)。真实回显:
Oct 12 00:45:52 mail01.example.com spamd[4811]: Can't locate Mail/SpamAssassin/CompiledRegexps/body_0.pm in @INC (you may need to install the Mail::SpamAssassin::CompiledRegexps::body_0 module) (@INC contains: /var/lib/spamassassin/compiled/5.034/3.004006 ...) at (eval 1897) line 1.
处理:安装 re2c 后手动补一次编译,重启服务后告警消失:
apt-get install -y re2c
sa-compile
systemctl restart spamassassin
sa-compile 实测耗时约 18 秒(real 0m18.014s),完成后生成 /var/lib/spamassassin/compiled/5.034/3.004006/Mail/SpamAssassin/CompiledRegexps/body_0.pm。
Q4:perldoc -T Mail::SpamAssassin::Conf 提示 You need to install the perl-doc package 怎么办?
最小化安装的 Ubuntu 22.04 未带 perl 文档包:
You need to install the perl-doc package to use this program.
处理:apt-get install -y perl-doc,之后即可离线查阅全部参数手册(perldoc -T Mail::SpamAssassin::Conf 开头回显为 NAME / Mail::SpamAssassin::Conf - SpamAssassin configuration file)。
Q5:spamc -c 邮件文件名 返回 0/0 但没有报错?
spamc 不接受文件名参数,只读标准输入;参数被忽略后以空输入触发"安全回退",输出 0/0 且退出码 0。正确写法是重定向:spamc -c < /var/mailtest/gtube.eml,得 1000.0/5.0、退出码 1。
十、卸载与清理
软件包方案卸载(同时清理配置文件):
DEBIAN_FRONTEND=noninteractive apt-get purge -y spamassassin spamc
真实回显(末段):
Removing spamc (3.4.6-1ubuntu0.22.04.1) ...
(Reading database ... 17400 files and directories currently installed.)
Purging configuration files for sa-compile (3.4.6-1ubuntu0.22.04.1) ...
Purging configuration files for spamassassin (3.4.6-1ubuntu0.22.04.1) ...
dpkg: warning: while removing spamassassin, directory '/etc/spamassassin' not empty so not removed
核对清理结果:
dpkg -l | grep -cE "^ii.*(spamassassin|spamc)"
ls /etc/mail/spamassassin
ls /var/lib/spamassassin
真实回显:
0
ls: cannot access '/etc/mail/spamassassin': No such file or directory
ls: cannot access '/var/lib/spamassassin': No such file or directory
源码方案卸载(purge 不会触碰 /usr/local,需手工清理,命令与实测核对一致):
systemctl disable --now spamassassin-local
rm -f /etc/systemd/system/spamassassin-local.service
systemctl daemon-reload
rm -f /usr/local/bin/spamassassin /usr/local/bin/spamc /usr/local/bin/spamd /usr/local/bin/sa-learn /usr/local/bin/sa-update /usr/local/bin/sa-compile /usr/local/bin/sa-awl /usr/local/bin/sa-check_spamd
rm -rf /usr/local/share/spamassassin
rm -rf /usr/local/share/perl/5.34.0/Mail /usr/local/share/perl/5.34.0/auto/Mail
rm -f /usr/local/share/man/man1/spam* /usr/local/share/man/man1/sa-*
可选残留清理:Bayes 训练库位于用户目录 ~/.spamassassin/bayes_*,按需删除;/opt/Mail-SpamAssassin-3.4.6 源码目录按需删除。
十一、参考链接
- Apache SpamAssassin 官方站点:https://spamassassin.apache.org/
- 官方文档全集:https://spamassassin.apache.org/doc.html
- 配置参数手册(同机离线版):
perldoc Mail::SpamAssassin::Conf - GTUBE 标准测试串说明:https://spamassassin.apache.org/gtube/
- 源码下载页:https://spamassassin.apache.org/downloads.cgi
- Ubuntu 软件包页:https://launchpad.net/ubuntu/jammy/+source/spamassassin