Recibir correo electrónico

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

El correo electrónico entrante genera solicitudes HTTP, que se pasan a las secuencias de comandos adecuadas. Las secuencias de comando que controlan el correo electrónico entrante deben residir en su servicio predeterminado.

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

Configurar tu aplicación para recibir correo electrónico

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

  1. Agrega una sección inbound_services que habilite el servicio de correo electrónico entrante. Por ejemplo:

    inbound_services:
    - mail

    Si no habilitas el correo electrónico entrante cuando incluyas esta sección en tu archivo de configuración, el correo electrónico entrante se inhabilitará y se omitirán los mensajes de correo electrónico enviados a la aplicación.

  2. Agrega asignaciones que asocien direcciones de correo electrónico asignadas mediante URL con controladores de secuencia de comandos.

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

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

    Para los servicios no predeterminados, la dirección de correo electrónico tiene el siguiente formato:

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

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

    /_ah/mail/[ADDRESS]
    

    Para controlar el correo electrónico entrante en tu app, asigna las URL de correo electrónico a los 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 electrónicos dirigidos a la aplicación. Si lo prefieres, puedes configurar varios controladores para diferentes direcciones de correo electrónico, como en el ejemplo siguiente:

    - 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 URL de los mensajes de correo electrónico entrantes se comparan con esta lista del primero al último, por lo que, si la URL de un mensaje de correo electrónico coincide con más de un patrón, el primer controlador coincidente será el que se ejecute. Esto te permite incluir un controlador "genérico" como la última asignación. Los controladores se ejecutan en el módulo predeterminado (o en la versión de la aplicación).

Controla el correo electrónico entrante

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

Para usar InboundMailHandler, ingresa el siguiente comando:

  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 como esta:

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 mapping() práctico que muestra una sincronización combinada de todas las direcciones de correo electrónico entrantes con el controlador de correo y, por supuesto, puedes llamarlo en cualquier subclase InboundMailHandler de tu código:

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

El objeto InboundEmailMessage (mail_message en este ejemplo) contiene el mensaje de correo electrónico. Su método bodies() muestra los cuerpos dentro del mensaje. Si llamas a bodies() sin argumentos, muestra un iterador que genera primero los cuerpos HTML y, luego, los 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 mensajes:

  • subject contiene el asunto del mensaje.
  • sender es la dirección del remitente, p.Ej., "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 separada por comas de los destinatarios de cc, por ejemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
  • date muestra la fecha del mensaje.
  • attachments es una lista de objetos Attachment, posiblemente vacía.
  • original es el mensaje completo, incluidos los datos no expuestos por los demás campos, como los encabezados de correo electrónico, como un email.message.Message de Python.

Simular mensajes entrantes con el servidor de desarrollo local

Cuando configures tu aplicación para controlar el correo electrónico entrante, puedes usar la consola del servidor de desarrollo para simular los mensajes de correo electrónico entrantes:

  1. Para acceder al servidor de desarrollo como administrador, ve a http://localhost:8080/console y selecciona Acceder como administrador.
  2. En el servidor de desarrollo, haz clic en Correo entrante en el navegador.
  3. Rellena el formulario que aparece y haz clic en Enviar correo electrónico.

    Para obtener más información, incluso cómo conseguir que el servidor de desarrollo se ejecute, consulta el Servidor de desarrollo de Python.