|
Löschen von Mails aus der Queue mit bestimmten Logins
#!/bin/bash
#########################################################################
# #
# searchMsgId4SASL.sh #
# @author tobi <jahlives@gmx.ch> #
# @License GPL3 #
# @copyright Can be changed as you want. No need for specify the #
# original author #
# It's allowed for commercial usage but please ask via email prior #
# to use it in any commercial matter #
# #
# This script is as it is. No guarantee for anything. Use at own risk #
# #
#########################################################################
DELETE=0
SEARCH=''
STRING=''
while [ $# -gt 0 ] ; do
case "$1" in
'-lu')
shift
SEARCH="$1"
shift
;;
'-d')
DELETE=1
shift
;;
'-s')
shift
STRING="$1"
shift
;;
'-h')
echo '# searchMsgId4SASL.sh helps admins to quickly remove msg from mailqueue for a certain user SASL login'
echo "# $0 -lu me@mydomain.tld [-d]"
echo '# -lu email address of the user to clean from queue (username used in SASL login)'
echo '# -d enforces delete mode expects -lu to be set. If not set matching msg ids will be printed only. Be VERY careful using this switch. !!!"Quadrupel" check what you set in -lu!!!'
echo '# WARNING: if you specify -lu and -d 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'
echo "# -s defines a custom search string. Use it if you're looking for a special content string of a mail"
echo '# -s and -lu CANNOT be set at the same time. Be careful with -s as it searches the entire mail (headers and body)!!!'
echo '# -h show this help'
exit 0
;;
*)
echo "Unknown parameter $1. Type -h for short help" && exit 1
;;
esac
done
[[ "x$SEARCH" = 'x' && "x$STRING" = 'x' ]] && echo '###' && $0 -h && echo '###' && exit 1
[[ "x$SEARCH" != 'x' && "x$STRING" != 'x' ]] && $0 -h && echo '###' && exit 1
for i in $(mailq|tail -n +2|awk 'BEGIN { RS = "" }/'""'/{ if($1 != "'--'") print $1 }' | tr -d '*!') ; do
if [ "x$SEARCH" != 'x' ] ; then
RET=$(find /var/spool/postfix -type f -name "$i" -exec grep "sasl_username=$SEARCH" {} \;)
elif [ "x$STRING" != 'x' ] ; then
RET=$(find /var/spool/postfix -type f -name "$i" -exec grep "$STRING" {} \;)
fi
[[ "x$RET" != 'x' && $DELETE -eq 0 ]] && echo $i
[[ "x$RET" != 'x' && $DELETE -eq 1 ]] && postsuper -d $i
done
|
|
Aktuellste Version. Als Action kann nun auch –hold angegeben werden, um Mails in die HOLD-Queue zu schieben. Zudem kann man mit dem Paramtert -cr die Recipients einer Mail ermitteln und sich die Msg-IDs ausgeben lassen, welche mehr Recipients haben als mit -cr erlaubt sind
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#########################################################################
# #
# searchMsgId4SASL.sh #
# @author tobi <jahlives@gmx.ch> #
# @License GPL3 #
# @copyright Can be changed as you want. No need for specify the #
# original author #
# It's allowed for commercial usage but please ask via email prior #
# to use it in any commercial matter #
# #
# This script is as it is. No guarantee for anything. Use at own risk #
# #
#########################################################################
DELETE=0
SEARCH=''
STRING=''
HOLD=0
PRINT=0
CR=0
while [ $# -gt 0 ] ; do
case "$1" in
'-lu')
shift
SEARCH="$1"
shift
;;
'-d')
DELETE=1
shift
;;
'-s')
shift
STRING="$1"
shift
;;
'--hold')
HOLD=1
shift
;;
'-cr')
shift
CR=$1
shift
;;
'-h')
echo ''
echo '# searchMsgId4SASL.sh helps admins to quickly remove msg from mailqueue for a certain user SASL login'
echo "# $0 -lu <string>|-s <string>|-cr <number> [-d|--hold|-?]"
echo ''
echo '# -lu email address of the user to clean from queue (username used in SASL login)'
echo '# -d enforces delete mode expects -lu to be set. If not set matching msg ids will be printed only. Be VERY careful using this switch. !!!"Quadrupel" check what you set in -lu!!!'
echo '# WARNING: if you specify -lu and -d 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'
echo "# -s defines a custom search string. Use it if you're looking for a special content string of a mail"
echo '# -s and -lu CANNOT be set at the same time. Be careful with -s as it searches the entire mail (headers and body)!!!'
echo '# -? with -s specified the sasl_loginnames can be printed'
echo '# --hold put matching mail in HOLD queue'
echo '# -cr maximum number of allowed recipients per mail'
echo '# -h show this help'
exit 0
;;
'-?')
shift
PRINT=1
shift
;;
'-c')
echo '#########################################################################'
echo '# #'
echo '# searchMsgId4SASL.sh #'
echo '# @author tobi <jahlives@gmx.ch> #'
echo '# @License GPL3 #'
echo '# @copyright Can be changed as you want. No need for specify the #'
echo '# original author #'
echo '# It is allowed for commercial usage but please ask via email prior #'
echo '# to use it in any commercial matter #'
echo '# #'
echo '# This script is as it is. No guarantee for anything. Use at own risk #'
echo '# #'
echo '#########################################################################'
exit 0
;;
*)
echo "Unknown parameter $1. Type -h for short help" && exit 1
;;
esac
done
[[ "x$SEARCH" = 'x' && "x$STRING" = 'x' && CR = 0 ]] && echo '###' && $0 -h && echo '###' && exit 1
[[ "x$SEARCH" != 'x' && "x$STRING" != 'x' && CR = 0 ]] && $0 -h && echo '###' && exit 1
[[ $HOLD -eq 1 && $DELETE -eq 1 ]] && echo '###' && $0 -h && echo '###' && exit 1
if [[ $CR -gt 0 ]] ; then
for i in $(find /var/spool/postfix/deferred -type f) ; do
COUNT=$(postcat $i 2>/dev/null | grep -c 'original_recipient')
ii="${i##*/}"
[ "x$ii" = 'x' ] && continue
if [ $COUNT -gt $CR ] ; then
[ $DELETE -eq 1 ] && postsuper -d $ii && continue
echo "$i --> $COUNT" && continue
else
continue
fi
done
exit 0
fi
for i in $(mailq|tail -n +2|awk 'BEGIN { RS = "" }/'""'/{ if($1 != "'--'") print $1 }' | tr -d '*!') ; do
if [ "x$SEARCH" != 'x' ] ; then
RET=$(find /var/spool/postfix -type f -name "$i" -exec grep "sasl_username=$SEARCH" {} \;)
elif [ "x$STRING" != 'x' ] ; then
if [ $PRINT -eq 0 ] ; then
RET=$(find /var/spool/postfix -type f -name "$i" -exec grep "$STRING" {} \;)
else
RET=$(find /var/spool/postfix -type f -name "$i" -exec grep "$STRING" {} \;)
if [ "x$RET" != 'x' ] ; then
RET=$(find /var/spool/postfix -type f -name "$i" -exec grep sasl_username '{}' \; | awk '{print $3}')
[ "x$RET" != 'x' ] && RET="$(postcat $RET | grep sasl_username | awk -F'=' '{print $2}')"
fi
fi
fi
[[ "x$RET" != 'x' && $DELETE -eq 0 && $HOLD -eq 0 && $PRINT -eq 0 ]] && echo $i
[[ "x$RET" != 'x' && $DELETE -eq 1 ]] && postsuper -d $i
[[ "x$RET" != 'x' && $HOLD -eq 1 ]] && postsuper -h $i
[[ "x$RET" != 'x' && $PRINT -eq 1 ]] && echo "$RET"
done
Nowadays with recent postfix versions such stunts are not required anymore to achive the same. Postfix postqueue command knows -j parameter to output the queue as json. That means that sender and recipient are now on the same line. So one can use two concatenated grep’s to determine the relevant json lines and extract the queue-id’s from those lines. Thanks @Wietse 🙂