Como receber e-mail

As mensagens de e-mail enviadas para seu app são implementadas como solicitações HTTP contendo dados MIME. Para processar as mensagens de e-mail recebidas, associe os endereços de e-mail aos gerenciadores de script na configuração do app e inclua os gerenciadores no código do app.

O e-mail recebido gera solicitações HTTP, que são passadas aos scripts apropriados. Os scripts que gerenciam os e-mails recebidos precisam residir em seu serviço padrão.

Para mais informações sobre o serviço de e-mail, consulte a Visão geral da API Mail.

Como configurar o aplicativo para receber e-mails

Quando você cria um novo app, o recebimento de e-mail está desativado por padrão. Para ativar o recebimento de e-mail, é preciso modificar o arquivo app.yaml em seu serviço padrão.

  1. Adicione uma seção inbound_services que ative o serviço de recebimento de e-mail. Exemplo:

    inbound_services:
    - mail

    Se você não ativar o recebimento de e-mail incluindo essa seção no seu arquivo de configuração, o recurso será desativado e as mensagens de e-mail enviadas para o aplicativo serão ignoradas.

  2. Adicione mapeamentos que associem os endereços de e-mail mapeados por URL aos gerenciadores de script.

    Para o serviço padrão, o endereço de e-mail de recebimento tem este formato:

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

    Para serviços não padrão, o endereço de e-mail tem este formato:

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

    As mensagens de e-mail são enviadas para seu app como solicitações POST HTTP usando o URL a seguir, em que [ADDRESS] é um endereço de e-mail completo, incluindo o nome do domínio:

    /_ah/mail/[ADDRESS]
    

    Para manipular os e-mails recebidos em seu app, mapeie os URLs de e-mail para os gerenciadores no arquivo app.yaml:

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

    No exemplo acima, /_ah/mail/.+ corresponde a todos os e-mails endereçados ao app. Se preferir, configure vários gerenciadores para endereços de e-mail diferentes, como no exemplo a seguir:

    - 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

    URLs de mensagens de e-mail recebidas são comparados a essa lista, do primeiro ao último, e se o URL de uma mensagem de e-mail corresponder a mais de um padrão, o primeiro gerenciador correspondente será o executado. Isso possibilita incluir um gerenciador "pega-tudo" como o último mapeamento. Os gerenciadores são executados no módulo padrão (ou versão do aplicativo).

Como manipular os e-mails recebidos

O SDK do Python define InboundMailHandler, uma classe webapp para manipular e-mails recebidos. InboundMailHandler está no pacote google.appengine.ext.webapp.mail_handlers.

Para usar InboundMailHandler:

  1. Crie uma subclasse para InboundMailHandler e modifique o método receive().
  2. Chame o método receive() com um argumento da classe InboundEmailMessage, definido pelo SDK do Python.

Por exemplo, é possível criar uma instância 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 contém um método de classe de conveniência mapping(), que retorna ao gerenciador de e-mails um par correspondente a todos os endereços de e-mail recebidos. É possível, claro, chamá-lo em qualquer subclasse de InboundMailHandler que você codificar:

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

O objeto InboundEmailMessage (mail_message neste exemplo) contém a mensagem de e-mail. O método bodies() retorna os corpos dentro da mensagem. Se você chamar bodies() sem argumentos, ele retornará um iterador que produz corpos HTML primeiro e, em seguida, corpos de texto simples. Se quiser apenas HTML ou apenas texto simples, passe um argumento para 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()
    # ...

O objeto InboundEmailMessage inclui atributos para acessar outros campos de mensagens:

  • subject contém o assunto da mensagem.
  • sender é o endereço do remetente, como "Nobody <nobody@example.com>".
  • to é uma lista separada por vírgulas dos principais destinatários da mensagem, por exemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
  • cc contém uma lista separada por vírgulas dos destinatários cc, por exemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
  • date retorna a data da mensagem.
  • attachments é uma lista de objetos Attachment, possivelmente vazia.
  • original é a mensagem completa, incluindo dados não expostos por outros campos, como cabeçalhos de e-mail, na forma de email.message.Message do Python (em inglês).

Como simular mensagens recebidas no servidor de desenvolvimento local

Depois de definir o aplicativo para processar o recebimento de e-mail, é possível usar o console do servidor de desenvolvimento para simular mensagens de e-mail recebidas.

  1. Acesse o servidor de desenvolvimento como administrador. Para isso, navegue até http://localhost:8080/console e clique em Fazer login como administrador.
  2. No servidor de desenvolvimento, clique em E-mail de entrada na navegação.
  3. Preencha o formulário exibido e clique em Enviar e-mail.

    Para saber mais, inclusive como executar o servidor de desenvolvimento, consulte o servidor de desenvolvimento Python.