mirror of
https://github.com/coddingtonbear/django-mailbox.git
synced 2026-07-09 22:38:19 +02:00
PEP-8 Cleanup.
This commit is contained in:
parent
9f77c9221a
commit
9cdb2d9d1b
10 changed files with 120 additions and 96 deletions
|
|
@ -8,25 +8,30 @@ from django_mailbox.signals import message_received
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def get_new_mail(mailbox_admin, request, queryset):
|
def get_new_mail(mailbox_admin, request, queryset):
|
||||||
for mailbox in queryset.all():
|
for mailbox in queryset.all():
|
||||||
logger.debug('Receiving mail for %s' % mailbox)
|
logger.debug('Receiving mail for %s' % mailbox)
|
||||||
mailbox.get_new_mail()
|
mailbox.get_new_mail()
|
||||||
get_new_mail.short_description = 'Get new mail'
|
get_new_mail.short_description = 'Get new mail'
|
||||||
|
|
||||||
|
|
||||||
def resend_message_received_signal(message_admin, request, queryset):
|
def resend_message_received_signal(message_admin, request, queryset):
|
||||||
for message in queryset.all():
|
for message in queryset.all():
|
||||||
logger.debug('Resending \'message_received\' signal for %s' % message)
|
logger.debug('Resending \'message_received\' signal for %s' % message)
|
||||||
message_received.send(sender=message_admin, message=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):
|
class MailboxAdmin(admin.ModelAdmin):
|
||||||
list_display = (
|
list_display = (
|
||||||
'name',
|
'name',
|
||||||
'uri',
|
'uri',
|
||||||
'from_email',
|
'from_email',
|
||||||
'active',
|
'active',
|
||||||
)
|
)
|
||||||
actions = [get_new_mail]
|
actions = [get_new_mail]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -48,23 +53,23 @@ class MessageAdmin(admin.ModelAdmin):
|
||||||
MessageAttachmentInline,
|
MessageAttachmentInline,
|
||||||
]
|
]
|
||||||
list_display = (
|
list_display = (
|
||||||
'subject',
|
'subject',
|
||||||
'processed',
|
'processed',
|
||||||
'read',
|
'read',
|
||||||
'mailbox',
|
'mailbox',
|
||||||
'outgoing',
|
'outgoing',
|
||||||
'attachment_count',
|
'attachment_count',
|
||||||
)
|
)
|
||||||
ordering = ['-processed']
|
ordering = ['-processed']
|
||||||
list_filter = (
|
list_filter = (
|
||||||
'mailbox',
|
'mailbox',
|
||||||
'outgoing',
|
'outgoing',
|
||||||
'processed',
|
'processed',
|
||||||
'read',
|
'read',
|
||||||
)
|
)
|
||||||
raw_id_fields = (
|
raw_id_fields = (
|
||||||
'in_reply_to',
|
'in_reply_to',
|
||||||
)
|
)
|
||||||
exclude = (
|
exclude = (
|
||||||
'body',
|
'body',
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ from django.core.files import File
|
||||||
from django.core.files.temp import NamedTemporaryFile
|
from django.core.files.temp import NamedTemporaryFile
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django_mailbox.transports import Pop3Transport, ImapTransport,\
|
from django_mailbox.transports import Pop3Transport, ImapTransport,\
|
||||||
MaildirTransport, MboxTransport, BabylTransport, MHTransport, \
|
MaildirTransport, MboxTransport, BabylTransport, MHTransport, \
|
||||||
MMDFTransport
|
MMDFTransport
|
||||||
from django_mailbox.signals import message_received
|
from django_mailbox.signals import message_received
|
||||||
|
|
||||||
SKIPPED_EXTENSIONS = getattr(
|
SKIPPED_EXTENSIONS = getattr(
|
||||||
|
|
@ -40,59 +40,58 @@ ALTERED_MESSAGE_HEADER = getattr(
|
||||||
'X-Django-Mailbox-Altered-Message'
|
'X-Django-Mailbox-Altered-Message'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class ActiveMailboxManager(models.Manager):
|
class ActiveMailboxManager(models.Manager):
|
||||||
def get_query_set(self):
|
def get_query_set(self):
|
||||||
return super(ActiveMailboxManager, self).get_query_set().filter(
|
return super(ActiveMailboxManager, self).get_query_set().filter(
|
||||||
active=True,
|
active=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class Mailbox(models.Model):
|
class Mailbox(models.Model):
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
uri = models.CharField(
|
uri = models.CharField(
|
||||||
max_length=255,
|
max_length=255,
|
||||||
help_text="""
|
help_text=(
|
||||||
Example: imap+ssl://myusername:mypassword@someserver
|
"Example: imap+ssl://myusername:mypassword@someserver <br />"
|
||||||
<br />
|
"<br />"
|
||||||
<br />
|
"Internet transports include 'imap' and 'pop3'; "
|
||||||
Internet transports include 'imap' and 'pop3'; common local file transports include 'maildir', 'mbox', and less commonly 'babyl', 'mh', and 'mmdf'.
|
"common local file transports include 'maildir', 'mbox', "
|
||||||
<br />
|
"and less commonly 'babyl', 'mh', and 'mmdf'. <br />"
|
||||||
<br />
|
"<br />"
|
||||||
Be sure to urlencode your username and password should they
|
"Be sure to urlencode your username and password should they "
|
||||||
contain illegal characters (like @, :, etc).
|
"contain illegal characters (like @, :, etc)."
|
||||||
""",
|
),
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
default=None,
|
default=None,
|
||||||
)
|
)
|
||||||
from_email = models.CharField(
|
from_email = models.CharField(
|
||||||
max_length=255,
|
max_length=255,
|
||||||
help_text="""
|
help_text=(
|
||||||
Example: MailBot <mailbot@yourdomain.com>
|
"Example: MailBot <mailbot@yourdomain.com><br />"
|
||||||
<br />
|
"'From' header to set for outgoing email.<br />"
|
||||||
'From' header to set for outgoing email.
|
"<br />"
|
||||||
<br />
|
"If you do not use this e-mail inbox for outgoing mail, this "
|
||||||
<br />
|
"setting is unnecessary.<br />"
|
||||||
If you do not use this e-mail inbox for outgoing mail, this
|
"If you send e-mail without setting this, your 'From' header will'"
|
||||||
setting is unnecessary.
|
"be set to match the setting `DEFAULT_FROM_EMAIL`."
|
||||||
<br />
|
),
|
||||||
If you send e-mail without setting this, your 'From' header will
|
blank=True,
|
||||||
be set to match the setting `DEFAULT_FROM_EMAIL`.
|
null=True,
|
||||||
""",
|
default=None,
|
||||||
blank=True,
|
)
|
||||||
null=True,
|
|
||||||
default=None,
|
|
||||||
)
|
|
||||||
active = models.BooleanField(
|
active = models.BooleanField(
|
||||||
help_text="""
|
help_text=(
|
||||||
Check this e-mail inbox for new e-mail messages during polling
|
"Check this e-mail inbox for new e-mail messages during polling "
|
||||||
cycles. This checkbox does not have an effect upon whether
|
"cycles. This checkbox does not have an effect upon whether "
|
||||||
mail is collected here when this mailbox receives mail from a
|
"mail is collected here when this mailbox receives mail from a "
|
||||||
pipe, and does not affect whether e-mail messages can be
|
"pipe, and does not affect whether e-mail messages can be "
|
||||||
dispatched from this mailbox.
|
"dispatched from this mailbox. "
|
||||||
""",
|
),
|
||||||
blank=True,
|
blank=True,
|
||||||
default=True,
|
default=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
objects = models.Manager()
|
objects = models.Manager()
|
||||||
active_mailboxes = ActiveMailboxManager()
|
active_mailboxes = ActiveMailboxManager()
|
||||||
|
|
@ -137,17 +136,17 @@ class Mailbox(models.Model):
|
||||||
return None
|
return None
|
||||||
elif self.type == 'imap':
|
elif self.type == 'imap':
|
||||||
conn = ImapTransport(
|
conn = ImapTransport(
|
||||||
self.location,
|
self.location,
|
||||||
port=self.port if self.port else None,
|
port=self.port if self.port else None,
|
||||||
ssl=self.use_ssl
|
ssl=self.use_ssl
|
||||||
)
|
)
|
||||||
conn.connect(self.username, self.password)
|
conn.connect(self.username, self.password)
|
||||||
elif self.type == 'pop3':
|
elif self.type == 'pop3':
|
||||||
conn = Pop3Transport(
|
conn = Pop3Transport(
|
||||||
self.location,
|
self.location,
|
||||||
port=self.port if self.port else None,
|
port=self.port if self.port else None,
|
||||||
ssl=self.use_ssl
|
ssl=self.use_ssl
|
||||||
)
|
)
|
||||||
conn.connect(self.username, self.password)
|
conn.connect(self.username, self.password)
|
||||||
elif self.type == 'maildir':
|
elif self.type == 'maildir':
|
||||||
conn = MaildirTransport(self.location)
|
conn = MaildirTransport(self.location)
|
||||||
|
|
@ -207,7 +206,9 @@ class Mailbox(models.Model):
|
||||||
msg.body = message.as_string()
|
msg.body = message.as_string()
|
||||||
if message['in-reply-to']:
|
if message['in-reply-to']:
|
||||||
try:
|
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:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
msg.save()
|
msg.save()
|
||||||
|
|
@ -219,13 +220,17 @@ class Mailbox(models.Model):
|
||||||
continue
|
continue
|
||||||
filename = part.get_filename()
|
filename = part.get_filename()
|
||||||
# ignore SMIME extension
|
# ignore SMIME extension
|
||||||
filename_basename, filename_extension = os.path.splitext(filename)
|
filename_basename, filename_extension = os.path.splitext(
|
||||||
|
filename
|
||||||
|
)
|
||||||
buffer_space = 40
|
buffer_space = 40
|
||||||
if len(filename) > 100 - buffer_space:
|
if len(filename) > 100 - buffer_space:
|
||||||
# Ensure that there're at least a few chars available afterward
|
# Ensure that there're at least a few chars available
|
||||||
# for duplication things like _1, _2 ... _99 and the FileField's
|
# afterward for duplication things like _1, _2 ... _99 and
|
||||||
# upload_to path.
|
# the FileField's upload_to path.
|
||||||
filename_basename = filename_basename[0:100-len(filename_extension)-buffer_space]
|
filename_basename = filename_basename[
|
||||||
|
0:100-len(filename_extension)-buffer_space
|
||||||
|
]
|
||||||
filename = filename_basename + filename_extension
|
filename = filename_basename + filename_extension
|
||||||
if filename_extension in SKIPPED_EXTENSIONS:
|
if filename_extension in SKIPPED_EXTENSIONS:
|
||||||
continue
|
continue
|
||||||
|
|
@ -257,24 +262,28 @@ class Mailbox(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name_plural = "Mailboxes"
|
verbose_name_plural = "Mailboxes"
|
||||||
|
|
||||||
|
|
||||||
class IncomingMessageManager(models.Manager):
|
class IncomingMessageManager(models.Manager):
|
||||||
def get_query_set(self):
|
def get_query_set(self):
|
||||||
return super(IncomingMessageManager, self).get_query_set().filter(
|
return super(IncomingMessageManager, self).get_query_set().filter(
|
||||||
outgoing=False,
|
outgoing=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class OutgoingMessageManager(models.Manager):
|
class OutgoingMessageManager(models.Manager):
|
||||||
def get_query_set(self):
|
def get_query_set(self):
|
||||||
return super(OutgoingMessageManager, self).get_query_set().filter(
|
return super(OutgoingMessageManager, self).get_query_set().filter(
|
||||||
outgoing=True,
|
outgoing=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class UnreadMessageManager(models.Manager):
|
class UnreadMessageManager(models.Manager):
|
||||||
def get_query_set(self):
|
def get_query_set(self):
|
||||||
return super(UnreadMessageManager, self).get_query_set().filter(
|
return super(UnreadMessageManager, self).get_query_set().filter(
|
||||||
read=None
|
read=None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class Message(models.Model):
|
class Message(models.Model):
|
||||||
mailbox = models.ForeignKey(Mailbox, related_name='messages')
|
mailbox = models.ForeignKey(Mailbox, related_name='messages')
|
||||||
subject = models.CharField(max_length=255)
|
subject = models.CharField(max_length=255)
|
||||||
|
|
@ -335,10 +344,10 @@ class Message(models.Model):
|
||||||
addresses = []
|
addresses = []
|
||||||
for address in self.to_header.split(','):
|
for address in self.to_header.split(','):
|
||||||
addresses.append(
|
addresses.append(
|
||||||
rfc822.parseaddr(
|
rfc822.parseaddr(
|
||||||
address
|
address
|
||||||
)[1]
|
)[1]
|
||||||
)
|
)
|
||||||
return addresses
|
return addresses
|
||||||
|
|
||||||
def reply(self, message):
|
def reply(self, message):
|
||||||
|
|
@ -359,10 +368,10 @@ class Message(models.Model):
|
||||||
message.extra_headers['In-Reply-To'] = self.message_id
|
message.extra_headers['In-Reply-To'] = self.message_id
|
||||||
message.send()
|
message.send()
|
||||||
return self.mailbox.record_outgoing_message(
|
return self.mailbox.record_outgoing_message(
|
||||||
email.message_from_string(
|
email.message_from_string(
|
||||||
message.message().as_string()
|
message.message().as_string()
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def text(self):
|
def text(self):
|
||||||
|
|
@ -373,7 +382,8 @@ class Message(models.Model):
|
||||||
body = ''
|
body = ''
|
||||||
if message.is_multipart():
|
if message.is_multipart():
|
||||||
for part in message.get_payload():
|
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)
|
body = body + get_body_from_message(part)
|
||||||
else:
|
else:
|
||||||
body = body + message.get_payload()
|
body = body + message.get_payload()
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,13 @@
|
||||||
import email
|
import email
|
||||||
import os.path
|
import os.path
|
||||||
import shutil
|
|
||||||
|
|
||||||
from django.db import models
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
import mimic
|
import mimic
|
||||||
|
|
||||||
import django_mailbox
|
import django_mailbox
|
||||||
from django_mailbox.models import Mailbox, Message
|
from django_mailbox.models import Mailbox, Message
|
||||||
|
|
||||||
|
|
||||||
class EmailMessageTestCase(TestCase):
|
class EmailMessageTestCase(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(EmailMessageTestCase, self).setUp()
|
super(EmailMessageTestCase, self).setUp()
|
||||||
|
|
@ -26,6 +25,7 @@ class EmailMessageTestCase(TestCase):
|
||||||
|
|
||||||
self.mimic.verify_all()
|
self.mimic.verify_all()
|
||||||
|
|
||||||
|
|
||||||
class TestProcessEmail(EmailMessageTestCase):
|
class TestProcessEmail(EmailMessageTestCase):
|
||||||
def test_message_without_attachments(self):
|
def test_message_without_attachments(self):
|
||||||
message = self._get_email_object('generic_message.eml')
|
message = self._get_email_object('generic_message.eml')
|
||||||
|
|
@ -85,6 +85,7 @@ class TestProcessEmail(EmailMessageTestCase):
|
||||||
actual_results,
|
actual_results,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestFilterMessageBody(EmailMessageTestCase):
|
class TestFilterMessageBody(EmailMessageTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
django_mailbox.models.STRIP_UNALLOWED_MIMETYPES = True
|
django_mailbox.models.STRIP_UNALLOWED_MIMETYPES = True
|
||||||
|
|
@ -131,6 +132,7 @@ class TestFilterMessageBody(EmailMessageTestCase):
|
||||||
mailbox._filter_message_body(message).as_string()
|
mailbox._filter_message_body(message).as_string()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestGetMessage(EmailMessageTestCase):
|
class TestGetMessage(EmailMessageTestCase):
|
||||||
def test_get_text_body_properly_recomposes_line_continuations(self):
|
def test_get_text_body_properly_recomposes_line_continuations(self):
|
||||||
message = Message()
|
message = Message()
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from mailbox import Babyl
|
from mailbox import Babyl
|
||||||
from django_mailbox.transports.generic import GenericFileMailbox
|
from django_mailbox.transports.generic import GenericFileMailbox
|
||||||
|
|
||||||
|
|
||||||
class BabylTransport(GenericFileMailbox):
|
class BabylTransport(GenericFileMailbox):
|
||||||
_variant = Babyl
|
_variant = Babyl
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import email
|
import email
|
||||||
from imaplib import IMAP4, IMAP4_SSL
|
from imaplib import IMAP4, IMAP4_SSL
|
||||||
|
|
||||||
|
|
||||||
class ImapTransport(object):
|
class ImapTransport(object):
|
||||||
def __init__(self, hostname, port=None, ssl=False):
|
def __init__(self, hostname, port=None, ssl=False):
|
||||||
self.hostname = hostname
|
self.hostname = hostname
|
||||||
|
|
@ -28,6 +29,6 @@ class ImapTransport(object):
|
||||||
yield message
|
yield message
|
||||||
except email.Errors.MessageParseError:
|
except email.Errors.MessageParseError:
|
||||||
continue
|
continue
|
||||||
self.server.store(key, "+FLAGS", "\\Deleted");
|
self.server.store(key, "+FLAGS", "\\Deleted")
|
||||||
self.server.expunge()
|
self.server.expunge()
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from mailbox import Maildir
|
from mailbox import Maildir
|
||||||
from django_mailbox.transports.generic import GenericFileMailbox
|
from django_mailbox.transports.generic import GenericFileMailbox
|
||||||
|
|
||||||
|
|
||||||
class MaildirTransport(GenericFileMailbox):
|
class MaildirTransport(GenericFileMailbox):
|
||||||
_variant = Maildir
|
_variant = Maildir
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from mailbox import mbox
|
from mailbox import mbox
|
||||||
from django_mailbox.transports.generic import GenericFileMailbox
|
from django_mailbox.transports.generic import GenericFileMailbox
|
||||||
|
|
||||||
|
|
||||||
class MboxTransport(GenericFileMailbox):
|
class MboxTransport(GenericFileMailbox):
|
||||||
_variant = mbox
|
_variant = mbox
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from mailbox import MH
|
from mailbox import MH
|
||||||
from django_mailbox.transports.generic import GenericFileMailbox
|
from django_mailbox.transports.generic import GenericFileMailbox
|
||||||
|
|
||||||
|
|
||||||
class MHTransport(GenericFileMailbox):
|
class MHTransport(GenericFileMailbox):
|
||||||
_variant = MH
|
_variant = MH
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from mailbox import MMDF
|
from mailbox import MMDF
|
||||||
from django_mailbox.transports.generic import GenericFileMailbox
|
from django_mailbox.transports.generic import GenericFileMailbox
|
||||||
|
|
||||||
|
|
||||||
class MMDFTransport(GenericFileMailbox):
|
class MMDFTransport(GenericFileMailbox):
|
||||||
_variant = MMDF
|
_variant = MMDF
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import email
|
import email
|
||||||
from poplib import POP3, POP3_SSL
|
from poplib import POP3, POP3_SSL
|
||||||
|
|
||||||
|
|
||||||
class Pop3Transport(object):
|
class Pop3Transport(object):
|
||||||
def __init__(self, hostname, port=None, ssl=False):
|
def __init__(self, hostname, port=None, ssl=False):
|
||||||
self.hostname = hostname
|
self.hostname = hostname
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue