#!/usr/bin/bash # Useful directories. readonly MAILDIR="${HOME}/Maildir" readonly SPAMDIR="${MAILDIR}/Spam" #readonly HAMDIR="${MAILDIR}/Ham" # The spam/ham found are saved for future reference. readonly SAVE_SPAM_DIR="${HOME}/spam-assassin/spam/" readonly SAVE_HAM_DIR="${HOME}/spam-assassin/ham/" # The minimum age (in days) of spam to be processed. readonly SPAM_MIN_AGE="5" # "--force" flag. FORCE="false" # The temporary file where a list of spam filenames will be stored. SPAM_LIST=$(mktemp) readonly SPAM_LIST HAM_LIST=$(mktemp) readonly HAM_LIST trap 'rm -f "${SPAM_LIST}" "${HAM_LIST}"' EXIT readonly LOGFILE="${HOME}/spam-ham-learn.log" log() { if [ -t 1 ]; then # Only print things if running from a terminal. printf "I: %s\n" "$*" fi } learn_spam() { local findargs="" log "Entering learn_spam" if [ "${FORCE}" = "false" ]; then log "--force not detected; using -ctime on find" findargs=" -ctime +${SPAM_MIN_AGE} " else log "--force detected; not using -ctime on find" fi # Collecting the spam. log "Collecting spam" find "${SPAMDIR}/cur" "${SPAMDIR}/new" -type f ${findargs} | while read -r msg; do log "Found ${msg}, adding it to the spam list (${SPAM_LIST})" printf "%s\n" "${msg}" >> "${SPAM_LIST}" done # Invoking sa-learn. log "Invoking sa-learn" /usr/bin/sa-learn --spam -f "${SPAM_LIST}" # Saving the spam into a different location. log "Saving the spam into a different location" while read -r msg; do log "Moving ${msg} into ${SAVE_SPAM_DIR}" mv "${msg}" "${SAVE_SPAM_DIR}" done < "${SPAM_LIST}" } learn_ham() { local nspam log "Entering learn_ham" nspam=$(wc -l "${SPAM_LIST}" | cut -d' ' -f1) log "Number of spam handled: ${nspam}" # We only learn ham if any spam has been processed. if [ "${nspam}" -le 0 ]; then log "The number of spam is 0, doing nothing" return fi # Collecting the ham. log "Collecting the ham" find "${MAILDIR}/cur" -type f -printf "%T@ %p\n" \ | sort -n \ | cut -d ' ' -f2 \ | tail -n"${nspam}" \ | while read -r msg; do log "Found ham ${msg}, adding it to the ham list (${HAM_LIST})" printf "%s\n" "${msg}" >> "${HAM_LIST}" done # Invoking sa-learn. log "Invoking sa-learn" /usr/bin/sa-learn --ham -f "${HAM_LIST}" # Saving the ham. log "Saving the ham into a different location" while read -r msg; do log "Copying ${msg} to ${SAVE_HAM_DIR}" cp "${msg}" "${SAVE_HAM_DIR}" done < "${HAM_LIST}" } while [ -n "${1}" ]; do case "${1}" in -f|--force) FORCE="true" ;; esac shift done learn_spam learn_ham