summaryrefslogtreecommitdiff
path: root/scripts/qmail-queue-scan.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/qmail-queue-scan.sh')
-rw-r--r--scripts/qmail-queue-scan.sh144
1 files changed, 144 insertions, 0 deletions
diff --git a/scripts/qmail-queue-scan.sh b/scripts/qmail-queue-scan.sh
new file mode 100644
index 0000000..3ab29fb
--- /dev/null
+++ b/scripts/qmail-queue-scan.sh
@@ -0,0 +1,144 @@
+#
+# Notes:
+# chmod 1755 qmail-queue.scan; chown qmailq:qmail qmail-queue.scan
+# SQMAIL/tmp has to exist prior with owner qmaill:qmail
+#
+# Usage:
+# Generate: control/spamdomains
+# Input: recipient-domain:spam-threshold
+# Sample: example.com:8
+# allspams:0
+# #testdomain:11 # entries with leading '#' are disregarded
+#
+# Caution:
+# This script is a sample. Depending on your anti-virus and/or anti-spam
+# software, some heavy tweaking is required.
+#
+#
+# Dependencies:
+# Korn shell
+# DJB's MESS822 package (or not)
+#
+# Environment variables used:
+#
+# $MAILFROM -- set by qmail-smtpd
+# $RCPTTO -- set by qmail-smtpd
+#
+# Virus scanner:
+# The AV scanner returns '0' if ok -- or '1'/'2' if virus -- anything else = error
+#
+# Spam scanner:
+# SpamAssassin > 3.0 (spamc/spamd)
+#
+# Output:
+# RC=0; if ok
+# RC=32; if virus
+# RC=33; if spam
+# RC=81; if error
+#
+# Performance:
+# Put SQMAIL/tmp on a RAMDISK
+#
+# License:
+# Public Domain
+#
+# Author:
+# Dr. Erwin Hoffmann - FEHCom
+#
+# Version:
+# 0.9.7
+#
+#------------------------------------------------------------------------------------------------
+SQMAIL=HOME
+#
+alias -x SCANNER='/usr/local/bin/clamdscan'
+#alias -x SCANNER='/etc/iscan/vscan'
+alias -x SPAMMER='/usr/bin/spamc'
+alias -x 822FIELD='/usr/local/bin/822field'
+# alias -x 822FIELD='/usr/bin/grep'
+#
+VERBOSE=0
+#
+SCANNERARGS="--no-summary"
+SPAMMERARGS=""
+#
+## No code change necessary from here
+#
+typeset SPAM
+integer SPAMC=0
+integer SPAMTHRESHOLD=-1
+integer SPAMTH
+typeset SPAMDOMAINS
+
+ID="${RANDOM}$$"
+MESSAGE="${SQMAIL}/tmp/msg.${ID}"
+export DTLINE="spam-queue"
+#
+[[ ! -d ${SQMAIL}/tmp ]] && exit 53
+cat > ${MESSAGE} || exit 53
+#
+## Virus scanning
+#
+if [[ "x${QHPSI}" = "x" ]]; then
+ VIRUS=$(SCANNER ${SCANNERARGS} ${MESSAGE})
+ VRC=$?
+ [[ ${VERBOSE} -gt 0 ]] && print -u2 "AV Scanner info [`SCANNER` -V]: ${VIRUS}"
+
+# VIRUS=$(echo "${VIRUS}" | grep -e "\*\*") ## for TrendMicro only
+ case ${VRC} in
+ (0) RC=0;;
+ (1|2) exec 1>&2; echo "Infected email not delivered (${VIRUS})"; RC=32;;
+ (*) exec 1>&2; echo "`SCANNER -V` internal error (${VRC})"; RC=81;;
+ esac
+fi
+#
+## Check Spamlevel for each domain
+#
+if [[ -f ${SQMAIL}/control/spamdomains && ${RC} -eq 0 ]]; then
+ SPAMDOMAINS=$(grep -v "^#" ${SQMAIL}/control/spamdomains)
+ for LINE in ${SPAMDOMAINS}
+ do
+ DOMAIN=${LINE%:*}
+ SPAMTH=${LINE#*:*}
+ [[ $(echo "${RCPTTO}" | grep -ci "${DOMAIN}") -gt 0 ]] && SPAMTHRESHOLD=${SPAMTH}
+ done
+
+ [[ ${VERBOSE} -gt 0 ]] && print -u2 "Rcptdomain: ${RCPTTO#*@} -- Threshold: ${SPAMTHRESHOLD}"
+
+ if [[ ${SPAMTHRESHOLD} -ge 0 ]]; then
+#
+## Spam recognition -- the following codes is only useful for SpamAssassins spamc version 3.x
+#
+ SPAM=$(SPAMMER ${SPAMMERARGS} < ${MESSAGE} > ${MESSAGE}_$$ && mv ${MESSAGE}_$$ ${MESSAGE} || exit 53)
+ SPAM=$(822FIELD "X-Spam-Level" < ${MESSAGE} | head -n 1)
+ SPAM=${SPAM# }
+
+ [[ ${VERBOSE} -gt 0 ]] && print -u2 echo "[$(echo `SPAMMER -V` | tr -d '\n')]: ${SPAMTHRESHOLD}"
+
+ if [[ "x${SPAM}" != "x" ]]; then
+ if [[ $(echo "${SPAM}" | grep -c "X-Spam-Level") -gt 0 ]]; then
+ SPAMC=$(echo "${SPAM##X-Spam-Level:}" tr -d ' ' | tr -d '\n' | wc -c)
+ fi
+ else
+ SPAMC=$(echo "${SPAM}" | awk -F"/" '{print $1}' | awk -F"." '{print $1}')
+ fi
+ [[ ${VERBOSE} -gt 0 ]] && print -u2 "Spam: ${SPAM} - Spamc: ${SPAMC}"
+#
+## Spam rejection
+#
+ if [[ ${SPAMC} -gt 0 && ${SPAMC} -gt ${SPAMTHRESHOLD} ]]; then
+#
+# If you enable one of the next lines, the sender receives a rejection, while the email is let thru
+#
+# ${SQMAIL}/bin/forward ${MAILFROM} "${RCPTTO}" < ${MESSAGE}
+# ${SQMAIL}/bin/forward ${MAILFROM} "${DELIVERTO}" < ${MESSAGE}
+ export SPAMSCORE="${SPAMC}"
+ RC=33
+ fi
+ fi
+fi
+
+[[ ${RC} -eq 0 ]] && ${SQMAIL}/bin/qmail-queue < ${MESSAGE}
+
+rm ${MESSAGE}
+exit ${RC}