Como receber e-mail

As mensagens de e-mail enviadas para seu aplicativo 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 seu aplicativo e inclua os gerenciadores no código do aplicativo.

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 aplicativo, o recebimento de e-mail está desativado por padrão. Para ativar o recebimento de e-mail, é preciso modificar o arquivo app.yaml no seu serviço padrão.

  1. Adicione uma seção inbound_services, que habilita o serviço de recebimento de e-mail. Por 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.

    Seu aplicativo pode receber e-mails em endereços com o seguinte formato:

    [STRING]@[GCP project ID].appspotmail.com
    

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

    /_ah/mail/[ADDRESS]
    

    Para gerenciar e-mails recebidos no seu aplicativo, 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 enviados para o aplicativo. Se você preferir, configure vários gerenciadores para diferentes endereços de e-mail, como no exemplo abaixo:

    - 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 processar os e-mails recebidos

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

Para usar o InboundMailHandler, siga estes passos:

  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 assim:

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 conveniente método de classe mapping() que retorna para o gerenciador de e-mails um par correspondente a todos os endereços de e-mail recebidos. Você pode, claro, chamá-lo em qualquer subclasse de InboundMailHandler que 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() dele retorna os corpos dentro da mensagem. Se você chamar bodies() sem argumentos, ele retornará um iterador que produz corpos HTML primeiro e depois corpos de texto simples. Para apenas HTML ou apenas texto simples, pode ser passado 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, por exemplo, "Nobody <nobody@example.com>".
  • to é uma lista separada por vírgulas dos principais destinatários da mensagem, por exemplo "Joe <joe@example.com&gt, Bill <bill@example.com>".
  • cc contém uma lista separada por vírgulas dos destinatários copiados nas mensagens, por exemplo, "Joe <joe@example.com&gt, 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 pelos outros campos, como cabeçalhos de e-mail, como um Python email.message.Message.

Como simular mensagens recebidas com o 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 para http://localhost:8080/_ah/login e selecione 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.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Python 2