如何使用 Elixir 从 Mailgun 中邮寄的存储中获取附件

How to get the attachment from storage mailed in Mailgun with Elixir

我已从 Mailgun 中存储的电子邮件中提取附件。

https://sw.api.mailgun.net/v3/domains/xxxx.com/messages/AgEFb9QUzk8HBO7pSwVMB6qZaW0hSig8ZA==

现在我需要一种方法来将其下载到我服务器上的文件中。

url = "https://api:key-81c9c48ae617bc0d2@sw.api.mailgun.net/v3/domains/xxxx.com/messages/AgEFb9QUzk8HBO7pSwVMB6qZaW0hSig8ZA=="

headers = ["Accept": "message/rfc2822"]

{:ok, response} =  HTTPoison.get(url, headers)

结果:

%HTTPoison.Response{
  body: "{\"body-mime\": \"X-Mailgun-Incoming: Yes\r\nX-Envelope-From:....}

{:ok, decoded} = response.body |> Poison.decode

iex(14)> Map.keys(decoded)

["Content-Type", "Date", "Dkim-Signature", "From", "Message-Id", "Mime-Version",
 "Received", "Subject", "To", "X-Envelope-From", "X-Gm-Message-State",
 "X-Google-Dkim-Signature", "X-Google-Smtp-Source", "X-Mailgun-Incoming",
 "X-Received", "body-mime", "from", "recipients", "sender", "subject"]

从上面只有"body-mime"是有道理的所以:

当我 decoded["body-mime"] 出去时,只有一大堆文本,里面有整封电子邮件。

所以我想我哪里出错了。

没有这方面的文档,或者我找不到!!!

你的url是附件的url吗?

如果是这样,您可以使用 File.write 将文件实际保存到您的服务器。

例如,如果附件是图片。

%HTTPoison.Response{body: body} = HTTPoison.get!(url)

File.write!("/tmp/image.png", body)

如果您的 url 实际上只是电子邮件本身,则回复中应该有一个 attachments 给出附件的 URL,您仍然可以按照描述获取以上。

Mailgun API documentationbody-mime:

full MIME envelope. You will need a MIME parsing library to process this data.

一个这样的库是https://github.com/DockYard/elixir-mail。你应该能够得到这样的附件:

decoded["body-mime"] |> Mail.Parsers.RFC2822.parse() |> Mail.get_attachments()