Receber email

As mensagens de email enviadas para a sua app são implementadas como pedidos HTTP que contêm dados MIME. Para processar mensagens de email recebidas, associa endereços de email a processadores de scripts na configuração da app e, em seguida, inclui os processadores no código da app.

O email recebido gera pedidos HTTP, que são transmitidos aos scripts adequados. Os scripts que processam o email recebido têm de residir no seu serviço predefinido.

Para mais informações sobre o serviço de correio, consulte a vista geral da API Mail.

Configurar a sua aplicação para receber emails

Quando cria uma nova app, o email recebido está desativado por predefinição. Para ativar o email recebido, tem de modificar o ficheiro app.yaml no seu serviço predefinido.

  1. Adicione uma secção inbound_services que ative o serviço de email recebido. Por exemplo:

    inbound_services:
    - mail

    Se não ativar o email recebido incluindo esta secção no ficheiro de configuração, o email recebido é desativado e as mensagens de email enviadas para a app são ignoradas.

  2. Adicione mapeamentos que associam endereços de email mapeados por URL a controladores de scripts.

    Para o serviço predefinido, o endereço de email para receber emails tem o seguinte formato:

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

    Para serviços não predefinidos, o endereço de email tem o seguinte formato:

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

    As mensagens de email são enviadas para a sua app como pedidos HTTP POST através do seguinte URL, em que [ADDRESS] é um endereço de email completo, incluindo o nome do domínio:

    /_ah/mail/[ADDRESS]
    

    Para processar emails recebidos na sua app, mapeie os URLs de email para processadores no ficheiro app.yaml:

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

    No exemplo acima, /_ah/mail/.+ corresponde a todos os emails enviados para a app. Se preferir, pode configurar vários controladores para diferentes endereços de email, como no exemplo seguinte:

    - 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

    Os URLs das mensagens de email recebidas são comparados com esta lista do primeiro ao último. Por isso, se um URL de uma mensagem de email corresponder a mais do que um padrão, o processador correspondente executado é o primeiro. Isto permite-lhe incluir um controlador "catchall" como o último mapeamento. Os controladores são executados no módulo predefinido (ou na versão da aplicação).

Processamento de emails recebidos

O SDK Python define InboundMailHandler, uma classe de app Web para processar emails recebidos. InboundMailHandler está no pacote google.appengine.ext.webapp.mail_handlers.

Para usar a app InboundMailHandler:

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

Por exemplo, pode criar uma instância de InboundEmailMessage da seguinte 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 contém um método de classe de conveniência mapping() que devolve um par que corresponde a todos os endereços de email recebidos ao controlador de email e, naturalmente, pode chamá-lo em qualquer subclasse de InboundMailHandler que codifique:

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

O objeto InboundEmailMessage (mail_message neste exemplo) contém a mensagem de email. O respetivo método bodies() devolve os corpos na mensagem. Se chamar bodies() sem argumentos, devolve um iterador que produz primeiro corpos HTML e, em seguida, corpos de texto simples. Se quiser apenas HTML ou apenas texto simples, pode transmitir 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 aceder a outros campos de mensagens:

  • subject contém o assunto da mensagem.
  • sender é a morada do remetente, por exemplo, "Nobody <nobody@example.com>".
  • to é uma lista separada por vírgulas dos destinatários principais da mensagem, por exemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
  • cc contém uma lista separada por vírgulas dos destinatários em CC, por exemplo, "Joe <joe@example.com>, Bill <bill@example.com>".
  • date devolve a data da mensagem.
  • attachments é uma lista de Attachment objetos, que pode estar vazia.
  • original é a mensagem completa, incluindo dados não expostos pelos outros campos, como cabeçalhos de email, como um email.message.Message do Python.

Simular mensagens recebidas com o servidor de desenvolvimento local

Depois de configurar a sua app para processar emails recebidos, pode usar a consola do servidor de desenvolvimento para simular mensagens de email recebidas:

  1. Aceda ao servidor de desenvolvimento como administrador acedendo a http://localhost:8080/console e selecionando Iniciar sessão como administrador.
  2. No servidor de desenvolvimento, clique em Correio recebido na navegação.
  3. Preencha o formulário apresentado e clique em Enviar email.

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