1 | from email import Encoders
|
---|
2 | from email.MIMEBase import MIMEBase
|
---|
3 | from email.Utils import formatdate
|
---|
4 |
|
---|
5 | from django.core.mail import make_msgid, SafeMIMEText, SafeMIMEMultipart
|
---|
6 | from django.core.mail import EmailMessage
|
---|
7 | from django.conf import settings
|
---|
8 | from django.utils.encoding import smart_str
|
---|
9 |
|
---|
10 | class EmailAlternativesMessage(EmailMessage):
|
---|
11 | def __init__(self, subject='', body='', from_email=None, to=None, bcc=None,
|
---|
12 | connection=None, attachments=None, headers=None, alternatives=None):
|
---|
13 | super(EmailAlternativesMessage, self).__init__(subject, body,
|
---|
14 | from_email, to, bcc, connection, attachments, headers)
|
---|
15 | self.alternatives=alternatives or []
|
---|
16 |
|
---|
17 | def message(self):
|
---|
18 | encoding = self.encoding or settings.DEFAULT_CHARSET
|
---|
19 | msg = SafeMIMEText(smart_str(self.body, settings.DEFAULT_CHARSET),
|
---|
20 | self.content_subtype, encoding)
|
---|
21 | if self.alternatives:
|
---|
22 | body_msg = msg
|
---|
23 | msg = SafeMIMEMultipart(_subtype='alternative')
|
---|
24 | if self.body:
|
---|
25 | msg.attach(body_msg)
|
---|
26 | for alternative in self.alternatives:
|
---|
27 | if isinstance(alternative, MIMEBase):
|
---|
28 | msg.attach(alternative)
|
---|
29 | else:
|
---|
30 | msg.attach(self._create_alternative(*alternative))
|
---|
31 | if self.attachments:
|
---|
32 | body_msg = msg
|
---|
33 | msg = SafeMIMEMultipart(_subtype=self.multipart_subtype)
|
---|
34 | if self.body:
|
---|
35 | msg.attach(body_msg)
|
---|
36 | for attachment in self.attachments:
|
---|
37 | if isinstance(attachment, MIMEBase):
|
---|
38 | msg.attach(attachment)
|
---|
39 | else:
|
---|
40 | msg.attach(self._create_attachment(*attachment))
|
---|
41 | msg['Subject'] = self.subject
|
---|
42 | msg['From'] = self.from_email
|
---|
43 | msg['To'] = ', '.join(self.to)
|
---|
44 | msg['Date'] = formatdate()
|
---|
45 | msg['Message-ID'] = make_msgid()
|
---|
46 | for name, value in self.extra_headers.items():
|
---|
47 | msg[name] = value
|
---|
48 | return msg
|
---|
49 |
|
---|
50 | def attach_alternative(self, content=None, mimetype=None):
|
---|
51 | """Attach an alternative content representation."""
|
---|
52 | assert content is not None
|
---|
53 | assert mimetype is not None
|
---|
54 | self.alternatives.append((content, mimetype))
|
---|
55 |
|
---|
56 | def _create_alternative(self, content, mimetype):
|
---|
57 | """
|
---|
58 | Converts the content, mimetype pair into a MIME attachment object.
|
---|
59 | """
|
---|
60 | basetype, subtype = mimetype.split('/', 1)
|
---|
61 | if basetype == 'text':
|
---|
62 | alternative = SafeMIMEText(smart_str(content,
|
---|
63 | settings.DEFAULT_CHARSET), subtype, settings.DEFAULT_CHARSET)
|
---|
64 | else:
|
---|
65 | alternative = MIMEBase(basetype, subtype)
|
---|
66 | alternative.set_payload(content)
|
---|
67 | Encoders.encode_base64(attachment)
|
---|
68 | return alternative
|
---|
69 |
|
---|