summaryrefslogtreecommitdiffstats
path: root/etc/hypermail/mdir2mbox.sh
blob: 2446e555911860122c319b6799ead94796f3e4c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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;