diff --git a/django_mailbox/admin.py b/django_mailbox/admin.py
index 52849ca..db39c26 100644
--- a/django_mailbox/admin.py
+++ b/django_mailbox/admin.py
@@ -8,25 +8,30 @@ from django_mailbox.signals import message_received
logger = logging.getLogger(__name__)
+
def get_new_mail(mailbox_admin, request, queryset):
for mailbox in queryset.all():
logger.debug('Receiving mail for %s' % mailbox)
mailbox.get_new_mail()
get_new_mail.short_description = 'Get new mail'
+
def resend_message_received_signal(message_admin, request, queryset):
for message in queryset.all():
logger.debug('Resending \'message_received\' signal for %s' % message)
message_received.send(sender=message_admin, message=message)
-resend_message_received_signal.short_description = 'Re-send message received signal'
+resend_message_received_signal.short_description = (
+ 'Re-send message received signal'
+)
+
class MailboxAdmin(admin.ModelAdmin):
list_display = (
- 'name',
- 'uri',
- 'from_email',
- 'active',
- )
+ 'name',
+ 'uri',
+ 'from_email',
+ 'active',
+ )
actions = [get_new_mail]
@@ -48,23 +53,23 @@ class MessageAdmin(admin.ModelAdmin):
MessageAttachmentInline,
]
list_display = (
- 'subject',
- 'processed',
- 'read',
- 'mailbox',
- 'outgoing',
- 'attachment_count',
- )
+ 'subject',
+ 'processed',
+ 'read',
+ 'mailbox',
+ 'outgoing',
+ 'attachment_count',
+ )
ordering = ['-processed']
list_filter = (
- 'mailbox',
- 'outgoing',
- 'processed',
- 'read',
- )
+ 'mailbox',
+ 'outgoing',
+ 'processed',
+ 'read',
+ )
raw_id_fields = (
- 'in_reply_to',
- )
+ 'in_reply_to',
+ )
exclude = (
'body',
)
diff --git a/django_mailbox/models.py b/django_mailbox/models.py
index af5f297..9e217b2 100755
--- a/django_mailbox/models.py
+++ b/django_mailbox/models.py
@@ -12,13 +12,13 @@ from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
from django.db import models
from django_mailbox.transports import Pop3Transport, ImapTransport,\
- MaildirTransport, MboxTransport, BabylTransport, MHTransport, \
- MMDFTransport
+ MaildirTransport, MboxTransport, BabylTransport, MHTransport, \
+ MMDFTransport
from django_mailbox.signals import message_received
SKIPPED_EXTENSIONS = getattr(
- settings,
- 'DJANGO_MAILBOX_SKIPPED_EXTENSIONS',
+ settings,
+ 'DJANGO_MAILBOX_SKIPPED_EXTENSIONS',
['.p7s']
)
STRIP_UNALLOWED_MIMETYPES = getattr(
@@ -40,59 +40,58 @@ ALTERED_MESSAGE_HEADER = getattr(
'X-Django-Mailbox-Altered-Message'
)
+
class ActiveMailboxManager(models.Manager):
def get_query_set(self):
return super(ActiveMailboxManager, self).get_query_set().filter(
active=True,
)
+
class Mailbox(models.Model):
name = models.CharField(max_length=255)
uri = models.CharField(
- max_length=255,
- help_text="""
- Example: imap+ssl://myusername:mypassword@someserver
-
-
- Internet transports include 'imap' and 'pop3'; common local file transports include 'maildir', 'mbox', and less commonly 'babyl', 'mh', and 'mmdf'.
-
-
- Be sure to urlencode your username and password should they
- contain illegal characters (like @, :, etc).
- """,
- blank=True,
- null=True,
- default=None,
- )
+ max_length=255,
+ help_text=(
+ "Example: imap+ssl://myusername:mypassword@someserver
"
+ "
"
+ "Internet transports include 'imap' and 'pop3'; "
+ "common local file transports include 'maildir', 'mbox', "
+ "and less commonly 'babyl', 'mh', and 'mmdf'.
"
+ "
"
+ "Be sure to urlencode your username and password should they "
+ "contain illegal characters (like @, :, etc)."
+ ),
+ blank=True,
+ null=True,
+ default=None,
+ )
from_email = models.CharField(
- max_length=255,
- help_text="""
- Example: MailBot <mailbot@yourdomain.com>
-
- 'From' header to set for outgoing email.
-
-
- If you do not use this e-mail inbox for outgoing mail, this
- setting is unnecessary.
-
- If you send e-mail without setting this, your 'From' header will
- be set to match the setting `DEFAULT_FROM_EMAIL`.
- """,
- blank=True,
- null=True,
- default=None,
- )
+ max_length=255,
+ help_text=(
+ "Example: MailBot <mailbot@yourdomain.com>
"
+ "'From' header to set for outgoing email.
"
+ "
"
+ "If you do not use this e-mail inbox for outgoing mail, this "
+ "setting is unnecessary.
"
+ "If you send e-mail without setting this, your 'From' header will'"
+ "be set to match the setting `DEFAULT_FROM_EMAIL`."
+ ),
+ blank=True,
+ null=True,
+ default=None,
+ )
active = models.BooleanField(
- help_text="""
- Check this e-mail inbox for new e-mail messages during polling
- cycles. This checkbox does not have an effect upon whether
- mail is collected here when this mailbox receives mail from a
- pipe, and does not affect whether e-mail messages can be
- dispatched from this mailbox.
- """,
- blank=True,
- default=True,
- )
+ help_text=(
+ "Check this e-mail inbox for new e-mail messages during polling "
+ "cycles. This checkbox does not have an effect upon whether "
+ "mail is collected here when this mailbox receives mail from a "
+ "pipe, and does not affect whether e-mail messages can be "
+ "dispatched from this mailbox. "
+ ),
+ blank=True,
+ default=True,
+ )
objects = models.Manager()
active_mailboxes = ActiveMailboxManager()
@@ -137,17 +136,17 @@ class Mailbox(models.Model):
return None
elif self.type == 'imap':
conn = ImapTransport(
- self.location,
- port=self.port if self.port else None,
- ssl=self.use_ssl
- )
+ self.location,
+ port=self.port if self.port else None,
+ ssl=self.use_ssl
+ )
conn.connect(self.username, self.password)
elif self.type == 'pop3':
conn = Pop3Transport(
- self.location,
- port=self.port if self.port else None,
- ssl=self.use_ssl
- )
+ self.location,
+ port=self.port if self.port else None,
+ ssl=self.use_ssl
+ )
conn.connect(self.username, self.password)
elif self.type == 'maildir':
conn = MaildirTransport(self.location)
@@ -207,7 +206,9 @@ class Mailbox(models.Model):
msg.body = message.as_string()
if message['in-reply-to']:
try:
- msg.in_reply_to = Message.objects.filter(message_id=message['in-reply-to'])[0]
+ msg.in_reply_to = Message.objects.filter(
+ message_id=message['in-reply-to']
+ )[0]
except IndexError:
pass
msg.save()
@@ -219,13 +220,17 @@ class Mailbox(models.Model):
continue
filename = part.get_filename()
# ignore SMIME extension
- filename_basename, filename_extension = os.path.splitext(filename)
+ filename_basename, filename_extension = os.path.splitext(
+ filename
+ )
buffer_space = 40
if len(filename) > 100 - buffer_space:
- # Ensure that there're at least a few chars available afterward
- # for duplication things like _1, _2 ... _99 and the FileField's
- # upload_to path.
- filename_basename = filename_basename[0:100-len(filename_extension)-buffer_space]
+ # Ensure that there're at least a few chars available
+ # afterward for duplication things like _1, _2 ... _99 and
+ # the FileField's upload_to path.
+ filename_basename = filename_basename[
+ 0:100-len(filename_extension)-buffer_space
+ ]
filename = filename_basename + filename_extension
if filename_extension in SKIPPED_EXTENSIONS:
continue
@@ -257,30 +262,34 @@ class Mailbox(models.Model):
class Meta:
verbose_name_plural = "Mailboxes"
+
class IncomingMessageManager(models.Manager):
def get_query_set(self):
return super(IncomingMessageManager, self).get_query_set().filter(
outgoing=False,
)
+
class OutgoingMessageManager(models.Manager):
def get_query_set(self):
return super(OutgoingMessageManager, self).get_query_set().filter(
outgoing=True,
)
+
class UnreadMessageManager(models.Manager):
def get_query_set(self):
return super(UnreadMessageManager, self).get_query_set().filter(
read=None
)
+
class Message(models.Model):
mailbox = models.ForeignKey(Mailbox, related_name='messages')
subject = models.CharField(max_length=255)
message_id = models.CharField(max_length=255)
in_reply_to = models.ForeignKey(
- 'django_mailbox.Message',
+ 'django_mailbox.Message',
related_name='replies',
blank=True,
null=True,
@@ -313,13 +322,13 @@ class Message(models.Model):
@property
def address(self):
"""Property allowing one to get the relevant address(es).
-
+
In earlier versions of this library, the model had an `address` field
storing the e-mail address from which a message was received. During
later refactorings, it became clear that perhaps storing sent messages
would also be useful, so the address field was replaced with two
separate fields.
-
+
"""
if self.outgoing:
return self.to_addresses()
@@ -335,15 +344,15 @@ class Message(models.Model):
addresses = []
for address in self.to_header.split(','):
addresses.append(
- rfc822.parseaddr(
- address
- )[1]
- )
+ rfc822.parseaddr(
+ address
+ )[1]
+ )
return addresses
def reply(self, message):
"""Sends a message as a reply to this message instance.
-
+
Although Django's e-mail processing will set both Message-ID
and Date upon generating the e-mail message, we will not be able
to retrieve that information through normal channels, so we must
@@ -359,10 +368,10 @@ class Message(models.Model):
message.extra_headers['In-Reply-To'] = self.message_id
message.send()
return self.mailbox.record_outgoing_message(
- email.message_from_string(
- message.message().as_string()
- )
+ email.message_from_string(
+ message.message().as_string()
)
+ )
@property
def text(self):
@@ -373,7 +382,8 @@ class Message(models.Model):
body = ''
if message.is_multipart():
for part in message.get_payload():
- if part.get('content-type', '').split(';')[0] == 'text/plain':
+ mime_type = part.get('content-type', '').split(';')[0]
+ if mime_type == 'text/plain':
body = body + get_body_from_message(part)
else:
body = body + message.get_payload()
diff --git a/django_mailbox/tests/__init__.py b/django_mailbox/tests/__init__.py
index f00bdb2..83d18d1 100644
--- a/django_mailbox/tests/__init__.py
+++ b/django_mailbox/tests/__init__.py
@@ -1,14 +1,13 @@
import email
import os.path
-import shutil
-from django.db import models
from django.test import TestCase
import mimic
import django_mailbox
from django_mailbox.models import Mailbox, Message
+
class EmailMessageTestCase(TestCase):
def setUp(self):
super(EmailMessageTestCase, self).setUp()
@@ -26,6 +25,7 @@ class EmailMessageTestCase(TestCase):
self.mimic.verify_all()
+
class TestProcessEmail(EmailMessageTestCase):
def test_message_without_attachments(self):
message = self._get_email_object('generic_message.eml')
@@ -39,7 +39,7 @@ class TestProcessEmail(EmailMessageTestCase):
)
self.assertEqual(msg.subject, 'Message Without Attachment')
self.assertEqual(
- msg.message_id,
+ msg.message_id,
''
)
self.assertEqual(
@@ -85,6 +85,7 @@ class TestProcessEmail(EmailMessageTestCase):
actual_results,
)
+
class TestFilterMessageBody(EmailMessageTestCase):
def setUp(self):
django_mailbox.models.STRIP_UNALLOWED_MIMETYPES = True
@@ -131,6 +132,7 @@ class TestFilterMessageBody(EmailMessageTestCase):
mailbox._filter_message_body(message).as_string()
)
+
class TestGetMessage(EmailMessageTestCase):
def test_get_text_body_properly_recomposes_line_continuations(self):
message = Message()
diff --git a/django_mailbox/transports/babyl.py b/django_mailbox/transports/babyl.py
index 674aa2e..eb888a6 100644
--- a/django_mailbox/transports/babyl.py
+++ b/django_mailbox/transports/babyl.py
@@ -1,5 +1,6 @@
from mailbox import Babyl
from django_mailbox.transports.generic import GenericFileMailbox
+
class BabylTransport(GenericFileMailbox):
_variant = Babyl
diff --git a/django_mailbox/transports/imap.py b/django_mailbox/transports/imap.py
index 1c57b1c..6317857 100644
--- a/django_mailbox/transports/imap.py
+++ b/django_mailbox/transports/imap.py
@@ -1,6 +1,7 @@
import email
from imaplib import IMAP4, IMAP4_SSL
+
class ImapTransport(object):
def __init__(self, hostname, port=None, ssl=False):
self.hostname = hostname
@@ -28,6 +29,6 @@ class ImapTransport(object):
yield message
except email.Errors.MessageParseError:
continue
- self.server.store(key, "+FLAGS", "\\Deleted");
+ self.server.store(key, "+FLAGS", "\\Deleted")
self.server.expunge()
return
diff --git a/django_mailbox/transports/maildir.py b/django_mailbox/transports/maildir.py
index 17f7511..2d4af53 100644
--- a/django_mailbox/transports/maildir.py
+++ b/django_mailbox/transports/maildir.py
@@ -1,6 +1,7 @@
from mailbox import Maildir
from django_mailbox.transports.generic import GenericFileMailbox
+
class MaildirTransport(GenericFileMailbox):
_variant = Maildir
diff --git a/django_mailbox/transports/mbox.py b/django_mailbox/transports/mbox.py
index 708bb33..d610deb 100644
--- a/django_mailbox/transports/mbox.py
+++ b/django_mailbox/transports/mbox.py
@@ -1,5 +1,6 @@
from mailbox import mbox
from django_mailbox.transports.generic import GenericFileMailbox
+
class MboxTransport(GenericFileMailbox):
_variant = mbox
diff --git a/django_mailbox/transports/mh.py b/django_mailbox/transports/mh.py
index 574ccf3..33fdc25 100644
--- a/django_mailbox/transports/mh.py
+++ b/django_mailbox/transports/mh.py
@@ -1,5 +1,6 @@
from mailbox import MH
from django_mailbox.transports.generic import GenericFileMailbox
+
class MHTransport(GenericFileMailbox):
_variant = MH
diff --git a/django_mailbox/transports/mmdf.py b/django_mailbox/transports/mmdf.py
index ad46284..270e4f3 100644
--- a/django_mailbox/transports/mmdf.py
+++ b/django_mailbox/transports/mmdf.py
@@ -1,5 +1,6 @@
from mailbox import MMDF
from django_mailbox.transports.generic import GenericFileMailbox
+
class MMDFTransport(GenericFileMailbox):
_variant = MMDF
diff --git a/django_mailbox/transports/pop3.py b/django_mailbox/transports/pop3.py
index b6943ae..652fbe7 100644
--- a/django_mailbox/transports/pop3.py
+++ b/django_mailbox/transports/pop3.py
@@ -1,6 +1,7 @@
import email
from poplib import POP3, POP3_SSL
+
class Pop3Transport(object):
def __init__(self, hostname, port=None, ssl=False):
self.hostname = hostname