#!/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 <froms> and <subjects>.
  \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
