Recepción de correo electrónico

Los mensajes de correo electrónico que se envían a tu aplicación se implementan como solicitudes HTTP que contienen datos MIME. Para procesar los mensajes de correo entrantes, asocia direcciones de correo electrónico a controladores de secuencias de comandos en la configuración de tu aplicación y, a continuación, incluye los controladores en el código de la aplicación.

El correo entrante genera solicitudes HTTP, que se transfieren a las secuencias de comandos correspondientes. Las secuencias de comandos que gestionan el correo entrante deben residir en tu servicio predeterminado.

Para obtener más información sobre el servicio de correo, consulta la descripción general de la API Mail.

Configurar tu aplicación para recibir correos

Cuando creas una nueva aplicación, el correo electrónico entrante se encuentra inhabilitado de forma predeterminada. Para habilitar el correo entrante, debes modificar el archivo app.yaml de tu servicio predeterminado.

  1. Añade una sección inbound_services que habilite el servicio de correo entrante. Por ejemplo:

    inbound_services:
    - mail

    Si no habilitas el correo entrante incluyendo esta sección en tu archivo de configuración, el correo entrante se inhabilitará y los mensajes de correo enviados a la aplicación se ignorarán.

  2. Añade asignaciones que asocien direcciones de correo electrónico asignadas a URL con los controladores de secuencias de comandos.

    En el servicio predeterminado, la dirección de correo para recibir correos tiene el siguiente formato:

    [STRING]@[Google Cloud project ID].appspotmail.com
    

    En el caso de los servicios no predeterminados, la dirección de correo tiene el siguiente formato:

    [STRING]@[servicename]-dot-[Google Cloud project ID].appspotmail.com
    

    Los mensajes de correo se envían a tu aplicación como solicitudes HTTP POST mediante la siguiente URL, donde [ADDRESS] es una dirección de correo completa, incluido el nombre de dominio:

    /_ah/mail/[ADDRESS]
    

    Para gestionar el correo entrante en tu aplicación, asigna URLs de correo a controladores en el archivo app.yaml:

    - url: /_ah/mail/.+
      script: handle_incoming_email.app
      login: admin

    En el ejemplo anterior, /_ah/mail/.+ coincide con todos los correos dirigidos a la aplicación. Si lo prefieres, puedes configurar varios controladores para diferentes direcciones de correo, como en el siguiente ejemplo:

    - url: /_ah/mail/owner@.*your_app_id\.appspotmail\.com
      script: handle_owner.app
      login: admin
    - url: /_ah/mail/support@.*your_app_id\.appspotmail\.com
      script: handle_support.app
      login: admin
    - url: /_ah/mail/.+
      script: handle_catchall.app
      login: admin

    Las URLs de los mensajes de correo entrantes se comparan con esta lista de la primera a la última, por lo que, si la URL de un mensaje de correo coincide con más de un patrón, se ejecutará el primer controlador que coincida. De esta forma, puedes incluir un controlador "catchall" como última asignación. Los controladores se ejecutan en el módulo predeterminado (o en la versión de la aplicación).

Gestionar el correo entrante

El SDK de Python define InboundMailHandler, una clase de aplicación web para gestionar el correo entrante. InboundMailHandler está incluido en el paquete google.appengine.ext.webapp.mail_handlers.

Para usar InboundMailHandler:

  1. Crea una subclase para InboundMailHandler y anula el método receive().
  2. Llama al método receive() con un argumento de clase InboundEmailMessage, definido por el SDK de Python.

Por ejemplo, puedes crear una instancia de InboundEmailMessage de esta forma:

import logging

from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
import webapp2


class LogSenderHandler(InboundMailHandler):
    def receive(self, mail_message):
        logging.info("Received a message from: " + mail_message.sender)

InboundMailHandler contiene un método de clase de conveniencia mapping() que devuelve un par que coincide con todas las direcciones de correo entrantes con el controlador de correo. Por supuesto, puedes llamarlo en cualquier subclase de InboundMailHandler que codifiques:

app = webapp2.WSGIApplication([LogSenderHandler.mapping()], debug=True)

El objeto InboundEmailMessage (mail_message en este ejemplo) contiene el mensaje de correo. Su método bodies() devuelve los cuerpos del mensaje. Si llamas a bodies() sin argumentos, devuelve un iterador que genera primero los cuerpos HTML y, después, los cuerpos de texto sin formato. Si solo quieres HTML o texto sin formato, puedes pasar un argumento a bodies():

plaintext_bodies = mail_message.bodies('text/plain')
html_bodies = mail_message.bodies('text/html')

for content_type, body in html_bodies:
    decoded_html = body.decode()
    # ...

El objeto InboundEmailMessage incluye atributos para acceder a otros campos de mensaje:

  • subject contiene el asunto del mensaje.
  • sender es la dirección del remitente, por ejemplo, "Nobody <nobody@example.com>".
  • to es una lista separada por comas de los destinatarios principales del mensaje, por ejemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
  • cc contiene una lista de destinatarios de copia separada por comas, por ejemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
  • date devuelve la fecha del mensaje.
  • attachments es una lista de objetos Attachment, que puede estar vacía.
  • original es el mensaje completo, incluidos los datos que no se muestran en los demás campos, como las cabeceras de correo, en formato Python email.message.Message.

Simular mensajes entrantes con el servidor de desarrollo local

Una vez que hayas configurado tu aplicación para gestionar el correo entrante, puedes usar la consola del servidor de desarrollo para simular mensajes de correo entrantes:

  1. Accede al servidor de desarrollo como administrador. Para ello, ve a http://localhost:8080/console y selecciona Iniciar sesión como administrador.
  2. En el servidor de desarrollo, haz clic en Inbound Mail (Correo entrante) en el menú de navegación.
  3. Rellena el formulario que aparece y haz clic en Enviar correo.

    Para obtener más información, incluido cómo ejecutar el servidor de desarrollo, consulta Servidor de desarrollo de Python.