RSS-Feed anzeigen

jahlives

Mailqueue von Postfix "bearbeiten"

Bewerten
Oft hat den admin eines Mailservers das Problem, dass die mailqueue aufgeräumt werden muss. Dabei ist es recht mühsam das mailq Kommando jedes Mal zu tippen und dann den Output durchzugehen. Um das etwas zu vereinfachen habe ich folgendes Bash-Script geschrieben.
Es arbeitet mit default Kommandos, die eigentlich bei jedem Linux dabei sein sollten. Diskstation Users sollten gucken ob folgende Kommandos vorhanden sind
  • mailq (ist sicher vorhanden, aber ggf nicht in PATH)
  • postsuper (ist sicher auch vorhanden aber ggf nicht in PATH)
  • awk
  • tr
  • uniq
  • shift
es werden noch andere verwendet z.B. grep oder tail, aber die sind sicher auch auf einer DS vorhanden. zusätzlich wird als Shell bash erwartet, afaik kennt nur die bash den shift
Das Script hat eine kleine Hilfe mit dem -h Parameter.
Mit dem Script kann man jedoch auch viel kapputt machen, gerade wenn man den -d Parameter verwendet. Um das grundsätzliche Funzen des Scripts zu testen, kann man es mal ohne jeglichen Parameter aufrufen. Das sollte eine Rangliste der User ergeben welche Mails in der queue haben.

Wie immer: die Benutzung geht auf eigenes Risiko :-)
Code:
#!/bin/bash

DELETE=0
LIMIT=10
# read args from cli
while [ $# -gt 0 ] ; do
 case "$1" in
  '-lu')
   shift
   R_ADDRESS="$1"
   shift
  ;;
  '-su')
   shift
   S_ADDRESS="$1"
   shift
  ;;
  '-s')
   shift
   SEARCH="$1"
   shift
  ;;
  '-d')
   DELETE=1
   shift
  ;;
  '-l')
   shift
   LIMIT=$1
   shift
  ;;
  '-h')
   echo 'cleanUsersQueue.sh helps admins to quickly remove msg from mailqueue for certain users'
   echo './cleanUsersQueue.sh -u me@mydomain.tld -s "string to search"'
   echo '-lu  email address of the user to clean from queue (our local user)'
   echo '-su  email address of the sender (remote user)'
   echo '-d   enforces delete mode expects -s to be set. Be VERY careful using this switch. !!!"Quadrupel" check what you set in -s!!!'
   echo '-s   search string, means this string must be in the lines returned by mailq-command. default is "over quota"'
   echo '-l   defines how many mails must be in users queue before it get matched (default is 10)'
   echo '-h   show this help'
   echo 'be careful:  if you specify -su or -lu then the script goes to delete mode. There wont be any "are you sure"-windows style question but all mails from user that match $SEARCH will be deleted'
   exit 0
  ;;
  *)
   echo "Unknown parameter $1. Type -h for short help" && exit 1
  ;;
 esac
done
 
# tmp file for stat
TMPFILE=$(mktemp)
#echo $SEARCH && exit
# define $SEARCH with default value if not provided as cli arg
[ "x$SEARCH" = 'x' ] && SEARCH='over quota'
 
# if no $ADDRESS is specified then check mailqueue and print out a list with useraccounts which have 10 or more mails in queue
# also print a grant total of mailqueue 
[[ "x$R_ADDRESS" = 'x' && "x$S_ADDRESS" = 'x' && $DELETE -eq 0 ]] && echo '### Total: '$(mailq | tail -n 1 | tr -d '-' | awk '{print $4" mails in queue ("$1" kByte)"}') && mailq | tail -n +2| awk 'BEGIN {RS = ""} /'"$SEARCH"'/ {print $NF}' | grep -v maildrop: | sort -n | uniq -c | sort -nr | awk '{if($1>'"$LIMIT"') print $1" "$2}' | more && echo '###' && exit 0
 
# if $R_ADDRESS or $S_ADDRESS has been set we fetch the mailqueue of this user and delete everything pending in the mailqueue
# change $SEARCH to find and delete the mails you need
# write postsuper output to $TMPFILE so we have the logdata in there. Will be used to print how many mails have been deleted
[[ "x$R_ADDRESS" != 'x' && $DELETE -eq 0 ]] && mailq|tail -n +2|awk 'BEGIN { RS = "" }/'"$SEARCH"'/{ if($NF=="'$R_ADDRESS'") print $1 }' | tr -d '*!' | postsuper -d - > $TMPFILE 2>&1
[[ "x$S_ADDRESS" != 'x' && $DELETE -eq 0 ]] && mailq|tail -n +2|awk 'BEGIN { RS = "" }/'"$SEARCH"'/{ if($7=="'$S_ADDRESS'") print $1 }' | tr -d '*!' | postsuper -d - > $TMPFILE 2>&1 
 
# special handling if -d (delete) switch has been set
# ask user if really sure about it
# with delete switch you MUST be sure what you set in -s
# ex -d set and -s ' ' would lead to the deletion of ALL mails of ALL users in queue
if [ $DELETE -eq 1 ] ; then
 echo 'delete switch set. Are you SURE about this?'
 echo 'double check that -s "'$SEARCH'" is the value you need'
 echo '!!!!very bad idea would be to set -d and set -s to " " which would delete the ENTIRE mailqueue!!!!'
 echo -n 'You wont be asked again!! (type YES if so): '
 while read line ; do
  [ $(echo $line | grep -i 'yes') ] && break
  echo 'Exit program' && exit
 done
fi
[ $DELETE -eq 1 ] && mailq|tail -n +2|awk 'BEGIN { RS = "" }/'"$SEARCH"'/{print $1}' | tr -d '*!' | postsuper -d - > $TMPFILE 2>&1
# print last line from $TMPFILE which contains the grant total of messages deleted
tail -n 1 $TMPFILE
 
# remove $TMPFILE as it's no longer needed
rm $TMPFILE

Kommentare