BillionMail 如何通过报告 ham/spam 训练 Rspamd 垃圾邮件过滤器

发布时间:2026/9/15 12:01:41
BillionMail 如何通过报告 ham/spam 训练 Rspamd 垃圾邮件过滤器 BillionMail 如何通过报告 ham/spam 训练 Rspamd 垃圾邮件过滤器【免费下载链接】BillionMailBillionMail gives you open-source MailServer, NewsLetter, Email Marketing — fully self-hosted, dev-friendly, and free from monthly fees. Join the discord: https://discord.gg/asfXzBUhZr项目地址: https://gitcode.com/GitHub_Trending/bi/BillionMail部署 BillionMail 自建邮件系统后Rspamd 只靠内置规则判断垃圾邮件准确率有限。BillionMail 在仓库配置中预置了一条完整链路用户通过 IMAP 把邮件「移入 Junk 邮箱」或「移出 Junk 邮箱」这类日常操作会被 Dovecot 的 Sieve 脚本捕获并把邮件全文 POST 给 Rspamd 的/learnspam、/learnham接口持续训练其 Bayes 分类器。本文说明这条链路的构成、使用方法以及验证方式适用于默认的 Docker Compose 部署形态billionmail/dovecot:1.6与billionmail/rspamd:1.2镜像。训练链路一次报告是如何完成的来信先被自动归档进 Junk链路的第一环由 Postfix 与 Rspamd 完成配置在 main.cfsmtpd_milters inet:rspamd:11332 non_smtpd_milters inet:rspamd:11332所有经 Rspamd 过滤的邮件都会被打上判定头。milter_headers.conf 中extended_spam_headers true开启扩展头Rspamd 在判定为垃圾邮件的邮件中写入X-Spam: Yes头。Dovecot 侧的 90-sieve.conf 通过sieve_before挂了一个全局脚本先于用户个人 Sieve 脚本执行sieve_before /usr/lib/dovecot/sieve/spam-to-folder.sieve该脚本spam-to-folder.sieve逻辑只有一步require [fileinto]; if header :is X-Spam Yes { fileinto Junk; }即携带X-Spam: Yes头的邮件直接投递进Junk邮箱。移入 Junk 报告 spam90-sieve.conf 中 imapsieve 的 mailbox1 规则定义了触发点# From elsewhere to Spam folder imapsieve_mailbox1_name Junk imapsieve_mailbox1_causes COPY imapsieve_mailbox1_before file:/usr/lib/dovecot/sieve/report-spam.sieve触发条件是对Junk邮箱执行COPY操作执行前运行 report-spam.sieverequire [vnd.dovecot.pipe, copy, imapsieve, environment, variables]; if environment :matches imap.user * { set username ${1}; } pipe :copy sa-learn-spam.sh [ ${username} ];脚本通过imap.user环境变量取当前 IMAP 用户名再用pipe :copy把邮件全文交给sa-learn-spam.sh:copy表示原邮件保留不受影响。sa-learn-spam.sh 接收用户名作第一个参数正文从标准输入读入USERNAME$1 echo $USERNAME /tmp/learnspam /usr/bin/curl -X POST --data-binary - --unix-socket /var/lib/rspamd/rspamd.sock http://rspamd:11334/learnspam--data-binary -读取标准输入中的邮件全文经 Unix 套接字/var/lib/rspamd/rspamd.sockPOST 到 Rspamd controller 的/learnspam端点完成一次 spam 学习同时把触发用户名追加到 dovecot 容器内的/tmp/learnspam留痕。移出 Junk 报告 ham对应规则是 mailbox2# From Spam folder to elsewhere imapsieve_mailbox2_name * imapsieve_mailbox2_from Junk imapsieve_mailbox2_causes COPY imapsieve_mailbox2_before file:/usr/lib/dovecot/sieve/report-ham.sievereport-ham.sieve 比 spam 方向多一个保护判断if environment :matches imap.mailbox * { set mailbox ${1}; } if string ${mailbox} Trash { stop; } if environment :matches imap.user * { set username ${1}; } pipe :copy sa-learn-ham.sh [ ${username} ];从Junk拷贝到任意其他邮箱都会触发 ham 学习唯一例外是目标为Trash邮箱时直接stop不做任何学习——删除操作不算误报纠正。sa-learn-ham.sh 与 spam 脚本结构相同POST 到/learnham用户记录在/tmp/learnham。这些.sieve与.sh文件由 dovecot 镜像的 Dockerfile 安装到容器内/usr/lib/dovecot/sieve/与 90-sieve.conf 中sieve_pipe_bin_dir /usr/lib/dovecot/sieve一致。部署前提两个容器共享的 Rspamd 套接字dovecot 容器里的脚本要能访问 Rspamd靠的是 docker-compose.yml 中共享的挂载rspamd-billionmail服务镜像billionmail/rspamd:1.2主机名/网络别名rspamd把宿主机./rspamd-data挂到/var/lib/rspamdRspamd 的控制套接字rspamd.sock就创建在这里dovecot-billionmail服务镜像billionmail/dovecot:1.6同样挂载./rspamd-data:/var/lib/rspamd从而能直接通过该套接字发起学习请求rspamd.conf 中 controller worker 绑定*:11334与脚本里的http://rspamd:11334/...地址对应conf/dovecot/conf.d目录被挂载为 dovecot 容器的/etc/dovecot/conf.d上述 imapsieve 配置随默认部署生效。也就是说用默认 compose 启动整套服务后无需额外配置报告-训练链路自动可用。使用方式在任意支持 IMAP 的邮件客户端compose 中 dovecot 暴露143/993端口或 BillionMail webmail 中登录邮箱按下面的操作即可触发训练报告 spam把目标邮件移动到Junk邮箱。触发条件是对 Junk 的COPY脚本会学习该邮件并记录用户名。报告 ham把Junk里的邮件移动到其他邮箱例如 Inbox用于纠正 Rspamd 的误报。不要直接删除或移入Trash该路径被 report-ham.sieve 显式跳过。触发条件是配置中的COPY动作客户端移动邮件时若底层实现了拷贝同样会触发。结果验证两个层面可以确认学习请求确实发出1. 查看 Rspamd 管理界面。在 BillionMail Web 控制台的 设置 → 服务 → Rspamd 页面rspamd/index.vue页面通过 iframe 加载/api/rspamd/代理路径即 Rspamd controller 的管理界面可在此查看分类器动作与学习情况。2. 检查 dovecot 容器内的学习记录。两个训练脚本会把每次触发的用户名追加到/tmp/learnspam、/tmp/learnhamdovecot 容器内可以用 compose 服务名查看docker compose exec dovecot-billionmail cat /tmp/learnspam docker compose exec dovecot-billionmail cat /tmp/learnham文件中出现对应邮箱用户名说明这次移动操作已经向 Rspamd 发出了一次学习请求。边界与限制statistic.conf 中 Bayes 分类器配置为 redis 后端backend redisservices redis:6379且min_learns 200、min_tokens 11累计学习样本达到min_learns设定的 200 封之后分类器才会真正参与评分。少量手动报告不会立刻产生BAYES_SPAM/BAYES_HAM动作这是预期行为需要持续积累。同文件中autolearn配置块处于注释状态Rspamd 不自动学习训练只来自上述移入/移出 Junk 的报告动作。报告 ham 的触发路径排除目标为Trash的拷贝X-Spam头的匹配是精确值Yes由 spam-to-folder.sieve 判定入 Junk。持久化方面Rspamd 数据目录落在宿主机./rspamd-dataBayes 统计所在的 redis 数据落在./redis-datacompose 中 redis 服务挂载学习结果随目录保留不随容器重建丢失。【免费下载链接】BillionMailBillionMail gives you open-source MailServer, NewsLetter, Email Marketing — fully self-hosted, dev-friendly, and free from monthly fees. Join the discord: https://discord.gg/asfXzBUhZr项目地址: https://gitcode.com/GitHub_Trending/bi/BillionMail创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询