From 5e8852611e6c983b497dc7b5ae3e8b82cb95fde5 Mon Sep 17 00:00:00 2001
From: Wang Liang <liang@localhost.localdomain>
Date: Tue, 15 Jul 2008 20:40:16 +0800
Subject: [PATCH] skip big attachment

---
 offlineimap/folder/Base.py |   33 ++++++++++++++++++---------------
 offlineimap/folder/IMAP.py |   31 +++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/offlineimap/folder/Base.py b/offlineimap/folder/Base.py
index 9b29ab3..cf5c706 100644
--- a/offlineimap/folder/Base.py
+++ b/offlineimap/folder/Base.py
@@ -351,21 +351,24 @@ class BaseFolder:
         for uid in self.getmessagelist().keys():
             if uid < 0:                 # Ignore messages missed by pass 1
                 continue
-            selfflags = self.getmessageflags(uid)
-            destflags = dest.getmessageflags(uid)
-
-            addflags = [x for x in selfflags if x not in destflags]
-
-            for flag in addflags:
-                if not flag in addflaglist:
-                    addflaglist[flag] = []
-                addflaglist[flag].append(uid)
-
-            delflags = [x for x in destflags if x not in selfflags]
-            for flag in delflags:
-                if not flag in delflaglist:
-                    delflaglist[flag] = []
-                delflaglist[flag].append(uid)
+            try:
+                selfflags = self.getmessageflags(uid)
+                destflags = dest.getmessageflags(uid)
+
+                addflags = [x for x in selfflags if x not in destflags]
+
+                for flag in addflags:
+                    if not flag in addflaglist:
+                        addflaglist[flag] = []
+                    addflaglist[flag].append(uid)
+
+                delflags = [x for x in destflags if x not in selfflags]
+                for flag in delflags:
+                    if not flag in delflaglist:
+                        delflaglist[flag] = []
+                    delflaglist[flag].append(uid)
+            except KeyError:
+                continue
 
         for object in applyto:
             for flag in addflaglist.keys():
diff --git a/offlineimap/folder/IMAP.py b/offlineimap/folder/IMAP.py
index 05edaf0..c142703 100644
--- a/offlineimap/folder/IMAP.py
+++ b/offlineimap/folder/IMAP.py
@@ -161,6 +161,11 @@ class IMAPFolder(BaseFolder):
         imapobj = self.imapserver.acquireconnection()
         try:
             imapobj.select(self.getfullname(), readonly = 1)
+            # skip big message since offlineimap fails to get it.
+            wl_sizereturn = imapobj.uid('fetch', '%d' % uid, '(RFC822.SIZE)')
+            wl_size = int(wl_sizereturn[1][0].split()[-1].replace(')',''));
+            if wl_size > 10000000:
+                return ''
             initialresult = imapobj.uid('fetch', '%d' % uid, '(BODY.PEEK[])')
             ui.debug('imap', 'Returned object from fetching %d: %s' % \
                      (uid, str(initialresult)))
@@ -436,4 +441,30 @@ class IMAPFolder(BaseFolder):
         for uid in uidlist:
             del self.messagelist[uid]
         
+    def copymessageto(self, uid, applyto, register = 1):
+        # Sometimes, it could be the case that if a sync takes awhile,
+        # a message might be deleted from the maildir before it can be
+        # synced to the status cache.  This is only a problem with
+        # self.getmessage().  So, don't call self.getmessage unless
+        # really needed.
+        if register:
+            UIBase.getglobalui().registerthread(self.getaccountname())
+        UIBase.getglobalui().copyingmessage(uid, self, applyto)
+        message = ''
+        # If any of the destinations actually stores the message body,
+        # load it up.
+        for object in applyto:
+            if object.storesmessages():
+                message = self.getmessage(uid)
+                break
+        if message != '':
+            flags = self.getmessageflags(uid)
+            rtime = self.getmessagetime(uid)
+            for object in applyto:
+                newuid = object.savemessage(uid, message, flags, rtime)
+                if newuid > 0 and newuid != uid:
+                    # Change the local uid.
+                    self.savemessage(newuid, message, flags, rtime)
+                    self.deletemessage(uid)
+                    uid = newuid
         
-- 
1.5.4.1

