imap_id = @imap_state[id][:id]
result = fetch(imap_id, (fields + ['RFC822.SIZE', 'INTERNALDATE']).uniq).first
got_id = make_id result
- raise OutOfSyncSourceError, "IMAP message mismatch: requested #{id}, got #{got_id}." unless got_id == id
+
+ ## I've turned off the following sanity check because Microsoft Exchange fails it.
+ ## Exchange actually reports two different INTERNALDATEs for the exact same message
+ ## when queried at different points in time.
+ ##
+ ## I don't actually see the semantics of INTERNALDATE actually defined anywhere
+ ## in either RFC 3501 or RFC 2060, beyond "the internal date of the message"
+ ## (gee, thanks guys, great job on that committee), so it's probably perfectly
+ ## acceptable to return any date you'd like for any message.
+ ##
+ ## Of course no OTHER imap server I've encountered returns DIFFERENT values for
+ ## the SAME message. But it's Microsoft; what do you expect? If their programmers
+ ## were any good they'd be working at Google.
+
+ # raise OutOfSyncSourceError, "IMAP message mismatch: requested #{id}, got #{got_id}." unless got_id == id
fields.map { |f| result.attr[f] or raise FatalSourceError, "empty response from IMAP server: #{f}" }
end