diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 89eb0ad..db88535 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -225,6 +225,8 @@ class Mailbox(models.Model): def process_incoming_message(self, message): """Process a message incoming to this mailbox.""" msg = self._process_message(message) + if msg is None: + return None msg.outgoing = False msg.save() @@ -235,6 +237,8 @@ class Mailbox(models.Model): def record_outgoing_message(self, message): """Record an outgoing message associated with this mailbox.""" msg = self._process_message(message) + if msg is None: + return None msg.outgoing = True msg.save() return msg @@ -363,7 +367,14 @@ class Mailbox(models.Model): ) msg.save() message = self._get_dehydrated_message(message, msg) - msg.set_body(message.as_string()) + try: + body = message.as_string() + except KeyError as exc: + # email.message.replace_header may raise 'KeyError' if the header + # 'content-transfer-encoding' is missing + logger.warning("Failed to parse message: %s", exc,) + return None + msg.set_body(body) if message['in-reply-to']: try: msg.in_reply_to = Message.objects.filter( @@ -382,7 +393,8 @@ class Mailbox(models.Model): return new_mail for message in connection.get_message(condition): msg = self.process_incoming_message(message) - new_mail.append(msg) + if not msg is None: + new_mail.append(msg) self.last_polling = now() if django.VERSION >= (1, 5): # Django 1.5 introduces update_fields self.save(update_fields=['last_polling'])