forked from mirror/django-mailbox
Merge pull request #230 from rmlt/fix_message_rfc822_attachments__based_on_master
Fix message/rfc822 attachment processing
This commit is contained in:
commit
997bed0164
3 changed files with 99 additions and 2 deletions
|
|
@ -298,7 +298,10 @@ class Mailbox(models.Model):
|
||||||
settings = utils.get_settings()
|
settings = utils.get_settings()
|
||||||
|
|
||||||
new = EmailMessage()
|
new = EmailMessage()
|
||||||
if msg.is_multipart():
|
if (
|
||||||
|
msg.is_multipart()
|
||||||
|
and not 'attachment' in msg.get('Content-Disposition', '')
|
||||||
|
):
|
||||||
for header, value in msg.items():
|
for header, value in msg.items():
|
||||||
new[header] = value
|
new[header] = value
|
||||||
for part in msg.get_payload():
|
for part in msg.get_payload():
|
||||||
|
|
@ -339,11 +342,21 @@ class Mailbox(models.Model):
|
||||||
|
|
||||||
attachment = MessageAttachment()
|
attachment = MessageAttachment()
|
||||||
|
|
||||||
|
if msg.get_content_type() == 'message/rfc822':
|
||||||
|
attachment_payloads = msg.get_payload()
|
||||||
|
if len(attachment_payloads) != 1:
|
||||||
|
raise AssertionError(
|
||||||
|
"Attachment of type 'message/rfc822' "
|
||||||
|
'must have exactly 1 payload.'
|
||||||
|
)
|
||||||
|
attachment_payload = attachment_payloads[0].as_bytes()
|
||||||
|
else:
|
||||||
|
attachment_payload = msg.get_payload(decode=True)
|
||||||
attachment.document.save(
|
attachment.document.save(
|
||||||
uuid.uuid4().hex + extension,
|
uuid.uuid4().hex + extension,
|
||||||
ContentFile(
|
ContentFile(
|
||||||
BytesIO(
|
BytesIO(
|
||||||
msg.get_payload(decode=True)
|
attachment_payload
|
||||||
).getvalue()
|
).getvalue()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -832,6 +845,11 @@ class MessageAttachment(models.Model):
|
||||||
return email.message_from_string(headers)
|
return email.message_from_string(headers)
|
||||||
|
|
||||||
def _set_dehydrated_headers(self, email_object):
|
def _set_dehydrated_headers(self, email_object):
|
||||||
|
if email_object._payload is None:
|
||||||
|
# otherwise it breaks in
|
||||||
|
# lib/python3.x/email/generator.py:_handle_message,
|
||||||
|
# line: "self._fp.write(payload)"
|
||||||
|
email_object._payload = ""
|
||||||
self.headers = email_object.as_string()
|
self.headers = email_object.as_string()
|
||||||
|
|
||||||
def __delitem__(self, name):
|
def __delitem__(self, name):
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
From: Adam Coddington <test@adamcoddington.net>
|
||||||
|
To: Adam Coddington <test@adamcoddington.net>
|
||||||
|
Subject: Email with RFC 822 attachment
|
||||||
|
Date: Fri, 15 May 2020 11:15:00 +0000
|
||||||
|
Message-ID: <ce1f843c1a2d4de7a0c7c78c84a50f8d@adamcoddington.net>
|
||||||
|
Content-Type: multipart/mixed;
|
||||||
|
boundary="_004_ce1f843c1a2d4de7a0c7c78c84a50f8dadamcoddington.net_"
|
||||||
|
Return-Path: test@adamcoddington.net
|
||||||
|
MIME-Version: 1.0
|
||||||
|
|
||||||
|
--_004_ce1f843c1a2d4de7a0c7c78c84a50f8dadamcoddington.net_
|
||||||
|
Content-Type: multipart/alternative;
|
||||||
|
boundary="_000_ce1f843c1a2d4de7a0c7c78c84a50f8dadamcoddington.net_"
|
||||||
|
|
||||||
|
--_000_ce1f843c1a2d4de7a0c7c78c84a50f8dadamcoddington.net_
|
||||||
|
Content-Type: text/plain; charset="iso-8859-1"
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
|
||||||
|
Dear Sir or Madam,
|
||||||
|
|
||||||
|
I am sending you an email message as an attachment.
|
||||||
|
|
||||||
|
|
||||||
|
--_000_ce1f843c1a2d4de7a0c7c78c84a50f8dadamcoddington.net_
|
||||||
|
Content-Type: text/html; charset="iso-8859-1"
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
|
||||||
|
<html xmlns=3D"http://www.w3.org/TR/REC-html40">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Diso-8859-=
|
||||||
|
1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<p>Dear Sir or Madam,</p>
|
||||||
|
<p>I am sending you an email message as an attachment.</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
--_000_ce1f843c1a2d4de7a0c7c78c84a50f8dadamcoddington.net_--
|
||||||
|
|
||||||
|
--_004_ce1f843c1a2d4de7a0c7c78c84a50f8dadamcoddington.net_
|
||||||
|
Content-Type: message/rfc822
|
||||||
|
Content-Disposition: attachment;
|
||||||
|
creation-date="Fri, 15 May 2020 11:10:00 GMT";
|
||||||
|
modification-date="Fri, 15 May 2020 11:10:00 GMT"
|
||||||
|
|
||||||
|
From: Adam Coddington <test@adamcoddington.net>
|
||||||
|
To: Adam Coddington <test@adamcoddington.net>
|
||||||
|
Subject: Attached email
|
||||||
|
Date: Fri, 15 May 2020 09:00:00 +0000
|
||||||
|
Message-ID: <ujURpHHC.xh4Qpg28.RLQSSkBK.cQSyhEG5.PmxCEEdV@127.0.0.1>
|
||||||
|
Content-Type: text/plain; charset="iso-8859-1"
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
MIME-Version: 1.0
|
||||||
|
|
||||||
|
Hello!
|
||||||
|
|
||||||
|
This is the attached email.
|
||||||
|
|
||||||
|
--_004_ce1f843c1a2d4de7a0c7c78c84a50f8dadamcoddington.net_--
|
||||||
|
|
@ -87,6 +87,23 @@ class TestProcessEmail(EmailMessageTestCase):
|
||||||
'heart.png',
|
'heart.png',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_message_with_rfc822_attachment(self):
|
||||||
|
message = self._get_email_object('message_with_rfc822_attachment.eml')
|
||||||
|
|
||||||
|
mailbox = Mailbox.objects.create()
|
||||||
|
msg = mailbox.process_incoming_message(message)
|
||||||
|
|
||||||
|
expected_count = 1
|
||||||
|
actual_count = msg.attachments.count()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
expected_count,
|
||||||
|
actual_count,
|
||||||
|
)
|
||||||
|
|
||||||
|
attachment = msg.attachments.all()[0]
|
||||||
|
self.assertIsNone(attachment.get_filename())
|
||||||
|
|
||||||
def test_message_with_utf8_attachment_header(self):
|
def test_message_with_utf8_attachment_header(self):
|
||||||
""" Ensure that we properly handle UTF-8 encoded attachment
|
""" Ensure that we properly handle UTF-8 encoded attachment
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue