summaryrefslogtreecommitdiffstats
path: root/etc/hypermail/mdir2mbox.sh
diff options
context:
space:
mode:
Diffstat (limited to 'etc/hypermail/mdir2mbox.sh')
-rwxr-xr-xetc/hypermail/mdir2mbox.sh119
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;