ソースを参照

Explicit Exception when fetch return events unrelated to the mail fetcher request

Guénaël Muller 6 年 前
コミット
a3c0102659
共有1 個のファイルを変更した21 個の追加1 個の削除を含む
  1. 21 1
      tracim/tracim/lib/email_fetcher.py

+ 21 - 1
tracim/tracim/lib/email_fetcher.py ファイルの表示

@@ -151,6 +151,10 @@ class DecodedMail(object):
151 151
         return None
152 152
 
153 153
 
154
+class BadIMAPFetchResponse(Exception):
155
+    pass
156
+
157
+
154 158
 class MailFetcher(object):
155 159
     def __init__(
156 160
         self,
@@ -290,6 +294,10 @@ class MailFetcher(object):
290 294
             # TODO - G.M - 10-01-2017 - Support imapclient exceptions
291 295
             # when Imapclient stable will be 2.0+
292 296
 
297
+            except BadIMAPFetchResponse as e:
298
+                log = 'Imap Fetch command return bad response.' \
299
+                      'Is someone else connected to the mailbox ?'
300
+                logger.error(self, log.format(e.__str__()))
293 301
             # Others
294 302
             except Exception as e:
295 303
                 log = 'Mail Fetcher error {}'
@@ -354,9 +362,21 @@ class MailFetcher(object):
354 362
             logger.debug(self, 'Fetch mail "{}"'.format(
355 363
                 msgid,
356 364
             ))
357
-            msg = message_from_bytes(data[b'BODY[]'])
365
+
366
+            try:
367
+                msg = message_from_bytes(data[b'BODY[]'])
368
+            except KeyError as e:
369
+                # INFO - G.M - 12-01-2018 - Fetch may return events response
370
+                # In some specific case, fetch command may return events
371
+                # response unrelated to fetch request.
372
+                # This should happen only when someone-else use the mailbox
373
+                # at the same time of the fetcher.
374
+                # see https://github.com/mjs/imapclient/issues/334
375
+                raise BadIMAPFetchResponse from e
376
+
358 377
             msg_container = MessageContainer(msg, msgid)
359 378
             messages.append(msg_container)
379
+
360 380
         return messages
361 381
 
362 382
     def _notify_tracim(