[Postfixbuch-users] HOWTO: Autoresponder optimal aufsetzen?

Jan Behrend jbehrend at mpifr-bonn.mpg.de
Mi Feb 2 11:01:24 CET 2011


On 02/01/11 19:02, Michael Grimm wrote:
> Hi --
> 
> Ich möchte so etwas Ähnliches wie echo(bei)tu(minus)berlin(punkt)de einrichten,
> d.h. einen Autoresponder. Mir fehlt aber schlichtweg die Erfahrung, überblicken
> zu können, an welcher Stelle ich diesen in meinem momentanen Setup am besten
> einzufügen soll.

Moin,

hier mein Autoresponder-Skript, welches ich eingesetzt habe bevor
Dovecot und Sieve mit eigener Autoreply-Funktion zur Anwendung kam.

Das Skipt benutzt LDAP-Lookups um einen Autoresponder-Transport zu
schalten.  Es versucht die Tipps aus dem Postfixbuch umzusetzen:
Sender-Header, keine Antwort auf Bulk, MAILER-DAEMON, etc.

Vielleicht sind ja Teile davon für Dich auch zu benutzen.
Anbei auch die LDAP-Map Konfiguration.  Bei Fragen helfe ich gerne weiter.

Gruß von Jan

-- 
MAX-PLANCK-INSTITUT fuer Radioastronomie
Jan Behrend - Rechenzentrum
----------------------------------------
Auf dem Huegel 69, D-53121 Bonn
Tel: +49 (228) 525 359, Fax: +49 (228) 525 229
jbehrend at mpifr-bonn.mpg.de http://www.mpifr-bonn.mpg.de
-------------- nächster Teil --------------
#!/bin/bash

### by jan: jbehrend at mpifr-bonn.mpg.de, Dec 2009

DEFAULT_RESPONDER_TEXT=/usr/local/etc/autorespond.txt
DB=/var/lib/autorespond/autorespond.db

logger="$(which logger) -t autorespond -i -p mail.error"
logger_info="$(which logger) -t autorespond -i -p mail.notice"
egrep=$(which egrep)
bc=$(which bc)
sed=$(which sed)
awk=$(which awk)
mv=$(which mv)
base64=$(which base64)
chmod=$(which chmod)
mail=$(which mail)
sudo=$(which sudo)
mktemp=$(which mktemp)
rm=$(which rm)
maildrop="$(which maildrop) -d"
postdrop=$(which postdrop)
ldapsearch="$(which ldapsearch) -x -ZZ -LLL -b ou=people,dc=mydomain,dc=de"

TARGET=$1
LOCAL_TARGET=${TARGET%%@*}
SENDER=$2
if [ $(echo "$TARGET" | $egrep -c '^.+ at .+\..+$') -eq 0 ] ; then
   $logger "TARGET \"$TARGET\" is an invalid email address"
   exit 1
fi
ORIG_MSG=$($mktemp)
$chmod 600 $ORIG_MSG
while read ; do echo "$REPLY" >> $ORIG_MSG ; done
$sudo $maildrop $LOCAL_TARGET -f $SENDER < $ORIG_MSG
$logger_info "Sent original message from \"$SENDER\" to \"$LOCAL_TARGET\""

if [ $(echo "$SENDER" | $egrep -c '^.+ at .+\..+$') -eq 0 ] ; then
   if [ "$SENDER" != "MAILER-DAEMON" ] ; then
      $logger "SENDER \"$SENDER\" is an invalid email address"
      $rm -f $ORIG_MSG
      exit 1
   fi
fi
if [ "$SENDER" == "MAILER-DAEMON" ] ; then
   $logger_info "System mail from MAILER-DAEMON: NOT sending autoresponse"
   $rm -f $ORIG_MSG
   exit 0
fi
if [ $($egrep -i '^Precedence:' $ORIG_MSG | $egrep -c -i 'bulk|list|junk') -gt 0 ] ; then
   $logger_info "Preventing autoresponses to mailing lists, bulk or junk addresses: NOT sending autoresponse to \"$SENDER\""
   $rm -f $ORIG_MSG
   exit 0
fi
if [ $($egrep -i -c '^Sender:' $ORIG_MSG) -gt 0 ] ; then
   $logger_info "Found \"Sender:\" header field."
   H_SENDER=$($egrep -i '^Sender:' $ORIG_MSG | $awk '{print $2}')
   if [ $(echo "$H_SENDER" | $egrep -c '^.+ at .+\..+$') -eq 0 ] ; then
      $logger "Header \"Sender: $H_SENDER\" is an invalid email address, still using envelope sender: \"$SENDER\""
   else
      $logger_info "Using header \"Sender: $H_SENDER\" instead of envelope sender: \"$SENDER\""
      SENDER="$H_SENDER"
   fi
fi
if [ $(echo "$SENDER" | $egrep -c -i 'no(-|)reply@') -gt 0 ] ; then
   $logger_info "Preventing autoresponses to \"noreply\" addresses: NOT sending autoresponse from \"$TARGET\" to \"$SENDER\""
   $rm -f $ORIG_MSG
   exit 0
fi

LOCAL_ONLY="$($ldapsearch '(&(uid='$LOCAL_TARGET')(objectClass=mailUser))' autoResponderLocalOnly |\
   $egrep -v '^dn: uid=' | $sed 's/^.*\ //')"
if [ "$LOCAL_ONLY" == "TRUE" ] ; then
   $logger_info "User \"$LOCAL_TARGET\" allows autoresponses to local addresses only"
   if [ $(echo "$SENDER" | $egrep -c -i '@mydomain.de') -lt 1 ] ; then
      $logger_info "Preventing autoresponses to external address: NOT sending autoresponse from \"$TARGET\" to \"$SENDER\""
      $rm -f $ORIG_MSG
      exit 0
   fi
fi

$rm -f $ORIG_MSG

TODAY=$(echo $(date +%s)/60/60/24 | $bc)
unset ALREADY_SENT
for ((i=$TODAY;i>=(($TODAY-7));i=i-1)) ; do  
   if [ $($egrep -c "$i $TARGET $SENDER" $DB) -gt 0 ] ; then
      ALREADY_SENT=1
   fi
done

if [ -n "$ALREADY_SENT" ] ; then
   $logger_info "Already sent autoresponse from \"$TARGET\" to \"$SENDER\" this week, NOT sending again"
   $logger_info "Cleaning database"
   >$DB.clean
   for ((i=$TODAY;i>=(($TODAY-7));i=i-1)) ; do  
      $egrep "$i" $DB >>$DB.clean
   done
   $mv -f $DB.clean $DB
else
shopt -s nocasematch
   if [[ "$TARGET" == "$SENDER" ]] ; then
shopt -u nocasematch
      $logger_info "Preventing autoresponse loop from \"$TARGET\" to \"$SENDER\""      
   else
      TEXT="$($ldapsearch '(&(uid='$LOCAL_TARGET')(objectClass=mailUser))' autoResponderText |\
         $egrep -v '^dn: uid=' | $sed 's/^.*\ //' | $base64 -d)"
      if [ -z "$TEXT" ] ; then
         $logger_info "Autoresponder text for \"$LOCAL_TARGET\" empty, using default"
         TEXT="$(cat $DEFAULT_RESPONDER_TEXT)"
      fi
      SUBJECT="$($ldapsearch '(&(uid='$LOCAL_TARGET')(objectClass=mailUser))' autoResponderSubject |\
         $egrep -v '^dn: uid=' | $sed 's/^.*\ //' | $base64 -d)"
      if [ -z "$SUBJECT" ] ; then
         SUBJECT="Abwesendheitsnotiz / Away from my email"
      fi
      COMMON_NAME="$($ldapsearch '(&(uid='$LOCAL_TARGET')(objectClass=mailUser))' cn |\
         $egrep -v '^dn: uid=' | $sed 's/^cn:\+\ //')"
      echo "$TEXT" | $sed 's/TARGET/'"$COMMON_NAME"'/' |\
         $mail -a "Content-Type: text/plain; charset=utf-8" -a "From: $TARGET" -a "Sender: autorespond at mydomain.de" -s "$SUBJECT" $SENDER
      echo "$TODAY $TARGET $SENDER" >> $DB
      $logger_info "Sent autoresponse from \"$TARGET\" to \"$SENDER\""
   fi
fi
-------------- nächster Teil --------------
### by jan

server_host = ldap://ldap.mydomain.org
              ldap://ldap2.mydomain.org
              ldap://ldap3.mydomain.org
search_base = ou=people,dc=mydomain,dc=de
query_filter = (&(uid=%u)(objectClass=mailUser)(autoResponderActive=TRUE))
domain = mydomain.org
result_attribute = uid
result_format = autorespond:
version = 3
start_tls = yes
tls_ca_cert_file = /etc/ssl/certs/mycert.pem
#debuglevel = 1
-------------- nächster Teil --------------
Sehr geehrter Absender,

zur Zeit kann ich Ihre Email nicht bearbeiten.

Mit freundlichen Gruessen
TARGET

-------------------------------

Dear sender,

at the time I cannot respond to your email.

Sincerely
TARGET
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : smime.p7s
Dateityp    : application/pkcs7-signature
Dateigröße  : 5855 bytes
Beschreibung: S/MIME Cryptographic Signature
URL         : <https://listi.jpberlin.de/pipermail/postfixbuch-users/attachments/20110202/044a68b0/attachment.p7s>


Mehr Informationen über die Mailingliste Postfixbuch-users