summaryrefslogtreecommitdiff
path: root/splitmboxdaily
blob: d337cd24cd69937ccfdeec2f93715516e7a1df98 (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
#!/usr/bin/python2.5
# splitmboxdaily - split an mbox into new ones, one per day
# Copyright 2008-2010  Lars Wirzenius
# 
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import mailbox, sys, re, time, os

pat = re.compile(r"((Mon|Tue|Wed|Thu|Fri|Sat|Sun), )?"
		 r" ?(?P<day>\d\d?) "
		 r"(?P<mon>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)) "
		 r"(?P<year>\d\d(\d\d)?) ")

montab = {
	"Jan": "01",
	"Feb": "02",
	"Mar": "03",
	"Apr": "04",
	"May": "05",
	"Jun": "06",
	"Jul": "07",
	"Aug": "08",
	"Sep": "09",
	"Oct": "10",
	"Nov": "11",
	"Dec": "12",
}

outbox = {}

for filename in sys.argv[1:]:
	mbox = mailbox.mbox(filename)
	count = 0
	start = time.time()
	for key in sorted(mbox.keys()):
		msg = mbox[key]
		m = pat.match(msg["Date"] or "")
		if m:
			day = "%02d" % int(m.group("day"))
			mon = montab[m.group("mon")]
			year = m.group("year")
			if int(year) < 10:
				year = "20" + year
			elif 88 <= int(year) < 100:
				year = "19" + year
		else:
			year = "unknown"
			mon = "00"
			day = "00"
	
		name = "%s/%s-%s-%s.mbox" % (year, year, mon, day)
		if not os.path.isdir("%s" % year):
		    os.mkdir("%s" % year)
		if name not in outbox:
			outbox[name] = mailbox.mbox(name)
		outbox[name].add(msg)

		count += 1
		if (count % 10) == 0 or count == len(mbox):
			sys.stdout.write("\r%5.1f done" % 
					 (100.0 * count/len(mbox)))
			duration = (time.time() - start) or 1.0
			sys.stdout.write(" %6.1f msgs/s" % (count/duration))
			sys.stdout.write(" %s" % filename)
			sys.stdout.flush()

	print
	for box in outbox.values():
		box.close()
	outbox = {}