From cd432b80328ea20597c3cdabc24305c2862594d6 Mon Sep 17 00:00:00 2001 From: Kris Markel Date: Mon, 1 Feb 2010 00:13:30 -0800 Subject: [PATCH] Add initial support for send and recieved dates. --- bin/imapPull.py | 78 ++++++++++++++- letterbox/source/LBMessage.h | 2 + letterbox/source/LBMessage.m | 4 + letterbox/source/LBServer.m | 4 + resources/English.lproj/MailView.xib | 139 +++++++++++++++++++++------ 5 files changed, 194 insertions(+), 33 deletions(-) diff --git a/bin/imapPull.py b/bin/imapPull.py index 0fca3de..8198bee 100755 --- a/bin/imapPull.py +++ b/bin/imapPull.py @@ -9,6 +9,53 @@ import email import uuid from sqlite3 import dbapi2 as sqlite +from dateutil.parser import * + +# From the python docs for determining the local time zone. http://docs.python.org/library/datetime.html#datetime-objects + +# A class capturing the platform's idea of local time. +from datetime import tzinfo, timedelta, datetime + +ZERO = timedelta(0) + +import time as _time + +STDOFFSET = timedelta(seconds = -_time.timezone) +if _time.daylight: + DSTOFFSET = timedelta(seconds = -_time.altzone) +else: + DSTOFFSET = STDOFFSET + +DSTDIFF = DSTOFFSET - STDOFFSET + +class LocalTimezone(tzinfo): + + def utcoffset(self, dt): + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt): + return _time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = _time.mktime(tt) + tt = _time.localtime(stamp) + return tt.tm_isdst > 0 + +Local = LocalTimezone() + +# End of python doc code. uname = sys.argv[1] server = sys.argv[3] @@ -56,6 +103,7 @@ mailboxes.sort(key=str.lower) for mbox in mailboxes: + msg = None try: dbcursor.execute("insert into folder (folder, subscribed) values (?,?)", (mbox, '1')) dbcursor.execute("delete from message where folder = ?", (mbox,)) @@ -82,15 +130,37 @@ f.close() print(path) + send = parse(msg.get("date"), fuzzy=True) + send = send.astimezone(Local) + # Apparently this loses fractional seconds. I'm pretty sure we don't care. + sendsinceepoch = time.mktime(send.timetuple()) - dbcursor.execute("insert into message (uuid, messageid, folder, subject, fromAddress, toAddress, receivedDate, sendDate) values (?,?,?,?,?,?,?,?)", - (uid, msg.get("Message-Id"), mbox, msg.get("Subject"), msg.get("From"), msg.get("To"), 0, 0)) + receivedsinceepoch = 0 + if msg.has_key("Received"): + # Multiple received headers is crazy common. + receivedheaders = msg.get_all("Received") + for receivedheader in receivedheaders: + # The bit after the ";" is the date-time stamp. + datestring = receivedheader.partition(";")[2].strip() + latestreceived = parse(datestring, fuzzy=True) + # For whatever reason, sometimes we get a datetime without the timezone set. + if None == latestreceived.tzinfo: + latestreceived = latestreceived.replace(tzinfo=Local) + latestreceived = latestreceived.astimezone(Local) + latestreceivedsinceepoch = time.mktime(latestreceived.timetuple()) + if latestreceivedsinceepoch > receivedsinceepoch: + receivedsinceepoch = latestreceivedsinceepoch + else: + # There's no guarantee of a received header. It would appear Apple Mail uses send in these cases. + receivedsinceepoch = sendsinceepoch - # Tue, 26 Jan 2010 16:28:43 -0800 + dbcursor.execute("insert into message (uuid, messageid, folder, subject, fromAddress, toAddress, receivedDate, sendDate) values (?,?,?,?,?,?,?,?)", + (uid, msg.get("Message-Id"), mbox, msg.get("Subject"), msg.get("From"), msg.get("To"), receivedsinceepoch, sendsinceepoch)) - except Exception, e: print("Error in select: " + mbox) + if None != msg: + print("Last message: " + msg.as_string()) print(e) sys.exit() diff --git a/letterbox/source/LBMessage.h b/letterbox/source/LBMessage.h index 2508ec8..73e0d73 100644 --- a/letterbox/source/LBMessage.h +++ b/letterbox/source/LBMessage.h @@ -23,6 +23,8 @@ @property (retain) NSString *to; @property (retain) NSString *messageBody; @property (retain) NSURL *messageURL; +@property (retain) NSDate *receivedDate; +@property (retain) NSDate *sendDate; - (void) parseHeaders; diff --git a/letterbox/source/LBMessage.m b/letterbox/source/LBMessage.m index d5066eb..66b54c4 100644 --- a/letterbox/source/LBMessage.m +++ b/letterbox/source/LBMessage.m @@ -16,6 +16,8 @@ @implementation LBMessage @synthesize subject; @synthesize sender; @synthesize to; +@synthesize receivedDate; +@synthesize sendDate; - (id)initWithURL:(NSURL*)fileURL { self = [super init]; @@ -35,6 +37,8 @@ - (void)dealloc { [subject release]; [sender release]; [to release]; + [receivedDate release]; + [sendDate release]; [super dealloc]; } diff --git a/letterbox/source/LBServer.m b/letterbox/source/LBServer.m index 50d97d0..2a3b7c8 100644 --- a/letterbox/source/LBServer.m +++ b/letterbox/source/LBServer.m @@ -550,6 +550,10 @@ - (NSArray*)cachedMessagesForFolder:(NSString *)folder { message.subject = [rs stringForColumnIndex:2]; message.sender = [rs stringForColumnIndex:3]; message.to = [rs stringForColumnIndex:4]; + NSTimeInterval receivedDateInterval = [rs doubleForColumnIndex:5]; + message.receivedDate = [NSDate dateWithTimeIntervalSince1970:receivedDateInterval]; + NSTimeInterval sendDateInterval = [rs doubleForColumnIndex:6]; + message.sendDate = [NSDate dateWithTimeIntervalSince1970:sendDateInterval]; [messageArray addObject:message]; } diff --git a/resources/English.lproj/MailView.xib b/resources/English.lproj/MailView.xib index bf55a77..0ac994e 100644 --- a/resources/English.lproj/MailView.xib +++ b/resources/English.lproj/MailView.xib @@ -3,16 +3,16 @@ 1060 10C540 - 759 + 740 1038.25 458.00 com.apple.InterfaceBuilder.CocoaPlugin - 759 + 740 YES - + YES @@ -521,7 +521,7 @@ -2147483392 - {{224, 0}, {16, 17}} + {{713, 0}, {16, 17}} @@ -558,7 +558,7 @@ subject - 620 + 470 40 1000 @@ -583,6 +583,66 @@ YES + + sendDate + 70 + 40 + 1000 + + 75628096 + 2048 + Date Sent + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 337772096 + 2048 + Text Cell + + + + + + 3 + YES + YES + + + + receivedDate + 74 + 40 + 1000 + + 75628096 + 2048 + Date Received + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 337772096 + 2048 + Text Cell + + + + + + 3 + YES + YES + + 3 2 @@ -609,22 +669,21 @@ -2147483392 - {{224, 17}, {15, 102}} + {{713, 17}, {15, 223}} _doScroller: - 37 - 0.1947367936372757 + 0.93697478991596639 -2147483392 - {{1, 75}, {142, 15}} + {{1, 240}, {727, 15}} 1 _doScroller: - 0.96598639455782309 + 0.96291390728476822 @@ -1060,6 +1119,8 @@ YES + + @@ -1237,6 +1298,34 @@ + + 67 + + + YES + + + + + + 68 + + + + + 69 + + + YES + + + + + + 70 + + + @@ -1289,15 +1378,19 @@ 58.IBPluginDependency 60.IBPluginDependency 62.IBPluginDependency + 67.IBPluginDependency + 68.IBPluginDependency + 69.IBPluginDependency + 70.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{57, 315}, {934, 586}} + {{457, 524}, {934, 586}} com.apple.InterfaceBuilder.CocoaPlugin - {{57, 315}, {934, 586}} + {{457, 524}, {934, 586}} {196, 240} {{357, 418}, {480, 270}} @@ -1338,6 +1431,10 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin @@ -1356,7 +1453,7 @@ - 66 + 70 @@ -1950,7 +2047,6 @@ 0 - IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx @@ -1962,20 +2058,5 @@ YES ../../Letters.xcodeproj 3 - - YES - - YES - toolbar-getmail - toolbar-new - toolbar-reply - - - YES - {32, 32} - {32, 32} - {25.6028, 25.6028} - -