#!/bin/bash ########################################################### function nomails(){ echo "There are no new mails"; exit 1; } #gibt eine Fehlermeldung aus: # Param: Funktionsname ########################################################### function error(){ echo "Error in Function <$1>"; exit; } # testet ob 1.Param eine gueltige From Zeile einer Mail ist ########################################################### function isvalidFROMline(){ if test -z "$1"; then return 1; fi; # es muss "From "am Anfang stehen. REDUCED="${1#From *}"; if test "$1" = "$REDUCED"; then return 1; else #jetzt nur noch nach einem @ suchen REDUCED="${1#*@*}"; if test "$1" = "$REDUCED"; then return 1; fi echo "$1"; return 0; fi } # überprüft, ob Param1 in der Liste in Param2 (nach Zeilen getrennt) # RETURN: 0 drin 1 nicht drin ########################################################### function isInList(){ if test -n "`echo "$2" | grep "$1"`"; then return 0; fi; return 1; } # überprüft, ob Param1 in der Datei(Param2) (nach Zeilen getrennt) ( es werden Teilstrings gematched) # RETURN: 0 drin 1 nicht drin ( in einer leeren Datei ist alles drin) ########################################################### function isInFile(){ if test -z $2; then return 0; fi if test -s $2; then OLDIFS="$IFS";# "internal field seperator" apeichern und nur auf newline setzten IFS=" "; for LINE in `cat "$2"`; do REDUCE=${1#*"$LINE"*}; if test "$REDUCE" != "$1"; then # of ist drin IFS="$OLDIFS"; return 0; fi; done; IFS="$OLDIFS"; return 1; else return 0; fi; } # 1.Param wird analysiert # ist gueltige Zeile eines MailHeaders ist (mit Wort: oder mit einrueckung beginnend) # ist Line von Intereresse # ist Mail von Intereresse ( wenn From: oder Subject: gelesen wird -> ueberpruefung) # Return (stdout=; ParseState aufgrund der eingelesenen Zeile. # 1-> irrelevante Zeile # 2->Relevamte Zeile # 3->keine Headerzeile # Return: (exitstatus): 0-> Zeile in gewuenschten Dateien (valid Subject/From) 1->sonst ########################################################### function analyseHEADERline(){ INTERESTHEADERLINES="From To Subject Date List-Post" if test -z "$1"; then return 1; fi; # es kann ein " " am Anfang stehen. if test -n "`echo "$1"|grep "^[[:space:]]"`"; then echo "1"; #OK beginnt mit Space return 1; else #es könnte noch mit "Wort: " anfangen if test -n "`echo "$1" | grep "^[[:alpha:]-]*:"`"; then # jetzt kann gleich geprueft werden ob das Wort und e-mail relevatn ist oder nicht WORT=${1%%:*} # in WORT steht jetzt das Wort vor dem : VALUE=${1#*:} # in VALUE steht jetzt alles das nach : steht #Wenn Wort "From" oder "Subject", dann nachschauen, ob gewuenscht if test "$WORT" = "From"; then # in der Datei fuer die Froms nachschauen if isInFile "$VALUE" "froms"; then echo "2"; return 0; fi fi if test "$WORT" = "Subject"; then # in der Datei fuer die Subjects nachschauen if isInFile "$VALUE" "subjects"; then echo "2"; return 0; fi fi # ist die Zeile eine rekevante HeaderZeile if isInList "$WORT" "$INTERESTHEADERLINES"; then echo "2"; else echo "1"; fi return 1; fi; fi; echo "3"; return 1; } #Speichert eine Mail in eine Datei # Param1: ISVALID (0->gualtig; 1->nicht gueltig # Param2: MAIL # Param3: Mailnummer ########################################################### function savemail(){ if test "$1" -eq "0"; then echo "MAIL: $3" >> mails; echo "$2">>mails; echo '-------------------------------------------------------------------------' >> mails; fi } #sucht mails aus der Datei heraus und speichert die gewuenschten in eine Datei (mails) #Raram1 : maildatei ########################################################### function extractmails(){ # "internal field seperator" aperichern und nur auf newline setzten OLDIFS="$IFS"; NEWIFS=" "; IFS="$NEWIFS"; declare -i MAILNUMMER=0; #Nummer der Mail declare -i PARSERSTATE=0;#-1-> ungueltige mail; #0-> gehoert zu keiner mail #1->gehoert zum mailheader irrelevant #2->gehoert zum mailheader relevant #3->body MAIL=""; # varriable für eine mail ISMAILVALID="1"; ## alle Zeilen Durchgehen und zu einer Mail zusammen basteln for LINE in `cat "$1"`; do IFS="$OLDIFS"; # suche nach mailanfang if test $PARSERSTATE -eq 0 && isvalidFROMline "$LINE"; then PARSERSTATE=1; else # suche nach Ende des Headers if test $PARSERSTATE -eq 1|| test $PARSERSTATE -eq 2 ; then PARSERSTATE=`analyseHEADERline "$LINE"` && ISMAILVALID="0"; # Mail ist gueltig if test $PARSERSTATE -eq 3; then MAIL="$MAIL Content: "; fi fi; # suche nach Mailende if test $PARSERSTATE -eq 3 && isvalidFROMline "$LINE"; then #ACHTUNG NEUE MAIL -> alte in Datei schreiben und Mail variable leeren MAILNUMMER="$MAILNUMMER"+"1"; savemail "$ISMAILVALID" "$MAIL" "$MAILNUMMER"; MAIL=""; ISMAILVALID="1"; PARSERSTATE=1; fi; fi if test $PARSERSTATE -gt 1; then MAIL="$MAIL$LINE "; fi # echo "$PARSERSTATE : $LINE"; IFS="$NEWIFS"; done; MAILNUMMER="$MAILNUMMER"+"1"; savemail "$ISMAILVALID" "$MAIL" "$MAILNUMMER" IFS="$OLDIFS"; #"internal field seperator" wiederherstellen } ########################################################### ####################### H A U P T P R O G R A M M ########################## ########################################################### if test -e "mails"; then echo "Die Datei mails sollte nicht existieren (als temporaere Datei erforderlich)!"; exit 1; fi #VARAIBLEN MAILFILE="/var/mail/$USER"; #Nach PARAMETERN schauen if test -z "$1" || test "$1" = "-h"; then #Hilfe ausgeben echo -e "USAGE: $0 "'{-n|-h|-f file}'"\n\tto select mails create the files and . \tEach line is compared with the mail header info (substrings are matched) \t-n\tconvert new mails (/var/mail/username) \t-h\tdisplax this short help \t-f file\tuse file as mailssource instead of /var/mail/username"; exit 1; fi if test "$1" = "-f" && test -n "$2" && test -e "$2"; then MAILFILE="$2"; fi echo "I use $MAILFILE as mail source"; #testen ob mails da if ! test -s "$MAILFILE"; then echo "No mails"; exit 1; fi #Mails einlesen. extractmails "$MAILFILE"; #HTML-Datei bauen (wenn ueberhaupt mails geschieben if test -r "mails"; then #FROM http://www.aigeek.com/txt2html/ txt2html.pl -r 50 -EH -H '^MAIL:.*' --mail -t "$USER 's mails generated by mail2html" mails > mails.html; rm mails; else echo "no relevant mails" fi