Caching functionality for performance improvement
[imap-fix-internaldate] / fix_imap_internaldate.py
index 00e0f15..7aa0675 100644 (file)
@@ -25,6 +25,7 @@ import logging
 import configparser
 from date_interpreter import DateInterpreter
 from mail_iterator import MailIterator
+from caching_data import CachingData
 
 def main():
     """Iterates through csv list of users and their mailboxes"""
@@ -39,6 +40,8 @@ def main():
                         level=config.getint('basic_settings', 'log_level'))
 
     date_interp = DateInterpreter()
+    cashing_data = CachingData()
+    logging.warning(cashing_data)
     user_reader = csv.DictReader(open("userdata.csv", "r"), delimiter=',')
 
     server = config.get('basic_settings', 'imap_server')
@@ -53,12 +56,15 @@ def main():
             continue
         for mailbox in session:
             try:
-                #print(".")
+                #special key to ensure better mailbox uniqueness
+                mailbox_key = mailbox[0].strip('"') + mailbox[1]
                 mail_ids = session.fetch_messages()
+                new_ids = cashing_data.sync_cached_mailbox(user['username'], mailbox_key, mail_ids)
+                #print(len(new_ids), "new out of", len(mail_ids), "in", mailbox)
             except UserWarning as ex:
                 logging.error(ex)
                 continue
-            for mid in mail_ids:
+            for mid in new_ids:
                 try:
                     fetched_internal_date = session.fetch_internal_date(mid)
                     internal_date = date_interp.extract_internal_date(fetched_internal_date)
@@ -66,7 +72,7 @@ def main():
                     received_date = date_interp.extract_received_date(fetched_received_date)
                     if(received_date==""):
                         logging.warning("No received date could be found in message uid: %s - mailbox: %s - user: %s.\n",
-                                        mid.decode("utf-8"), mailbox.strip('"'), user['username'])
+                                        mid.decode("utf-8"), mailbox[0], user['username'])
                         continue
                 except UserWarning as ex:
                     logging.error(ex)
@@ -75,19 +81,22 @@ def main():
                     #print(received_date, internal_date)
                     if(test_mode==0):
                         try:
-                            session.update_message(mid, mailbox, received_date)
+                            session.update_message(mid, mailbox[0], received_date)
                         except UserWarning as ex:
                             logging.error(ex)
                             continue
                     else:
                         logging.info("Date conflict found in message uid: %s - mailbox: %s - user: %s.\nInternal date %s is different from received date %s from RECEIVED header:\n%s.",
-                                        mid.decode("utf-8"), mailbox.strip('"'), user['username'],
+                                        mid.decode("utf-8"), mailbox[0], user['username'],
                                         internal_date.strftime("%d %b %Y %H:%M:%S"),
                                         received_date.strftime("%d %b %Y %H:%M:%S"),
                                         fetched_received_date[0][1].decode("utf-8").split("Received:")[1])
-                    #count total emails for every user and mailbox
-                    mixed_key = user['username']+'|'+mailbox.strip('"')
-                    total_per_box[mixed_key] = 1 + total_per_box.get(mixed_key, 0)
+                    # count total emails for every user and mailbox
+                    user_key = user['username']+'|'+mailbox[0].strip('"')
+                    total_per_box[user_key] = 1 + total_per_box.get(user_key, 0)
+            # if all messages were successfully fixed confirm caching
+            cashing_data.commit_cached_mailbox(user['username'], mailbox_key)
+        # final report on date conflicts
         total_per_user = 0
         for warning in total_per_box:
             total_per_user += total_per_box[warning]