]> git.openstreetmap.org Git - osqa.git/blob - forum/templatetags/email_tags.py
bb21973eb77bd6a06075dfed7e6eb6a0c2d462b1
[osqa.git] / forum / templatetags / email_tags.py
1 from django import template
2 from forum import settings
3
4 register = template.Library()
5
6 class MultiUserMailMessage(template.Node):
7     def __init__(self, nodelist):
8         self.nodelist = nodelist
9
10     def render(self, context):
11         recipients = context['recipients']
12         messages = list()
13
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']))
19
20         create_mail_messages(messages)
21
22 @register.tag
23 def email(parser, token):
24     nodelist = parser.parse(('endemail',))
25     parser.delete_first_token()
26     return MultiUserMailMessage(nodelist)
27
28
29
30 class EmailPartNode(template.Node):
31     def __init__(self, nodelist, varname):
32         self.nodelist = nodelist
33         self.varname = varname
34
35     def render(self, context):
36         context[self.varname] = self.nodelist.render(context).strip()
37
38 @register.tag
39 def subject(parser, token):
40     nodelist = parser.parse(('endsubject',))
41     parser.delete_first_token()
42     return EmailPartNode(nodelist, 'subject')
43
44 def content(parser, token):
45     try:
46         tag_name, base = token.split_contents()
47     except ValueError:
48         try:
49             tag_name = token.split_contents()[0]
50             base = None
51         except:
52             raise template.TemplateSyntaxError, "%r tag requires at least two arguments" % token.contents.split()[0]
53
54     nodelist = parser.parse(('end%s' % tag_name,))
55
56     if base:
57         base = template.loader.get_template(base)
58
59         basenodes = base.nodelist
60         content = [i for i,n in enumerate(basenodes) if isinstance(n, template.loader_tags.BlockNode) and n.name == "content"]
61         if len(content):
62             index = content[0]
63             nodelist = template.NodeList(basenodes[0:index] + nodelist + basenodes[index:])
64         
65
66     parser.delete_first_token()
67     return EmailPartNode(nodelist, tag_name)
68
69
70 register.tag('htmlcontent', content)
71 register.tag('textcontent', content)
72
73
74 class EmbedMediaNode(template.Node):
75     def __init__(self, location, alias):
76         self.location = template.Variable(location)
77         self.alias = alias
78
79     def render(self, context):
80         context['embeddedmedia'][self.alias] = self.location.resolve(context)
81         pass
82
83
84 @register.tag
85 def embedmedia(parser, token):
86     try:
87         tag_name, location, _, alias = token.split_contents()
88     except ValueError:
89         raise template.TemplateSyntaxError, "%r tag requires exactly four arguments" % token.contents.split()[0]
90
91     return EmbedMediaNode(location, alias)
92
93 from email.mime.multipart import MIMEMultipart
94 from email.mime.text import MIMEText
95 from email.mime.image import MIMEImage
96
97 from django.core.mail import DNS_NAME
98 from smtplib import SMTP
99 import email.Charset
100 import socket
101
102
103 def create_mail_messages(messages):
104     sender = '%s <%s>' % (unicode(settings.APP_SHORT_NAME), unicode(settings.DEFAULT_FROM_EMAIL))
105
106     connection = SMTP(str(settings.EMAIL_HOST), str(settings.EMAIL_PORT),
107                 local_hostname=DNS_NAME.get_fqdn())
108
109     try:
110         if (bool(settings.EMAIL_USE_TLS)):
111             connection.ehlo()
112             connection.starttls()
113             connection.ehlo()
114
115         if settings.EMAIL_HOST_USER and settings.EMAIL_HOST_PASSWORD:
116             connection.login(str(settings.EMAIL_HOST_USER), str(settings.EMAIL_HOST_PASSWORD))
117
118         if sender is None:
119             sender = str(settings.DEFAULT_FROM_EMAIL)
120
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')
127
128             msgAlternative = MIMEMultipart('alternative')
129             msgRoot.attach(msgAlternative)
130
131             msgAlternative.attach(MIMEText(text, _charset='utf-8'))
132             msgAlternative.attach(MIMEText(html, 'html', _charset='utf-8'))
133
134             for alias, location in media.items():
135                 fp = open(location, 'rb')
136                 msgImage = MIMEImage(fp.read())
137                 fp.close()
138                 msgImage.add_header('Content-ID', '<'+alias+'>')
139                 msgRoot.attach(msgImage)
140
141             try:
142                 connection.sendmail(sender, [recipient.email], msgRoot.as_string())
143             except Exception, e:
144                 pass
145
146         try:
147             connection.quit()
148         except socket.sslerror:
149             connection.close()
150     except Exception, e:
151         print e
152
153     
154     
155
156