diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 0ef088b..e7e9aef 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -387,7 +387,7 @@ class Mailbox(models.Model): msg.save() return msg - def get_new_mail(self): + def get_new_mail(self, condition=None): """Connect to this transport and fetch new messages.""" new_mail = [] connection = self.get_connection() diff --git a/django_mailbox/tests/base.py b/django_mailbox/tests/base.py index 3634c9a..621152f 100644 --- a/django_mailbox/tests/base.py +++ b/django_mailbox/tests/base.py @@ -55,12 +55,12 @@ class EmailMessageTestCase(TestCase): settings.EMAIL_USE_TLS = True super(EmailMessageTestCase, self).setUp() - def _get_new_messages(self, mailbox): + def _get_new_messages(self, mailbox, condition=None): maximum_wait = time.time() + self.maximum_wait_seconds while True: if time.time() > maximum_wait: raise EmailIntegrationTimeout() - messages = self.mailbox.get_new_mail() + messages = self.mailbox.get_new_mail(condition) if messages: return messages time.sleep(5) diff --git a/django_mailbox/tests/test_integration_imap.py b/django_mailbox/tests/test_integration_imap.py index 1dbee05..961cce9 100644 --- a/django_mailbox/tests/test_integration_imap.py +++ b/django_mailbox/tests/test_integration_imap.py @@ -24,12 +24,6 @@ class TestImap(EmailMessageTestCase): uri=self.get_connection_string() ) self.arbitrary_identifier = str(uuid.uuid4()) - settings.DJANGO_MAILBOX_INTEGRATION_TESTING_SUBJECT = ( - self.arbitrary_identifier - ) - - def tearDown(self): - settings.DJANGO_MAILBOX_INTEGRATION_TESTING_SUBJECT = None def get_connection_string(self): return "imap+ssl://{account}:{password}@{server}".format( @@ -50,7 +44,10 @@ class TestImap(EmailMessageTestCase): ) msg.send() - messages = self._get_new_messages(self.mailbox) + messages = self._get_new_messages( + self.mailbox, + condition=lambda m: m['subject'] == self.arbitrary_identifier + ) self.assertEqual(1, len(messages)) self.assertEqual(messages[0].subject, self.arbitrary_identifier) diff --git a/django_mailbox/transports/generic.py b/django_mailbox/transports/generic.py index cf4bd78..2e1f979 100644 --- a/django_mailbox/transports/generic.py +++ b/django_mailbox/transports/generic.py @@ -16,10 +16,12 @@ class GenericFileMailbox(EmailTransport): def get_instance(self): return self._variant(self._path) - def get_message(self): + def get_message(self, condition=None): repository = self.get_instance() repository.lock() for key, message in repository.items(): + if condition and not condition(message): + continue repository.remove(key) yield message repository.unlock() diff --git a/django_mailbox/transports/imap.py b/django_mailbox/transports/imap.py index 2ca39b2..cef3eb4 100644 --- a/django_mailbox/transports/imap.py +++ b/django_mailbox/transports/imap.py @@ -82,7 +82,7 @@ class ImapTransport(EmailTransport): pass return safe_message_ids - def get_message(self): + def get_message(self, condition=None): message_ids = self._get_all_message_ids() if not message_ids: @@ -105,10 +105,7 @@ class ImapTransport(EmailTransport): continue message = self.get_email_from_bytes(msg_contents[0][1]) - if ( - self.integration_testing_subject and - message['Subject'] != self.integration_testing_subject - ): + if condition and not condition(message): continue yield message diff --git a/django_mailbox/transports/pop3.py b/django_mailbox/transports/pop3.py index 8520557..4601114 100644 --- a/django_mailbox/transports/pop3.py +++ b/django_mailbox/transports/pop3.py @@ -28,7 +28,7 @@ class Pop3Transport(EmailTransport): return six.binary_type('\r\n', 'ascii').join(message_lines) return '\r\n'.join(message_lines) - def get_message(self): + def get_message(self, condition=None): message_count = len(self.server.list()[1]) for i in range(message_count): try: @@ -36,6 +36,10 @@ class Pop3Transport(EmailTransport): self.server.retr(i + 1)[1] ) message = self.get_email_from_bytes(msg_contents) + + if condition and not condition(message): + continue + yield message except MessageParseError: continue