app/soc/logic/mail_dispatcher.py
changeset 484 6364f8b0656b
child 509 e8acc0a907fb
equal deleted inserted replaced
483:70f21691b0e1 484:6364f8b0656b
       
     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()