20
20
import six
21
21
from six .moves .urllib .parse import parse_qs , unquote , urlparse
22
22
23
- from django .conf import settings
23
+ from django .conf import settings as django_settings
24
24
from django .core .files .base import ContentFile
25
25
from django .core .mail .message import make_msgid
26
26
from django .db import models
27
27
from django .utils .translation import ugettext_lazy as _
28
28
29
- from . utils import convert_header_to_unicode , get_body_from_message
29
+ from django_mailbox import utils
30
30
from django_mailbox .signals import message_received
31
31
from django_mailbox .transports import Pop3Transport , ImapTransport , \
32
32
MaildirTransport , MboxTransport , BabylTransport , MHTransport , \
35
35
logger = logging .getLogger (__name__ )
36
36
37
37
38
- STRIP_UNALLOWED_MIMETYPES = getattr (
39
- settings ,
40
- 'DJANGO_MAILBOX_STRIP_UNALLOWED_MIMETYPES' ,
41
- False
42
- )
43
-
44
- ALLOWED_MIMETYPES = getattr (
45
- settings ,
46
- 'DJANGO_MAILBOX_ALLOWED_MIMETYPES' ,
47
- [
48
- 'text/plain' ,
49
- 'text/html'
50
- ]
51
- )
52
-
53
- TEXT_STORED_MIMETYPES = getattr (
54
- settings ,
55
- 'DJANGO_MAILBOX_TEXT_STORED_MIMETYPES' ,
56
- [
57
- 'text/plain' ,
58
- 'text/html'
59
- ]
60
- )
61
-
62
- ALTERED_MESSAGE_HEADER = getattr (
63
- settings ,
64
- 'DJANGO_MAILBOX_ALTERED_MESSAGE_HEADER' ,
65
- 'X-Django-Mailbox-Altered-Message'
66
- )
67
-
68
- ATTACHMENT_INTERPOLATION_HEADER = getattr (
69
- settings ,
70
- 'DJANGO_MAILBOX_ATTACHMENT_INTERPOLATION_HEADER' ,
71
- 'X-Django-Mailbox-Interpolate-Attachment'
72
- )
73
-
74
- ATTACHMENT_UPLOAD_TO = getattr (
75
- settings ,
76
- 'DJANGO_MAILBOX_ATTACHMENT_UPLOAD_TO' ,
77
- 'mailbox_attachments/%Y/%m/%d/'
78
- )
79
-
80
- STORE_ORIGINAL_MESSAGE = getattr (
81
- settings ,
82
- 'DJANGO_MAILBOX_STORE_ORIGINAL_MESSAGE' ,
83
- False
84
- )
85
-
86
-
87
38
class ActiveMailboxManager (models .Manager ):
88
39
def get_queryset (self ):
89
40
return super (ActiveMailboxManager , self ).get_queryset ().filter (
@@ -272,6 +223,8 @@ def record_outgoing_message(self, message):
272
223
return msg
273
224
274
225
def _get_dehydrated_message (self , msg , record ):
226
+ settings = utils .get_settings ()
227
+
275
228
new = EmailMessage ()
276
229
if msg .is_multipart ():
277
230
for header , value in msg .items ():
@@ -281,25 +234,27 @@ def _get_dehydrated_message(self, msg, record):
281
234
self ._get_dehydrated_message (part , record )
282
235
)
283
236
elif (
284
- STRIP_UNALLOWED_MIMETYPES
285
- and not msg .get_content_type () in ALLOWED_MIMETYPES
237
+ settings [ 'strip_unallowed_mimetypes' ]
238
+ and not msg .get_content_type () in settings [ 'allowed_mimetypes' ]
286
239
):
287
240
for header , value in msg .items ():
288
241
new [header ] = value
289
242
# Delete header, otherwise when attempting to deserialize the
290
243
# payload, it will be expecting a body for this.
291
244
del new ['Content-Transfer-Encoding' ]
292
- new [ALTERED_MESSAGE_HEADER ] = (
245
+ new [settings [ 'altered_message_header' ] ] = (
293
246
'Stripped; Content type %s not allowed' % (
294
247
msg .get_content_type ()
295
248
)
296
249
)
297
250
new .set_payload ('' )
298
251
elif (
299
- (msg .get_content_type () not in TEXT_STORED_MIMETYPES ) or
252
+ (
253
+ msg .get_content_type () not in settings ['text_stored_mimetypes' ]
254
+ ) or
300
255
('attachment' in msg .get ('Content-Disposition' , '' ))
301
256
):
302
- filename = msg .get_filename ()
257
+ filename = utils . convert_header_to_unicode ( msg .get_filename () )
303
258
if not filename :
304
259
extension = mimetypes .guess_extension (msg .get_content_type ())
305
260
else :
@@ -323,7 +278,9 @@ def _get_dehydrated_message(self, msg, record):
323
278
attachment .save ()
324
279
325
280
placeholder = EmailMessage ()
326
- placeholder [ATTACHMENT_INTERPOLATION_HEADER ] = str (attachment .pk )
281
+ placeholder [
282
+ settings ['attachment_interpolation_header' ]
283
+ ] = str (attachment .pk )
327
284
new = placeholder
328
285
else :
329
286
content_charset = msg .get_content_charset ()
@@ -361,19 +318,25 @@ def _get_dehydrated_message(self, msg, record):
361
318
362
319
def _process_message (self , message ):
363
320
msg = Message ()
364
- if STORE_ORIGINAL_MESSAGE :
365
- msg .eml .save ('%s.eml' % uuid .uuid4 (), ContentFile (message ), save = False )
321
+ settings = utils .get_settings ()
322
+
323
+ if settings ['store_original_message' ]:
324
+ msg .eml .save (
325
+ '%s.eml' % uuid .uuid4 (), ContentFile (message ), save = False
326
+ )
366
327
msg .mailbox = self
367
328
if 'subject' in message :
368
- msg .subject = convert_header_to_unicode (message ['subject' ])[0 :255 ]
329
+ msg .subject = (
330
+ utils .convert_header_to_unicode (message ['subject' ])[0 :255 ]
331
+ )
369
332
if 'message-id' in message :
370
333
msg .message_id = message ['message-id' ][0 :255 ].strip ()
371
334
if 'from' in message :
372
- msg .from_header = convert_header_to_unicode (message ['from' ])
335
+ msg .from_header = utils . convert_header_to_unicode (message ['from' ])
373
336
if 'to' in message :
374
- msg .to_header = convert_header_to_unicode (message ['to' ])
337
+ msg .to_header = utils . convert_header_to_unicode (message ['to' ])
375
338
elif 'Delivered-To' in message :
376
- msg .to_header = convert_header_to_unicode (message ['Delivered-To' ])
339
+ msg .to_header = utils . convert_header_to_unicode (message ['Delivered-To' ])
377
340
msg .save ()
378
341
message = self ._get_dehydrated_message (message , msg )
379
342
msg .set_body (message .as_string ())
@@ -557,7 +520,7 @@ def reply(self, message):
557
520
if self .mailbox .from_email :
558
521
message .from_email = self .mailbox .from_email
559
522
else :
560
- message .from_email = settings .DEFAULT_FROM_EMAIL
523
+ message .from_email = django_settings .DEFAULT_FROM_EMAIL
561
524
message .extra_headers ['Message-ID' ] = make_msgid ()
562
525
message .extra_headers ['Date' ] = formatdate ()
563
526
message .extra_headers ['In-Reply-To' ] = self .message_id .strip ()
@@ -573,7 +536,7 @@ def text(self):
573
536
"""
574
537
Returns the message body matching content type 'text/plain'.
575
538
"""
576
- return get_body_from_message (
539
+ return utils . get_body_from_message (
577
540
self .get_email_object (), 'text' , 'plain'
578
541
).replace ('=\n ' , '' ).strip ()
579
542
@@ -582,23 +545,25 @@ def html(self):
582
545
"""
583
546
Returns the message body matching content type 'text/html'.
584
547
"""
585
- return get_body_from_message (
548
+ return utils . get_body_from_message (
586
549
self .get_email_object (), 'text' , 'html'
587
550
).replace ('\n ' , '' ).strip ()
588
551
589
552
def _rehydrate (self , msg ):
590
553
new = EmailMessage ()
554
+ settings = utils .get_settings ()
555
+
591
556
if msg .is_multipart ():
592
557
for header , value in msg .items ():
593
558
new [header ] = value
594
559
for part in msg .get_payload ():
595
560
new .attach (
596
561
self ._rehydrate (part )
597
562
)
598
- elif ATTACHMENT_INTERPOLATION_HEADER in msg .keys ():
563
+ elif settings [ 'attachment_interpolation_header' ] in msg .keys ():
599
564
try :
600
565
attachment = MessageAttachment .objects .get (
601
- pk = msg [ATTACHMENT_INTERPOLATION_HEADER ]
566
+ pk = msg [settings [ 'attachment_interpolation_header' ] ]
602
567
)
603
568
for header , value in attachment .items ():
604
569
new [header ] = value
@@ -627,9 +592,9 @@ def _rehydrate(self, msg):
627
592
del new ['Content-Transfer-Encoding' ]
628
593
encode_base64 (new )
629
594
except MessageAttachment .DoesNotExist :
630
- new [ALTERED_MESSAGE_HEADER ] = (
595
+ new [settings [ 'altered_message_header' ] ] = (
631
596
'Missing; Attachment %s not found' % (
632
- msg [ATTACHMENT_INTERPOLATION_HEADER ]
597
+ msg [settings [ 'attachment_interpolation_header' ] ]
633
598
)
634
599
)
635
600
new .set_payload ('' )
@@ -723,7 +688,7 @@ class MessageAttachment(models.Model):
723
688
724
689
document = models .FileField (
725
690
_ (u'Document' ),
726
- upload_to = ATTACHMENT_UPLOAD_TO ,
691
+ upload_to = utils . get_attachment_save_path ,
727
692
)
728
693
729
694
def delete (self , * args , ** kwargs ):
0 commit comments