[MERGE] Forward-port of latest 7.0 bugfixes, up to rev. 9846 revid:dle@openerp.com...
[odoo/odoo.git] / addons / fetchmail / fetchmail.py
index cce1f77..5f63790 100644 (file)
@@ -187,7 +187,7 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
         for server in self.browse(cr, uid, ids, context=context):
             _logger.info('start checking for new emails on %s server %s', server.type, server.name)
             context.update({'fetchmail_server_id': server.id, 'server_type': server.type})
-            count = 0
+            count, failed = 0, 0
             imap_server = False
             pop_server = False
             if server.type == 'imap':
@@ -196,20 +196,26 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
                     imap_server.select()
                     result, data = imap_server.search(None, '(UNSEEN)')
                     for num in data[0].split():
+                        res_id = None
                         result, data = imap_server.fetch(num, '(RFC822)')
-                        res_id = mail_thread.message_process(cr, uid, server.object_id.model, 
-                                                             data[0][1],
-                                                             save_original=server.original,
-                                                             strip_attachments=(not server.attach),
-                                                             context=context)
+                        imap_server.store(num, '-FLAGS', '\\Seen')
+                        try:
+                            res_id = mail_thread.message_process(cr, uid, server.object_id.model,
+                                                                 data[0][1],
+                                                                 save_original=server.original,
+                                                                 strip_attachments=(not server.attach),
+                                                                 context=context)
+                        except Exception:
+                            _logger.exception('Failed to process mail from %s server %s.', server.type, server.name)
+                            failed += 1
                         if res_id and server.action_id:
-                            action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", server.object_id.model)})
-                            imap_server.store(num, '+FLAGS', '\\Seen')
-                            cr.commit()
+                            action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids': [res_id], 'active_model': context.get("thread_model", server.object_id.model)})
+                        imap_server.store(num, '+FLAGS', '\\Seen')
+                        cr.commit()
                         count += 1
-                    _logger.info("fetched/processed %s email(s) on %s server %s", count, server.type, server.name)
+                    _logger.info("Fetched %d email(s) on %s server %s; %d succeeded, %d failed.", count, server.type, server.name, (count - failed), failed)
                 except Exception:
-                    _logger.exception("Failed to fetch mail from %s server %s.", server.type, server.name)
+                    _logger.exception("General failure when trying to fetch mail from %s server %s.", server.type, server.name)
                 finally:
                     if imap_server:
                         imap_server.close()
@@ -222,18 +228,23 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
                     for num in range(1, numMsgs + 1):
                         (header, msges, octets) = pop_server.retr(num)
                         msg = '\n'.join(msges)
-                        res_id = mail_thread.message_process(cr, uid, server.object_id.model,
-                                                             msg,
-                                                             save_original=server.original,
-                                                             strip_attachments=(not server.attach),
-                                                             context=context)
+                        res_id = None
+                        try:
+                            res_id = mail_thread.message_process(cr, uid, server.object_id.model,
+                                                                 msg,
+                                                                 save_original=server.original,
+                                                                 strip_attachments=(not server.attach),
+                                                                 context=context)
+                        except Exception:
+                            _logger.exception('Failed to process mail from %s server %s.', server.type, server.name)
+                            failed += 1
                         if res_id and server.action_id:
-                            action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", server.object_id.model)})
+                            action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids': [res_id], 'active_model': context.get("thread_model", server.object_id.model)})
                         pop_server.dele(num)
                         cr.commit()
-                    _logger.info("fetched/processed %s email(s) on %s server %s", numMsgs, server.type, server.name)
+                    _logger.info("Fetched %d email(s) on %s server %s; %d succeeded, %d failed.", numMsgs, server.type, server.name, (numMsgs - failed), failed)
                 except Exception:
-                    _logger.exception("Failed to fetch mail from %s server %s.", server.type, server.name)
+                    _logger.exception("General failure when trying to fetch mail from %s server %s.", server.type, server.name)
                 finally:
                     if pop_server:
                         pop_server.quit()