#!/bin/sh # Skript um E-mail-Attachments zu entpacken, in das PDF-Format zu konvertieren, # und wieder an den Absender zurueck zu senden. # E-mail-Adresse: pdf@domain.tld NUMMER=$$ PDFMAIL="/tmp/PDFMAIL.$NUMMER/PDFMAIL.$NUMMER" PDF_PFAD="/tmp/PDFMAIL.$NUMMER" PDF_FROM="pdf@domain.tld" # Standard-Charset in diesem Skript CHARSET="ISO-8859-15" # Name der E-Mail, welche zurueckgesandt wird EMAIL_RETURN="$PDF_PFAD/EMAIL_RETURN" # Trenner zur Abgrenzung der BODY-Parts BOUNDARY=$(date +%s) BOUNDARY="${BOUNDARY}$NUMMER" # wenn Directory im /EMAIL_RETURN-Pfad schon vorhanden, dann vorher loeschen, if [ -d $PDF_PFAD ] ; then /bin/rm $PDF_PFAD/* else /bin/mkdir $PDF_PFAD fi chmod 775 $PDF_PFAD # Start-Zeit protokollieren /bin/date > $PDF_PFAD/dauer_von_bis.txt # Umlenken der E-mail nach Variable PDFMAIL /bin/cat > $PDFMAIL # falls aus irgendeinem Grund die Datei nicht da sein sollte.... if [ ! -f $PDFMAIL ] ; then exit 0 fi # falls der Absender leer sein sollte... if [ "$SENDER" = "" ] ; then exit 0 fi # Auslesen des Subjects aus der E-mail SUBJECT=$(/bin/cat $PDFMAIL | /bin/sed '/^Subject: */!d; s///;q') # Dateianhaenge als einzelne Dateien extrahieren /usr/local/bin/ripmime -i $PDFMAIL -d $PDF_PFAD --overwrite --syslog --extended-errors # von ripmime erzeugte Datei textfile0 wird nicht benoetigt, loeschen if [ -f $PDF_PFAD/textfile0 ] ; then /bin/rm -f $PDF_PFAD/textfile0 ; fi # von ripmime extrahierte Dateien mit den Dateinamen textfile[i] # werden dem BODY der E-mail, welche zurueck gesandt wird, wieder beigefuegt # HTML-E-mails (im BODY) werden hier also nicht beruecksichtigt. if [ -f $PDF_PFAD/body_return.txt ] ; then /bin/rm -f $PDF_PFAD/body_return.txt ; fi for TEXTFILENAME in $(/bin/ls $PDF_PFAD/textfile*); do if (file --mime-type $TEXTFILENAME | /bin/grep -v "html"); then /bin/cat $TEXTFILENAME >> $PDF_PFAD/body_return.txt fi done; # charset vom E-mail-BODY bestimmen # wenn nicht UTF-8 -> ISO-8859-15 if [ -f $PDF_PFAD/body_return.txt ] ; then if (/usr/bin/file $PDF_PFAD/textfile1 | /bin/grep -i 'utf-8') ; then CHARSET="utf-8" fi fi # wenn vorhanden -> loeschen if [ -f $PDF_PFAD/files_to_convert.txt ] ; then /bin/rm -f $PDF_PFAD/files_to_convert.txt ; fi # zeige alle Dateien mit den folgenden Dateiendungen und lenke das Ergebnis # in die Datei $PDF_PFAD/files_to_convert.txt um # Dateitypen jederzeit erweiterbar - siehe -> man unoconv /bin/ls $PDF_PFAD/*.* \ | /bin/egrep -i '\.(do[ct]|doc[mx]|rtf|pp[ts]|xl[st]|csv|od[stdgp]|ott|htm|sd[wcda]|sxc|jpg|pts|bmp|png|tif|gif)$' \ > $PDF_PFAD/files_to_convert.txt # $EMAIL_RETURN = E-mail-Datei, welche mit sendmail versendet wird # Header + Body aufbauen echo "From: $PDF_FROM" >$EMAIL_RETURN echo "To: $SENDER" >>$EMAIL_RETURN echo "Reply-To: $PDF_FROM" >>$EMAIL_RETURN echo "Subject: $SUBJECT" >>$EMAIL_RETURN echo "MIME-Version: 1.0" >>$EMAIL_RETURN echo "Content-Type: multipart/mixed; boundary=\""$BOUNDARY"\"" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo "This is a multi-part message in MIME format." >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo "--$BOUNDARY" >>$EMAIL_RETURN echo "Content-Type: text/plain; charset=\"$CHARSET\"; format=flowed" >>$EMAIL_RETURN echo "Content-Transfer-Encoding: quoted-printable" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN /bin/cat $PDF_PFAD/body_return.txt >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN # Wenn Datei nicht existiert oder Groesse 0 hat if [ ! -s $PDF_PFAD/files_to_convert.txt ]; then echo "#### keine Dateianhaenge gefunden, welche konvertiert werden koennen. ###" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo "--$BOUNDARY--" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo $EMAIL_RETURN >$PDF_PFAD/EMAIL_RETURN.txt # Versenden der E-mail /bin/cat $EMAIL_RETURN | /usr/sbin/sendmail -t -f pdf@domain.tld exit 0 fi # Text-Ueberschrift in den BODY schreiben, welche Dateien konvertiert werden konnten (echo "Dateianhaenge, welche an den PDF-Konverter gesandt und zum Konvertieren erkannt wurden:") \ >> $PDF_PFAD/body_return.txt # zeilenweise verarbeiten der von ls erzeugten Datei # jede Date wird einzeln an unoconv uebergeben while read DATEI_NAME do # echo - Ausgabe hilft bei der Fehlersuche echo /usr/bin/unoconv -f pdf \""${DATEI_NAME}"\" >>$PDF_PFAD/unoconv.txt # Konvertierung /usr/bin/unoconv -f pdf "${DATEI_NAME}" # loeschen des temporaren Pfades im Dateinamen fuer den E-mail-Body, welcher zurueckgesandt wird /usr/bin/basename "${DATEI_NAME}" >> $PDF_PFAD/body_return.txt done < $PDF_PFAD/files_to_convert.txt # wenn keine PDF-Dokumente erzeugt wurden -> Fehlermeldung per E-mail if [ $(/bin/ls $PDF_PFAD/*.pdf | /usr/bin/wc -l ) -eq 0 ] then echo "### keine PDF-Dokumente gefunden - unovonv - Error (z.B. nicht erkannte Umlaute in Dateinamen) ###" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo "--$BOUNDARY--" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo $EMAIL_RETURN >$PDF_PFAD/EMAIL_RETURN.txt # Versenden der E-mail /bin/cat $EMAIL_RETURN | /usr/sbin/sendmail -t -f pdf@domain.tld exit 0 fi # jede Name einer PDF-Datei wird nach ISO-8859-15 codiert (mit MIME::QuotedPrint::encode) # Punkte und Leerzeichen werden zusaetzlich codiert ( |/bin/sed 's/\./=2E/g' | /bin/sed 's/ /=20/g' ) # ueberschuessige Zeichen von MIME::QuotedPrint::encode werden entfernt ( | /bin/sed 's/=$//g' ) # Zeilenvorschuebe werden entfernt (| tr -d '\n') # jede PDF-Datei wird base64-codiert an die Datei $EMAIL_RETURN uebergeben for ATTACHMENT in $PDF_PFAD/*.pdf do FILENAME=$(basename "${ATTACHMENT}") (echo "${ATTACHMENT}" ; echo $FILENAME) >>$PDF_PFAD/pdf_filenames_and_basenames.txt ( \ echo -n "\"=?$CHARSET?Q?" ; \ echo -n $FILENAME | /usr/bin/perl -pe 'use MIME::QuotedPrint; $_=MIME::QuotedPrint::encode($_);' \ | /bin/sed 's/\./=2E/g' | /bin/sed 's/ /=20/g' | /bin/sed 's/=$//g'; \ echo "?="\" \ ) | tr -d '\n' >$PDF_PFAD/filenames_codiert.txt FILENAME_CODIERT=$(/bin/cat $PDF_PFAD/filenames_codiert.txt ) echo $FILENAME_CODIERT >>$PDF_PFAD/filename_codiert_alle.txt echo "--$BOUNDARY" >>$EMAIL_RETURN echo "Content-Type: application/pdf;" >>$EMAIL_RETURN echo " name=$FILENAME_CODIERT" >>$EMAIL_RETURN echo "Content-Transfer-Encoding: base64" >>$EMAIL_RETURN echo "Content-Disposition: attachment;" >>$EMAIL_RETURN echo " filename=$FILENAME_CODIERT" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN # erste und letzte Zeile entfernen ($BOUNDARY wird nur temporaer benutzt) /bin/cat "${ATTACHMENT}" | uuencode --base64 $BOUNDARY | /bin/sed '1,1d' | /bin/sed '$d' >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN done # Ende der E-mail echo "--$BOUNDARY--" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo "" >>$EMAIL_RETURN echo $EMAIL_RETURN >$PDF_PFAD/EMAIL_RETURN.txt # Versenden der E-mail /bin/cat $EMAIL_RETURN | /usr/sbin/sendmail -t -f pdf@domain.tld # Ende-Zeit protokollieren /bin/date >> $PDF_PFAD/dauer_von_bis.txt exit 0