1 from django import template
2 from forum import settings
4 register = template.Library()
6 class MultiUserMailMessage(template.Node):
7 def __init__(self, nodelist):
8 self.nodelist = nodelist
10 def render(self, context):
11 recipients = context['recipients']
14 for recipient in recipients:
15 context['embeddedmedia'] = {}
16 context['recipient'] = recipient
17 self.nodelist.render(context)
18 messages.append((recipient, context['subject'], context['htmlcontent'], context['textcontent'], context['embeddedmedia']))
20 create_mail_messages(messages)
23 def email(parser, token):
24 nodelist = parser.parse(('endemail',))
25 parser.delete_first_token()
26 return MultiUserMailMessage(nodelist)
30 class EmailPartNode(template.Node):
31 def __init__(self, nodelist, varname):
32 self.nodelist = nodelist
33 self.varname = varname
35 def render(self, context):
36 context[self.varname] = self.nodelist.render(context).strip()
39 def subject(parser, token):
40 nodelist = parser.parse(('endsubject',))
41 parser.delete_first_token()
42 return EmailPartNode(nodelist, 'subject')
44 def content(parser, token):
46 tag_name, base = token.split_contents()
49 tag_name = token.split_contents()[0]
52 raise template.TemplateSyntaxError, "%r tag requires at least two arguments" % token.contents.split()[0]
54 nodelist = parser.parse(('end%s' % tag_name,))
57 base = template.loader.get_template(base)
59 basenodes = base.nodelist
60 content = [i for i,n in enumerate(basenodes) if isinstance(n, template.loader_tags.BlockNode) and n.name == "content"]
63 nodelist = template.NodeList(basenodes[0:index] + nodelist + basenodes[index:])
66 parser.delete_first_token()
67 return EmailPartNode(nodelist, tag_name)
70 register.tag('htmlcontent', content)
71 register.tag('textcontent', content)
74 class EmbedMediaNode(template.Node):
75 def __init__(self, location, alias):
76 self.location = template.Variable(location)
79 def render(self, context):
80 context['embeddedmedia'][self.alias] = self.location.resolve(context)
85 def embedmedia(parser, token):
87 tag_name, location, _, alias = token.split_contents()
89 raise template.TemplateSyntaxError, "%r tag requires exactly four arguments" % token.contents.split()[0]
91 return EmbedMediaNode(location, alias)
93 from email.mime.multipart import MIMEMultipart
94 from email.mime.text import MIMEText
95 from email.mime.image import MIMEImage
97 from django.core.mail import DNS_NAME
98 from smtplib import SMTP
103 def create_mail_messages(messages):
104 sender = '%s <%s>' % (unicode(settings.APP_SHORT_NAME), unicode(settings.DEFAULT_FROM_EMAIL))
106 connection = SMTP(str(settings.EMAIL_HOST), str(settings.EMAIL_PORT),
107 local_hostname=DNS_NAME.get_fqdn())
110 if (bool(settings.EMAIL_USE_TLS)):
112 connection.starttls()
115 if settings.EMAIL_HOST_USER and settings.EMAIL_HOST_PASSWORD:
116 connection.login(str(settings.EMAIL_HOST_USER), str(settings.EMAIL_HOST_PASSWORD))
119 sender = str(settings.DEFAULT_FROM_EMAIL)
121 for recipient, subject, html, text, media in messages:
122 msgRoot = MIMEMultipart('related')
123 msgRoot['Subject'] = subject
124 msgRoot['From'] = sender
125 msgRoot['To'] = '%s <%s>' % (recipient.username, recipient.email)
126 msgRoot.preamble = 'This is a multi-part message from %s.' % unicode(settings.APP_SHORT_NAME).encode('utf8')
128 msgAlternative = MIMEMultipart('alternative')
129 msgRoot.attach(msgAlternative)
131 msgAlternative.attach(MIMEText(text, _charset='utf-8'))
132 msgAlternative.attach(MIMEText(html, 'html', _charset='utf-8'))
134 for alias, location in media.items():
135 fp = open(location, 'rb')
136 msgImage = MIMEImage(fp.read())
138 msgImage.add_header('Content-ID', '<'+alias+'>')
139 msgRoot.attach(msgImage)
142 connection.sendmail(sender, [recipient.email], msgRoot.as_string())
148 except socket.sslerror: