152 lines
3.3 KiB
Markdown
152 lines
3.3 KiB
Markdown
# rspamd-mail-trainer
|
|
|
|
Small defensive admin tool for Linux mail servers. It finds messages in Maildir
|
|
or mbox mailboxes by sender, recipient, subject, date or selected text and then
|
|
passes the matching messages to `rspamc learn_spam` or `rspamc learn_ham`.
|
|
|
|
Designed for setups such as Rocky Linux + Postfix/Dovecot + Rspamd.
|
|
|
|
## Features
|
|
|
|
- Searches Maildir and mbox mailboxes.
|
|
- Tries to discover common mailbox roots automatically, including `doveconf -n`.
|
|
- Filters by `From`, `To`, `Subject`, header/body text and date range.
|
|
- Trains spam and ham via `rspamc`.
|
|
- Asks for confirmation before training.
|
|
- Refuses broad runs without any filter.
|
|
- Deduplicates matches by SHA-256.
|
|
- Extracts single mbox messages to temporary `.eml` files before training.
|
|
- Provides `search`, `check`, `train spam` and `train ham` subcommands.
|
|
|
|
## Install
|
|
|
|
From the repository root:
|
|
|
|
```bash
|
|
sudo python3 -m pip install .
|
|
```
|
|
|
|
Then:
|
|
|
|
```bash
|
|
rspamd-mail-trainer --help
|
|
```
|
|
|
|
For a local editable install during development:
|
|
|
|
```bash
|
|
python3 -m pip install -e .
|
|
```
|
|
|
|
## Quick start
|
|
|
|
Discover mailbox roots for the Unix user `johannes`:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer roots --user johannes
|
|
```
|
|
|
|
Search suspicious messages from a sender:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer search --user johannes --from no-reply@example.test
|
|
```
|
|
|
|
Train matches as spam:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer train spam --user johannes --from no-reply@example.test
|
|
```
|
|
|
|
Train matches as ham:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer train ham --user johannes --subject "Invoice"
|
|
```
|
|
|
|
Run Rspamd analysis without training:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer check --user johannes --from no-reply@example.test
|
|
```
|
|
|
|
## Useful options
|
|
|
|
Treat filter arguments as literal text instead of regex:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer search --user johannes --from no-reply@example.test --literal
|
|
```
|
|
|
|
Search subject:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer search --user johannes --subject "Monthly report"
|
|
```
|
|
|
|
Search selected headers and text body:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer search --user johannes --any "unsubscribe"
|
|
```
|
|
|
|
Restrict by date:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer search --user johannes --from no-reply@example.test --after 2026-06-01 --before 2026-06-13
|
|
```
|
|
|
|
Dry-run training:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer train spam --user johannes --from no-reply@example.test --dry-run
|
|
```
|
|
|
|
Skip confirmation for a known-safe batch:
|
|
|
|
```bash
|
|
sudo rspamd-mail-trainer train spam --user johannes --from no-reply@example.test --yes
|
|
```
|
|
|
|
## Push to Gitea
|
|
|
|
Create a new empty repository in Gitea, then run from this directory:
|
|
|
|
```bash
|
|
git init
|
|
git add .
|
|
git commit -m "Initial import of rspamd mail trainer"
|
|
git branch -M main
|
|
git remote add origin ssh://git@gitea.example.local/johannes/rspamd-mail-trainer.git
|
|
git push -u origin main
|
|
```
|
|
|
|
Replace the remote URL with your Gitea repository URL.
|
|
|
|
A Gitea Actions workflow is included at `.gitea/workflows/ci.yml`.
|
|
|
|
## Development
|
|
|
|
Run tests without external dependencies:
|
|
|
|
```bash
|
|
python3 -m unittest discover -s tests
|
|
```
|
|
|
|
Build a Python package:
|
|
|
|
```bash
|
|
python3 -m pip install build
|
|
python3 -m build
|
|
```
|
|
|
|
## Safety notes
|
|
|
|
This tool reads local mailboxes and can train your Rspamd classifier. Start with
|
|
`search`, `check` or `--dry-run`. Avoid broad patterns unless you inspected the
|
|
matches. Train good messages as ham from time to time, not only spam.
|
|
|
|
## License
|
|
|
|
MIT
|