2010-12-27 7 views
4

Ich habe eine App mit einer Art von Ruhe-API, die ich verwenden, um E-Mails zu senden. Allerdings sendet es derzeit nur Text-E-Mail, also muss ich wissen, wie ich es modifizieren und es HTML senden lassen kann. Unten ist der Code:Google App Engine: Wie sende ich HTML mit send_mail

 
from __future__ import with_statement 

#!/usr/bin/env python 
# 

import cgi 
import os 
import logging 
import contextlib 
from xml.dom import minidom 
from xml.dom.minidom import Document 
import exceptions 
import warnings 
import imghdr 
from google.appengine.api import images 
from google.appengine.api import users 
from google.appengine.ext import db 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext.webapp import template 
from google.appengine.api import mail 
import wsgiref.handlers 

# START Constants 
CONTENT_TYPE_HEADER = "Content-Type" 
CONTENT_TYPE_TEXT = "text/plain" 
XML_CONTENT_TYPE = "application/xml" 
XML_ENCODING = "utf-8" 
""" 
Allows you to specify IP addresses and associated "api_key"s to prevent others from using your app. 
Storage and Manipulation methods will check for this "api_key" in the POST/GET params. 
Retrieval methods don't use it (however you could enable them to use it, but maybe rewrite so you have a "read" key and a "write" key to prevent others from manipulating your data). 

Set "AUTH = False" to disable (allowing anyone use your app and CRUD your data). 

To generate a hash/api_key visit https://www.grc.com/passwords.htm 
To find your ip visit http://www.whatsmyip.org/ 
""" 
AUTH = { 
    '000.000.000.000':'JLQ7P5SnTPq7AJvLnUysJmXSeXTrhgaJ', 
} 
# END Constants 

# START Exception Handling 
class Error(StandardError): 
    pass 
class Forbidden(Error): 
    pass 

logging.getLogger().setLevel(logging.DEBUG) 

@contextlib.contextmanager 
def mailExcpHandler(ctx): 
    try: 
     yield {} 
    except (ValueError), exc: 
     xml_error_response(ctx, 400 ,'app.invalid_parameters', 'The indicated parameters are not valid: ' + exc.message) 
    except (Forbidden), exc: 
     xml_error_response(ctx, 403 ,'app.forbidden', 'You don\'t have permission to perform this action: ' + exc.message) 
    except (Exception), exc: 
     xml_error_response(ctx, 500 ,'system.other', 'An unexpected error in the web service has happened: ' + exc.message) 

def xml_error_response(ctx, status, error_id, error_msg): 
    ctx.error(status) 
    doc = Document() 
    errorcard = doc.createElement("error") 
    errorcard.setAttribute("id", error_id) 
    doc.appendChild(errorcard) 
    ptext = doc.createTextNode(error_msg) 
    errorcard.appendChild(ptext) 
    ctx.response.headers[CONTENT_TYPE_HEADER] = XML_CONTENT_TYPE 
    ctx.response.out.write(doc.toxml(XML_ENCODING)) 
# END Exception Handling 

# START Helper Methods 
def isAuth(ip = None, key = None): 
    if AUTH == False: 
     return True 
    elif AUTH.has_key(ip) and key == AUTH[ip]: 
     return True 
    else: 
     return False 

# END Helper Methods 


# START Request Handlers 
class Send(webapp.RequestHandler): 
    def post(self): 
     """ 
     Sends an email based on POST params. It will queue if resources are unavailable at the time. 

     Returns "Success" 

     POST Args: 
      to: the receipent address 
      from: the sender address (must be a registered GAE email) 
      subject: email subject 
      body: email body content 
     """ 
     with mailExcpHandler(self): 
      # check authorised 
      if isAuth(self.request.remote_addr,self.request.POST.get('api_key')) == False: 
       raise Forbidden("Invalid Credentials") 

      # read data from request 
      mail_to = str(self.request.POST.get('to')) 
      mail_from = str(self.request.POST.get('from')) 
      mail_subject = str(self.request.POST.get('subject')) 
      mail_body = str(self.request.POST.get('body')) 

      mail.send_mail(mail_from, mail_to, mail_subject, mail_body) 

      self.response.headers[CONTENT_TYPE_HEADER] = CONTENT_TYPE_TEXT 
      self.response.out.write("Success") 


# END Request Handlers 

# START Application 
application = webapp.WSGIApplication([ 
                      ('/send', Send) 
                     ],debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 

# END Application 
+0

:(auch schwierige Frage – Michael

Antwort

7

einen Blick auf die Email message fields der Funktion send_mail haben.
Hier ist der Parameter benötigen Sie:

html
Eine HTML-Version des Körpers Inhalt, für die Empfänger, die HTML-E-Mail bevorzugen.

Sie sollten den html Eingabeparameter wie folgt hinzufügen:

#Your html body 
mail_html_body = '<h1>Hello!</h1>' 

# read data from request 
mail_to = str(self.request.POST.get('to')) 
mail_from = str(self.request.POST.get('from')) 
mail_subject = str(self.request.POST.get('subject')) 
mail_body = str(self.request.POST.get('body')) 

mail.send_mail(mail_from, 
       mail_to, 
       mail_subject, 
       mail_body, 
       html = mail_html_body) #your html body 
1

Sie den HTML-Bereich der Emailmessage Klasse allein

message = mail.EmailMessage(sender=emailFrom,subject=emailSubject) 
message.to = emailTo 
message.body = emailBody 
message.html = emailHtml 
message.send() 
+0

Ein Codeblock verwenden können, tut keine gute Antwort geben, bitte Erklärungen hinzufügen (warum löst man das Problem, wo war der Fehler, etc ...) –