1
0
Fork 0

Fix handling of missing 'content-transfer-encoding' header

Closes: #136

Python's email module raises a KeyError if the header
'content-transfer-encoding' is missing:
  https://bugs.python.org/issue27321
This commit is contained in:
Lars Kruse 2017-05-09 23:28:19 +02:00
parent ce6ce6b5dd
commit e4a8a05f3d

View file

@ -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'])