From 24138d1dc7af8c964946815ab9634b3d336026c2 Mon Sep 17 00:00:00 2001 From: Adam Dobrawy Date: Sat, 14 Mar 2015 18:23:19 +0100 Subject: [PATCH 1/6] During reply update from_email only if not set --- django_mailbox/models.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 0329322..7e93c14 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -498,10 +498,11 @@ class Message(models.Model): pre-set it. """ - if self.mailbox.from_email: - message.from_email = self.mailbox.from_email - else: - message.from_email = settings.DEFAULT_FROM_EMAIL + if not getattr(message, 'from_email', None): + if self.mailbox.from_email: + message.from_email = self.mailbox.from_email + else: + message.from_email = settings.DEFAULT_FROM_EMAIL message.extra_headers['Message-ID'] = make_msgid() message.extra_headers['Date'] = formatdate() message.extra_headers['In-Reply-To'] = self.message_id From 552e0336559eb114fe91de2160edc53dee4dbde2 Mon Sep 17 00:00:00 2001 From: Adam Dobrawy Date: Sun, 15 Mar 2015 00:42:57 +0100 Subject: [PATCH 2/6] Added test django_mailbox.tests.test_process_email.TestProcessEmail.test_message_reply --- django_mailbox/tests/base.py | 3 ++- django_mailbox/tests/test_process_email.py | 30 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/django_mailbox/tests/base.py b/django_mailbox/tests/base.py index 72c3249..87ec88a 100644 --- a/django_mailbox/tests/base.py +++ b/django_mailbox/tests/base.py @@ -19,6 +19,7 @@ def get_email_as_text(name): ) as f: return f.read() + class EmailMessageTestCase(TestCase): ALLOWED_EXTRA_HEADERS = [ 'MIME-Version', @@ -30,7 +31,7 @@ class EmailMessageTestCase(TestCase): self._STRIP_UNALLOWED_MIMETYPES = models.STRIP_UNALLOWED_MIMETYPES self._TEXT_STORED_MIMETYPES = models.TEXT_STORED_MIMETYPES - self.mailbox = Mailbox.objects.create() + self.mailbox = Mailbox.objects.create(from_email='from@example.com') super(EmailMessageTestCase, self).setUp() def _get_email_as_text(self, name): diff --git a/django_mailbox/tests/test_process_email.py b/django_mailbox/tests/test_process_email.py index c1c0955..d00cf05 100644 --- a/django_mailbox/tests/test_process_email.py +++ b/django_mailbox/tests/test_process_email.py @@ -5,6 +5,7 @@ import six from django_mailbox.models import Mailbox, Message from django_mailbox.tests.base import EmailMessageTestCase +from django.core.mail import EmailMessage __all__ = ['TestProcessEmail'] @@ -200,3 +201,32 @@ class TestProcessEmail(EmailMessageTestCase): actual_from = msg.from_header self.assertEqual(expected_from, actual_from) + + def test_message_reply(self): + email_object = EmailMessage('Test subject', # subject + 'Test body', # body + 'username@example.com', # from + ['mr.test32@mail.ru'], # to + ) + msg = self.mailbox.record_outgoing_message(email_object.message()) + + self.assertEqual(msg.outgoing, True) + + actual_from = 'username@example.com' + reply_email_object = EmailMessage('Test subject', # subject + 'Test body', # body + actual_from, # from + ['mr.test32@mail.ru'], # to + ) + + reply_msg = msg.reply(reply_email_object) + + self.assertEqual(reply_msg.in_reply_to, msg) + + self.assertEqual(actual_from, msg.from_header) + + reply_email_object.from_email = None + + second_reply_msg = msg.reply(reply_email_object) + + self.assertEqual(self.mailbox.from_email, second_reply_msg.from_header) From 42d891bd8d1ff6e71eeac1909449432c3fff008b Mon Sep 17 00:00:00 2001 From: Adam Dobrawy Date: Sun, 15 Mar 2015 02:16:27 +0100 Subject: [PATCH 3/6] Added storing original message in file --- .../migrations/0002_add_eml_to_message.py | 20 +++++++++++++++++++ django_mailbox/models.py | 16 ++++++++++++++- docs/topics/appendix/settings.rst | 4 ++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 django_mailbox/migrations/0002_add_eml_to_message.py diff --git a/django_mailbox/migrations/0002_add_eml_to_message.py b/django_mailbox/migrations/0002_add_eml_to_message.py new file mode 100644 index 0000000..c7a5f91 --- /dev/null +++ b/django_mailbox/migrations/0002_add_eml_to_message.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_mailbox', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='message', + name='eml', + field=models.FileField(help_text='Original full content of message', upload_to=b'', null=True, verbose_name='Message as a file'), + preserve_default=True, + ), + ] diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 7e93c14..3318e7a 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -32,7 +32,6 @@ from django_mailbox.transports import Pop3Transport, ImapTransport, \ MaildirTransport, MboxTransport, BabylTransport, MHTransport, \ MMDFTransport, GmailImapTransport - logger = logging.getLogger(__name__) @@ -72,6 +71,12 @@ ATTACHMENT_INTERPOLATION_HEADER = getattr( 'X-Django-Mailbox-Interpolate-Attachment' ) +STORE_ORIGINAL_MESSAGE = getattr( + settings, + 'DJANGO_MAILBOX_STORE_ORIGINAL_MESSAGE', + False +) + class ActiveMailboxManager(models.Manager): def get_queryset(self): @@ -326,6 +331,8 @@ class Mailbox(models.Model): def _process_message(self, message): msg = Message() + if STORE_ORIGINAL_MESSAGE: + msg.eml.save('message.eml', ContentFile(message), save=False) msg.mailbox = self if 'subject' in message: msg.subject = convert_header_to_unicode(message['subject'])[0:255] @@ -450,6 +457,11 @@ class Message(models.Model): null=True, ) + eml = models.FileField( + _(u'Message as a file'), + null=True, + help_text=_(u'Original full content of message') + ) objects = models.Manager() unread_messages = UnreadMessageManager() incoming_messages = IncomingMessageManager() @@ -599,6 +611,8 @@ class Message(models.Model): def get_email_object(self): """ Returns an `email.message.Message` instance for this message.""" + if self.eml: + return email.message_from_file(Message.objects.last().eml) body = self.get_body() if six.PY3: flat = email.message_from_bytes(body) diff --git a/docs/topics/appendix/settings.rst b/docs/topics/appendix/settings.rst index 290e884..7a2e573 100644 --- a/docs/topics/appendix/settings.rst +++ b/docs/topics/appendix/settings.rst @@ -66,3 +66,7 @@ Settings * If this is set, it will be read as a number of bytes. Any messages above that size will not be downloaded. ``2000000`` is 2 Megabytes. +* ``DJANGO_MAILBOX_STORE_ORIGINAL_MESSAGE`` + * Default: ``False`` + * Type: ``boolean`` + * Controls whether or not we store original messages in ``eml`` field From 835986c96a7f893792f6d3658a5bef4fa4fe42ae Mon Sep 17 00:00:00 2001 From: Adam Dobrawy Date: Wed, 18 Mar 2015 09:56:52 +0100 Subject: [PATCH 4/6] Added random eml file name, removed getattr related to self.mailbox.from_email in Message.reply, fix docs - second round of pull requests --- django_mailbox/models.py | 7 ++++--- django_mailbox/tests/test_process_email.py | 2 +- docs/topics/appendix/settings.rst | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 3318e7a..7f05b98 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -332,7 +332,7 @@ class Mailbox(models.Model): def _process_message(self, message): msg = Message() if STORE_ORIGINAL_MESSAGE: - msg.eml.save('message.eml', ContentFile(message), save=False) + msg.eml.save('%s.eml' % uuid.uuid4(), ContentFile(message), save=False) msg.mailbox = self if 'subject' in message: msg.subject = convert_header_to_unicode(message['subject'])[0:255] @@ -460,6 +460,7 @@ class Message(models.Model): eml = models.FileField( _(u'Message as a file'), null=True, + upload_to="messages", help_text=_(u'Original full content of message') ) objects = models.Manager() @@ -510,7 +511,7 @@ class Message(models.Model): pre-set it. """ - if not getattr(message, 'from_email', None): + if not self.from_email: if self.mailbox.from_email: message.from_email = self.mailbox.from_email else: @@ -612,7 +613,7 @@ class Message(models.Model): def get_email_object(self): """ Returns an `email.message.Message` instance for this message.""" if self.eml: - return email.message_from_file(Message.objects.last().eml) + return email.message_from_file(self.eml) body = self.get_body() if six.PY3: flat = email.message_from_bytes(body) diff --git a/django_mailbox/tests/test_process_email.py b/django_mailbox/tests/test_process_email.py index d00cf05..320dcdd 100644 --- a/django_mailbox/tests/test_process_email.py +++ b/django_mailbox/tests/test_process_email.py @@ -210,7 +210,7 @@ class TestProcessEmail(EmailMessageTestCase): ) msg = self.mailbox.record_outgoing_message(email_object.message()) - self.assertEqual(msg.outgoing, True) + self.assertTrue(msg.outgoing) actual_from = 'username@example.com' reply_email_object = EmailMessage('Test subject', # subject diff --git a/docs/topics/appendix/settings.rst b/docs/topics/appendix/settings.rst index 7a2e573..13fdde6 100644 --- a/docs/topics/appendix/settings.rst +++ b/docs/topics/appendix/settings.rst @@ -66,6 +66,7 @@ Settings * If this is set, it will be read as a number of bytes. Any messages above that size will not be downloaded. ``2000000`` is 2 Megabytes. + * ``DJANGO_MAILBOX_STORE_ORIGINAL_MESSAGE`` * Default: ``False`` * Type: ``boolean`` From 2b40c9efd00f5e512621d5cce7b00f912889603b Mon Sep 17 00:00:00 2001 From: Adam Dobrawy Date: Wed, 18 Mar 2015 10:11:34 +0100 Subject: [PATCH 5/6] Fix typo in Message.reply --- django_mailbox/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 7f05b98..e549841 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -511,7 +511,7 @@ class Message(models.Model): pre-set it. """ - if not self.from_email: + if not message.from_email: if self.mailbox.from_email: message.from_email = self.mailbox.from_email else: From 9a5e5f1dd99eea0d8e1b624a80a34ebf79e9c203 Mon Sep 17 00:00:00 2001 From: Adam Dobrawy Date: Sat, 21 Mar 2015 11:38:57 +0100 Subject: [PATCH 6/6] Added upload_to in eml field in migration --- django_mailbox/migrations/0002_add_eml_to_message.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_mailbox/migrations/0002_add_eml_to_message.py b/django_mailbox/migrations/0002_add_eml_to_message.py index c7a5f91..a78cfb4 100644 --- a/django_mailbox/migrations/0002_add_eml_to_message.py +++ b/django_mailbox/migrations/0002_add_eml_to_message.py @@ -14,7 +14,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='message', name='eml', - field=models.FileField(help_text='Original full content of message', upload_to=b'', null=True, verbose_name='Message as a file'), + field=models.FileField(help_text='Original full content of message', upload_to=b'messages', null=True, verbose_name='Message as a file'), preserve_default=True, ), ]