diff options
Diffstat (limited to 'etc/hypermail/mdir2mbox.sh')
-rwxr-xr-x | etc/hypermail/mdir2mbox.sh | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/etc/hypermail/mdir2mbox.sh b/etc/hypermail/mdir2mbox.sh new file mode 100755 index 0000000..2446e55 --- /dev/null +++ b/etc/hypermail/mdir2mbox.sh @@ -0,0 +1,119 @@ +#! /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" <Xfmail-mail-directory>"; +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~/</) {pos=index($2,">");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~/</) {pos=index($2,">");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; |