diff --git a/django_mailbox/admin.py b/django_mailbox/admin.py index 4d29581..0093dc9 100644 --- a/django_mailbox/admin.py +++ b/django_mailbox/admin.py @@ -1,7 +1,7 @@ from django.conf import settings from django.contrib import admin -from django_mailbox.models import Message, Mailbox +from django_mailbox.models import MessageAttachment, Message, Mailbox def get_new_mail(mailbox_admin, request, queryset): for mailbox in queryset.all(): @@ -17,6 +17,9 @@ class MailboxAdmin(admin.ModelAdmin): ) actions = [get_new_mail] +class MessageAttachmentAdmin(admin.ModelAdmin): + list_display = ('document',) + class MessageAdmin(admin.ModelAdmin): list_display = ( 'subject', @@ -38,4 +41,5 @@ class MessageAdmin(admin.ModelAdmin): if getattr(settings, 'DJANGO_MAILBOX_ADMIN_ENABLED', True): admin.site.register(Message, MessageAdmin) + admin.site.register(MessageAttachment, MessageAttachmentAdmin) admin.site.register(Mailbox, MailboxAdmin) diff --git a/django_mailbox/management/commands/getmail.py b/django_mailbox/management/commands/getmail.py index 2ee8947..6041782 100644 --- a/django_mailbox/management/commands/getmail.py +++ b/django_mailbox/management/commands/getmail.py @@ -11,7 +11,7 @@ class Command(BaseCommand): self.stdout.write('Gathering messages for %s\n' % mailbox.name) messages = mailbox.get_new_mail() for message in messages: - self.stdout.write('Recieved %s (from %s)\n' % ( + self.stdout.write('Received %s (from %s)\n' % ( message.subject, message.from_address )) diff --git a/django_mailbox/migrations/0012_auto__add_messageattachment.py b/django_mailbox/migrations/0012_auto__add_messageattachment.py new file mode 100644 index 0000000..554483e --- /dev/null +++ b/django_mailbox/migrations/0012_auto__add_messageattachment.py @@ -0,0 +1,67 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'MessageAttachment' + db.create_table('django_mailbox_messageattachment', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('document', self.gf('django.db.models.fields.files.FileField')(max_length=100)), + )) + db.send_create_signal('django_mailbox', ['MessageAttachment']) + + # Adding M2M table for field attachments on 'Message' + db.create_table('django_mailbox_message_attachments', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('message', models.ForeignKey(orm['django_mailbox.message'], null=False)), + ('messageattachment', models.ForeignKey(orm['django_mailbox.messageattachment'], null=False)) + )) + db.create_unique('django_mailbox_message_attachments', ['message_id', 'messageattachment_id']) + + + def backwards(self, orm): + + # Deleting model 'MessageAttachment' + db.delete_table('django_mailbox_messageattachment') + + # Removing M2M table for field attachments on 'Message' + db.delete_table('django_mailbox_message_attachments') + + + models = { + 'django_mailbox.mailbox': { + 'Meta': {'object_name': 'Mailbox'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'from_email': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'uri': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}) + }, + 'django_mailbox.message': { + 'Meta': {'object_name': 'Message'}, + 'attachments': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['django_mailbox.MessageAttachment']", 'symmetrical': 'False'}), + 'body': ('django.db.models.fields.TextField', [], {}), + 'from_header': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'in_reply_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'replies'", 'null': 'True', 'to': "orm['django_mailbox.Message']"}), + 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'messages'", 'to': "orm['django_mailbox.Mailbox']"}), + 'message_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'outgoing': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'processed': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'read': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'subject': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'to_header': ('django.db.models.fields.TextField', [], {}) + }, + 'django_mailbox.messageattachment': { + 'Meta': {'object_name': 'MessageAttachment'}, + 'document': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['django_mailbox'] diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 6c54192..b0325e5 100755 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -3,9 +3,12 @@ from email.utils import formatdate import rfc822 import urllib import urlparse +import os from django.conf import settings from django.core.mail.message import make_msgid +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, \ @@ -160,6 +163,27 @@ class Mailbox(models.Model): except IndexError: pass msg.save() + if message.is_multipart(): + for part in message.walk(): + if part.get_content_maintype() == 'multipart': + continue + if part.get('Content-Disposition') is None: + continue + filename = part.get_filename() + # ignore SMIME extension + filename_basename, filename_extension = os.path.splitext(filename) + if filename_extension in ('.p7s',): + continue + data = part.get_payload(decode=True) + if not data: + continue + temp_file = NamedTemporaryFile(delete=True) + temp_file.write(data) + temp_file.flush() + attachment = MessageAttachment() + attachment.document.save(filename, File(temp_file)) + attachment.save() + msg.attachments.add(attachment) return msg def get_new_mail(self): @@ -196,6 +220,12 @@ class UnreadMessageManager(models.Manager): read=None ) +class MessageAttachment(models.Model): + document = models.FileField(upload_to='mailbox_attachments/%Y/%m/%d/') + + def __unicode__(self): + return self.document.url + class Message(models.Model): mailbox = models.ForeignKey(Mailbox, related_name='messages') subject = models.CharField(max_length=255) @@ -226,6 +256,8 @@ class Message(models.Model): null=True, ) + attachments = models.ManyToManyField(MessageAttachment) + objects = models.Manager() unread_messages = UnreadMessageManager() incoming_messages = IncomingMessageManager() @@ -289,4 +321,4 @@ class Message(models.Model): return email.message_from_string(self.body) def __unicode__(self): - return self.subject + return self.subject \ No newline at end of file