#! /bin/bash # # For alpinelinux - this script /does/ require bash # # Get a directory name as input and convert all mail files inside # to mbox format # # NOTE: processing of subdirectories not yet implemented correctly: # all mails in subfolders are put into the same mbox # (it would be better if an mbox file will be generated for # each subfolder) # NOTE: calculation of message date in case of 'From:' doesn't recognise # time zones # # History: # Feb 06 2001 Joerg Reinhardt # - first edition # Feb 07 2001 Joerg Reinhardt # - added usage output # Feb 12 2001 Joerg Reinhardt # - mails not containing a 'From:' field but an 'X-From-Line:' or a # 'Reply-To:' field are now recognised and also processed (e.g. put into # the mbox file); this works fine for all my mails # - added progress information # - warning about corrupt files is now written to stderr # # # check for argument or help argument respectively if [[ ($1 == "") || ($1 == "-h") || ($1 == "--help") || ($1 == "-help") ]]; then echo "Usage: "$0" "; fi; # check if parameter is a directory if [[ -d $1 ]]; then # set target filename dirname=`echo $1 | awk '{while(substr($0,length($0),1)=="/"){$0=substr($0,1,length($0)-1);}print $0;}'`; mboxfile=$dirname'.mbox'; # check if directory is empty if [[ `find $dirname -type f` == "" ]]; then echo $dirname": directory empty." exit 1; fi; # prevent automatic overwriting of target if [[ -e $mboxfile ]]; then \ dialogtext="Write file "$mboxfile"?"; if dialog --yesno "$dialogtext" 10 60; then clear; rm -vf $mboxfile; else clear; exit 1; fi; fi; echo "writing xfmail mail directory '$1' to '$mboxfile'."; # collect files inside Xfmail mail-directory and produce MBOX format # target file for i in `find $1/* -type f`; do # output progress information echo -n -e \\r" " echo -n -e \\rprocessing $i # look for senders email address in the order # 'From:' # 'X-From-Line:' # 'Reply-To:' shortfromflag='true'; fromline=`grep 'From:' $i`; # parse 'From:' field from=`echo $fromline | awk 'BEGIN{FS="<";}{if($0~/");if(pos!=0) {print substr($2,1,pos-1);}} else {pos=index($0,":");print substr($0,pos+1);}}'`; if [[ $from == "" ]]; then shortfromflag='false'; fromline=`grep 'X-From-Line:' $i`; from=`echo $fromline | awk 'BEGIN{FS="Line:";}{print $2;}'`; if [[ $from == "" ]]; then shortfromflag='true'; fromline=`grep 'Reply-To:' $i`; # parse 'Reply-To:' field from=`echo $fromline | awk 'BEGIN{FS="<";}{if($0~/");if(pos!=0) {print substr($2,1,pos-1);}} else {pos=index($0,":");print substr($0,pos+1);}}'`; if [[ $from == "" ]]; then echo; echo "WARNING: "$i": no 'From:' nor 'X-From-Line:' nor 'Reply-To:' field found." >&2; continue; fi; fi; fi; if [[ $shortfromflag == "true" ]]; then # parse date field dateline=`grep 'Date:' $i`; if [[ $dateline == "" ]]; then # set dummy date if no date field found dateline="Date: Thu, 01 Jan 1970 00:00:00 +0000 (GMT)"; fi; weekday=`echo $dateline | awk '{gsub(/,/,"",$2);print $2;}'`; day=`echo $dateline | awk '{print $3;}'`; month=`echo $dateline | awk '{print $4;}'`; year=`echo $dateline | awk '{print $5;}'`; time=`echo $dateline | awk '{print $6;}'`; diffGMT=`echo $dateline | awk '{print $7;}'`; timezone=`echo $dateline | awk '{print $8;}'`; # output MBOX mail header echo "From " $from $weekday $month $day $time $year >> $mboxfile; else # output long MBOX mail header found in 'X-From-Line:' field echo $from >> $mboxfile; fi; # output mail itself cat $i >> $mboxfile; done; echo; else echo $1": not a directory."; fi;