|
1 #!/usr/bin/python2.5 |
|
2 # |
|
3 # Copyright 2008 the Melange authors. |
|
4 # |
|
5 # Licensed under the Apache License, Version 2.0 (the "License"); |
|
6 # you may not use this file except in compliance with the License. |
|
7 # You may obtain a copy of the License at |
|
8 # |
|
9 # http://www.apache.org/licenses/LICENSE-2.0 |
|
10 # |
|
11 # Unless required by applicable law or agreed to in writing, software |
|
12 # distributed under the License is distributed on an "AS IS" BASIS, |
|
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
14 # See the License for the specific language governing permissions and |
|
15 # limitations under the License. |
|
16 |
|
17 """Functions used to send email messages. |
|
18 |
|
19 The following are the possible fields of an email message: |
|
20 |
|
21 sender: The email address of the sender, the From address. This must be the |
|
22 email address of a registered administrator for the application, or the |
|
23 address of the current signed-in user. Administrators can be added to |
|
24 an application using the Administration Console. The current user's email |
|
25 address can be determined with the Users API. |
|
26 to: A recipient's email address (a string) or a list of email addresses to |
|
27 appear on the To: line in the message header. |
|
28 cc: A recipient's email address (a string) or a list of email addresses to |
|
29 appear on the Cc: line in the message header. |
|
30 bcc: A recipient's email address (a string) or a list of email addresses to |
|
31 receive the message, but not appear in the message header ("blind carbon |
|
32 copy"). |
|
33 reply_to: An email address to which a recipient should reply instead of the |
|
34 sender address, the Reply-To: field. |
|
35 subject: The subject of the message, the Subject: line. |
|
36 body: The plaintext body content of the message. |
|
37 html: An HTML version of the body content, for recipients that |
|
38 prefer HTML email. |
|
39 attachments: The file attachments for the message, as a list of two-value |
|
40 tuples, one tuple for each attachment. Each tuple contains a filename as |
|
41 the first element, and the file contents as the second element. |
|
42 An attachment file must be one of the allowed file types, and the |
|
43 filename must end with an extension that corresponds with the type. |
|
44 For a list of allowed types and filename extensions, see Allowed |
|
45 Attachment Types. |
|
46 |
|
47 Usage: |
|
48 |
|
49 context = { 'sender': 'melange-noreply@foo.com', |
|
50 'to': 'bob@bar.com', |
|
51 'subject': 'You have been invited to become a Host', |
|
52 'sender_name': 'Alice', |
|
53 'to_name': 'Melange Team', |
|
54 'role': 'Host', |
|
55 'group': 'Google Summer of Code 2009', |
|
56 'invitation_url': 'http://invitation-url'} |
|
57 |
|
58 sendMailUsingTemplate('soc/mail/invitation.html', context) |
|
59 """ |
|
60 |
|
61 __authors__ = [ |
|
62 '"Lennard de Rijk" <ljvderijk@gmail.com>', |
|
63 '"Pawel Solyga" <pawel.solyga@gmail.com', |
|
64 ] |
|
65 |
|
66 |
|
67 from django.template import loader |
|
68 |
|
69 from google.appengine.api import mail |
|
70 |
|
71 from soc.logic import dicts |
|
72 |
|
73 |
|
74 def sendMailFromTemplate(template, context): |
|
75 """Sends out an email using a Django template. |
|
76 |
|
77 If 'html' is present in context dictionary it is overwritten with |
|
78 template HTML output. |
|
79 |
|
80 Args: |
|
81 template: the template (or search list of templates) to use |
|
82 context: The context supplied to the template and email (dictionary) |
|
83 |
|
84 Raises: |
|
85 Error that corresponds with the first problem it finds ff the message |
|
86 is not properly initialized. |
|
87 |
|
88 List of all possible errors: |
|
89 http://code.google.com/appengine/docs/mail/exceptions.html |
|
90 """ |
|
91 # render the template and put in context with 'html' as key |
|
92 context['html'] = loader.render_to_string(template, dictionary=context) |
|
93 |
|
94 # filter out the unneeded values in context to keep sendMail happy |
|
95 sendMail(dicts.filter(context, mail.EmailMessage.PROPERTIES)) |
|
96 |
|
97 |
|
98 def sendMail(context): |
|
99 """Sends out an email using context to supply the needed information. |
|
100 |
|
101 Args: |
|
102 context : The context supplied to the email message (dictionary) |
|
103 |
|
104 Raises: |
|
105 Error that corresponds with the first problem it finds ff the message |
|
106 is not properly initialized. |
|
107 |
|
108 List of all possible errors: |
|
109 http://code.google.com/appengine/docs/mail/exceptions.html |
|
110 """ |
|
111 |
|
112 # construct the EmailMessage from the given context |
|
113 message = mail.EmailMessage(**context) |
|
114 |
|
115 message.check_initialized() |
|
116 |
|
117 # send the message |
|
118 message.send() |