Product
Store(): uma caixa de correio temporária para todos os seus e-mails de entrada
Os clientes nos procuraram recentemente com alguns casos de uso em que o armazenamento temporário de e-mails de entrada seria muito útil. Em alguns casos, os anexos são grandes e causam time-outs quando tentamos enviar os dados por POST para os servidores deles. Em outros casos, há um grande volume de e-mails de entrada e os clientes preferem apenas executar uma requisição GET em determinados intervalos em vez de ter que lidar com múltiplos POSTs nossos. Por fim, isso serve como redundância caso o web service deles caia e não consigam aceitar nossos POSTs.
Esses nos parecem bons motivos, por isso temos o prazer de anunciar a mais recente adição ao Mailgun, o Inbound Email Storage.
Armazenamento de mensagens pelo Routes
Você pode armazenar mensagens temporariamente (por até 3 dias) criando uma ação store() usando o Routes. Essa ação pode ser usada junto com as ações forward() ou stop() com qualquer filtro.
A ação store está disponível na aba Routes do painel de administração ou por meio da Routes API. Quando uma mensagem recebida corresponde a uma rota com uma ação store, essa mensagem e seus anexos são armazenados em nossos servidores por até 3 dias. Se você fornecer uma URL na ação store (usando a palavra-chave notify), enviaremos a mensagem recebida para ela por POST. Essa mensagem enviada por POST será parecida com as recebidas usando a ação forward , com exceção das seguintes mudanças.
- Os anexos não estarão disponíveis no parâmetro
attachment-x. Em vez disso, um blob JSON no parâmetro attachments conterá os links para os anexos. - O parâmetro
content-id-mapmuda de forma semelhante; agora os IDs mapeiam para as URLs dos anexos em vez dos próprios anexos. - O parâmetro
attachment-countnão estará disponível.
Aqui está um exemplo do parâmetro attachments.
[
{
"url":"https://api.mailgun.org/v2/domains/mydomain.com/messages/WyJhOTM4NDk1ODA3Iiw/attachments/0",
"content-type":"image/jpeg",
"name":"my-attachment.jpeg",
"size":7465
}
]
Você pode ver a lista completa de parâmetros na seção Armazenamento e recuperação de mensagens da nossa Manual do usuário.
Recuperação de mensagens pela Events API
Sempre que uma mensagem é armazenada, um evento stored é criado e pode ser recuperado por meio da Events API. Dessa forma, você pode recuperar todas as suas mensagens armazenadas mesmo se não fornecer uma URL de webhook na ação store. A URL para recuperar a mensagem armazenada estará nos dados retornados pela API. Ao usar essa URL para obter uma mensagem armazenada, você receberá um blob JSON com os mesmos parâmetros do webhook notify da ação store, mas os parâmetros token, timestamp e signature não estarão presentes. Exemplo de requisição:
import requests
r = requests.get("https://api.mailgun.net/v2/mydomain.com/events",
auth=("api", "key-kjdh236r897rkwejhd98-sdjk3"))
print r.json()['items'][0]['storage']['url']
'https://api.mailgun.net/v2/domains/mydomain.com/messages/WyJhOTM4NDk1ODA3Iiw'
Além de outros dados sobre o evento, é retornada uma URL onde você pode realizar o GET da mensagem. Por padrão, a mensagem recuperada será um blob JSON, mas se você definir o cabeçalho accept para message/rfc2822, poderá extrair o MIME bruto, incluindo os anexos. Você também pode aplicar um DELETE na mensagem por meio da API, o que sugerimos que faça assim que a recuperar (é sempre bom descartar o lixo :).
Aplicativo de exemplo
Para testar, escrevemos este simples aplicativo que permite visualizar os e-mails de status diário da nossa equipe pela linha de comando. Todos esses e-mails são enviados com uma Mailgun Mailing List, portanto, é fácil identificar quais mensagens armazenar: basta usar o alias da lista de e-mails. O código está abaixo:
from requests import get
from local import API_KEY
MY_DOMAIN = "mailgun.net"
MY_STATUS_LIST = "status-updates@mailgun.net"
EVENTS_API_URL = "https://api.mailgun.net/v2/{}/events".format(MY_DOMAIN)
def main():
response = get(EVENTS_API_URL,
auth=('api', API_KEY),
params={
"event": "stored"
})
events = response.json()
message_urls = [event['storage']['url'] for event in events['items']
if MY_STATUS_LIST in event['message']['recipients']]
for url in message_urls:
message = get(url,
auth=('api', API_KEY)).json()
print "From: ", message['from']
print '--------------------------- {} --------------------------------'.format(message['subject'])
print message['body-plain']
if __name__ == "__main__":
main()
Esperamos que você considere esse novo recurso útil. Como sempre, se tiver algum feedback, não deixe de nos avisar!
Bom envio!
Os Mailgunners