#!/bin/bash
# /usr/local/sbin/sa-train-spam.sh
# Läuft als Bayes-DB-Owner (oder DBPATH_OPT setzen)
# for USER in $(doveadm user '*'); do
#  doveadm mailbox create -u "$USER" "Spam lernen"
#  doveadm mailbox create -u "$USER" "Spam vergessen"
#  doveadm mailbox subscribe -u "$USER" "Spam lernen"
#  doveadm mailbox subscribe -u "$USER" "Spam vergessen"
# done

TRAIN_BOX="Spam lernen"
UNTRAIN_BOX="Spam vergessen"

LOG="/var/log/sa-train.log"

# Optional: globaler Bayes-Pfad (falls nicht als Owner läuft)
# DBPATH_OPT="--dbpath /var/lib/spamassassin/.spamassassin"
DBPATH_OPT=""

COUNT_SPAM=0
COUNT_HAM=0

echo "[$(date '+%F %T')] ===== BEGIN SPAM LEARNING=====" >> "$LOG"

# --- SPAM lernen (nur hdr+body) ---
for USER in $(doveadm user '*'); do
  echo "Suche Ordner im Postfach: $USER"
  doveadm mailbox list -u "$USER" | grep -qx "$TRAIN_BOX" || continue

  # UIDs extrahieren (UNDELETED; nur numerische Tokens, CR raus)
  UIDS=$(doveadm search -u "$USER" mailbox "$TRAIN_BOX" UNDELETED ALL \
        | tr -d '\r' | awk '{for(i=1;i<=NF;i++) if ($i ~ /^[0-9]+$/) print $i}')
  if [ -z "$UIDS" ]; then
    echo "[$(date '+%F %T')] $USER: 0 Mails" >> "$LOG"
    continue
  fi
  echo "[$(date '+%F %T')] $USER: $(printf "%s\n" "$UIDS" | wc -l) Mails" >> "$LOG"

  # Jede Mail: Header + Leerzeile + Body -> sa-learn
  for MSGUID in $UIDS; do
    {
      doveadm fetch -u "$USER" hdr  uid "$MSGUID" mailbox "$TRAIN_BOX" 2>/dev/null
      printf '\n'
      doveadm fetch -u "$USER" body uid "$MSGUID" mailbox "$TRAIN_BOX" 2>/dev/null
    } | sa-learn --spam $DBPATH_OPT >> "$LOG" 2>&1 && COUNT_SPAM=$((COUNT_SPAM+1))
  done

  # Optional: Ordner leeren
  #doveadm expunge -u "$USER" mailbox "$TRAIN_BOX" ALL >> "$LOG" 2>&1
  doveadm move -u "$USER" "Trash" mailbox "$TRAIN_BOX" ALL >> "$LOG" 2>&1
done

echo "[$(date '+%F %T')] ===== END SPAM (trained: $COUNT_SPAM) =====" >> "$LOG"
echo "[$(date '+%F %T')] ===== BEGIN HAM LEARNING=====" >> "$LOG"

# --- HAM lernen (nur hdr+body) ---
for USER in $(doveadm user '*'); do
  echo "Suche Ordner im Postfach: $USER"
  doveadm mailbox list -u "$USER" | grep -qx "$UNTRAIN_BOX" || continue

  UIDS=$(doveadm search -u "$USER" mailbox "$UNTRAIN_BOX" UNDELETED ALL \
        | tr -d '\r' | awk '{for(i=1;i<=NF;i++) if ($i ~ /^[0-9]+$/) print $i}')
  if [ -z "$UIDS" ]; then
    echo "[$(date '+%F %T')] $USER: 0 Mails" >> "$LOG"
    continue
  fi
  echo "[$(date '+%F %T')] $USER: $(printf "%s\n" "$UIDS" | wc -l) Mails" >> "$LOG"

  for MSGUID in $UIDS; do
    {
      doveadm fetch -u "$USER" hdr  uid "$MSGUID" mailbox "$UNTRAIN_BOX" 2>/dev/null
      printf '\n'
      doveadm fetch -u "$USER" body uid "$MSGUID" mailbox "$UNTRAIN_BOX" 2>/dev/null
    } | sa-learn --ham $DBPATH_OPT >> "$LOG" 2>&1 && COUNT_HAM=$((COUNT_HAM+1))
  done

  #doveadm expunge -u "$USER" mailbox "$UNTRAIN_BOX" ALL >> "$LOG" 2>&1
  doveadm move -u "$USER" INBOX mailbox "$UNTRAIN_BOX" ALL >> "$LOG" 2>&1
done

# Bayes sync (aufgeräumter Index)
sa-learn --sync $DBPATH_OPT >> "$LOG" 2>&1 || true

echo "[$(date '+%F %T')] ===== END HAM (trained: $COUNT_HAM) =====" >> "$LOG"
echo "[$(date '+%F %T')] Done

" >> "$LOG"
