Google App Engine: cómo enviar html usando send_mail

Tengo una aplicación con una especie de api de descanso que estoy usando para enviar correos electrónicos. Sin embargo, actualmente solo envía correos electrónicos de texto, así que necesito saber cómo modificarlo y hacer que envíe html. A continuación se muestra el código:

 de __future__ importar with_statement

 #! / usr / bin / env python
 #

 importar cgi
 importación OS
 registro de importación
 importar contextlib
 desde xml.dom importar minidom
 del documento de importación xml.dom.minidom
 excepciones de importación
 advertencias de importación
 importar imghdr
 desde google.appengine.api importar imágenes
 desde google.appengine.api importamos usuarios
 de google.appengine.ext importar db
 desde google.appengine.ext importar aplicación web
 desde google.appengine.ext.webapp.util import run_wsgi_app
 De la plantilla de importación google.appengine.ext.webapp
 desde google.appengine.api importar correo
 importadores wsgiref.handlers

 # START Constantes
 CONTENT_TYPE_HEADER = "Tipo de contenido"
 CONTENT_TYPE_TEXT = "texto / plano"
 XML_CONTENT_TYPE = "application / xml"
 XML_ENCODING = "utf-8"
 ""
 Le permite especificar direcciones IP y "api_key" asociadas para evitar que otros usen su aplicación.
 Los métodos de almacenamiento y manipulación comprobarán esta "api_key" en los parámetros POST / GET.
 Los métodos de recuperación no lo usan (sin embargo, puede habilitarlos para que lo usen, pero quizás reescriba para tener una clave de "lectura" y una clave de "escritura" para evitar que otros manipulen sus datos).

 Configure "AUTH = False" para deshabilitarlo (permitiendo que cualquiera use su aplicación y CRUD sus datos).

 Para generar un hash / api_key visite https://www.grc.com/passwords.htm
 Para encontrar su ip visite http://www.whatsmyip.org/
 ""
 AUTH = {
     '000.000.000.000': 'JLQ7P5SnTPq7AJvLnUysJmXSeXTrhgaJ',
 }
 # END Constantes

 # START Manejo de excepciones
 error de clase (StandardError):
     pasar
 clase Prohibida (Error):
     pasar

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

 @ contextlib.contextmanager
 def mailExcpHandler (ctx):
     tratar:
         rendimiento {}
     excepto (ValueError), exc:
         xml_error_response (ctx, 400, 'app.invalid_parameters', 'Los parámetros indicados no son válidos:' + exc.message)
     excepto (Prohibido), exc:
         xml_error_response (ctx, 403, 'app.forbidden', 'No tienes permiso para realizar esta acción:' + mensaje de exclamación)
     excepto (Excepción), exc:
         xml_error_response (ctx, 500, 'system.other', 'Ha ocurrido un error inesperado en el servicio web:' + mensaje de exc.mexage)

 def xml_error_response (ctx, status, error_id, error_msg):
     ctx.error (estado)
     doc = Documento ()
     errorcard = doc.createElement ("error")
     errorcard.setAttribute ("id", error_id)
     doc.appendChild (tarjeta de error)
     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))
 # FIN Manejo de excepciones

 # START Métodos de ayuda
 def isAuth (ip = Ninguna, clave = Ninguna):
     si AUTH == Falso:
         volver verdadero
     elif AUTH.has_key (ip) y key == AUTH [ip]:
         volver verdadero
     más:
         falso retorno

 Métodos de ayuda # END


 # START Request Handlers
 clase Enviar (webapp.RequestHandler):
     def post (auto):
         ""
         Envía un correo electrónico basado en params POST.  Se pondrá en cola si los recursos no están disponibles en ese momento.

         Devuelve "éxito"

         POST Args:
             a: la dirección del destinatario
             de: la dirección del remitente (debe ser un correo electrónico registrado de GAE)
             asunto: asunto del correo electrónico
             cuerpo: contenido del cuerpo del email
         ""
         con mailExcpHandler (self):
             # cheque autorizado
             if isAuth (self.request.remote_addr, self.request.POST.get ('api_key')) == False:
                 boost Forbidden ("Credenciales inválidas")

             # leer los datos de la solicitud
             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

 Aplicación # START
 application = webapp.WSGIApplication ([
                                                                              ('/enviar enviar)
                                                                          ], debug = True)

 def main ():
     run_wsgi_app (aplicación)

 si __name__ == '__main__':
     principal()

 # Aplicación FIN

Eche un vistazo a los campos de mensajes de correo electrónico de la función send_mail .
Aquí está el parámetro que necesitas:

html
Una versión HTML del contenido del cuerpo, para los destinatarios que prefieren el correo electrónico HTML.

Debe agregar el parámetro de entrada html esta manera:

 #Your html body mail_html_body = '

Hello!

' # 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

puedes usar el campo html de la clase EmailMessage

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