parsing - header 解析+MIME

标签 parsing erlang smtp mime

在使用 Erlang 解析 MIME 时,我能够提取 header 、正文和附件。所以现在我必须分别解析所有这些部分。

标题结构:

Header-tag : header-value\n

例子:

Delivered-To: xyz@geodesic.com\nReceived: by 1.gnu.geodesic.net (fdm 1.5, account "mail");\n\tFri, 03 Jul 2009 16:56:03 +0530\n

所以从上面的例子中我必须提取Delivered-To: koushik.narayanan@geodesic.com and Received: by 1.gnu.geodesic.net (fdm 1.5, account "mail ");\n\tFri, 03 Jul 2009 16:56:03 +0530\n 使用某种方式与 \n 拆分。但是第二个 header 的值包含 \n\t 所以拆分到此为止...我想要一个严格的拆分,它只会与 \n 拆分。

提前致谢。

最佳答案

顺便说一句,MIME header (几乎?)与 HTTP header 相同,因此您可以使用 Erlang 的内置 HTTP 解码:(数据必须是二进制,而不是字符串)

3> erlang:decode_packet(httph, <<"Delivered-To: xyz@geodesic.com\nReceived: by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530\n">>, []).
{ok,{http_header,0,"Delivered-To",undefined,
                 "xyz@geodesic.com"},
    <<"Received: by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530\n">>}
4> Rest = element(3, v(-1)).

对了,得到了http_header记录中的第一个header,以及剩下的数据。

<<"Received: by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530\n">>
5> erlang:decode_packet(httph, Rest, []).
{more,undefined}

但是由于解码器无法在看不到下一行的情况下知道标题行是否在下一行继续,所以这是行不通的。我们需要添加最后一个空行:

6> erlang:decode_packet(httph, <<Rest/binary, "\r\n">>, []).
{ok,{http_header,0,"Received",undefined,
                 "by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530"},
    <<"\r\n">>}

当剩下所有内容时,我们得到 http_eoh:

7> erlang:decode_packet(httph, <<"\r\n">>, []).
{ok,http_eoh,<<>>}

希望对您有所帮助...

关于parsing - header 解析+MIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1080457/

相关文章:

java - JSON 使用 GSON-Library : Error Expected BEGIN_OBJECT but was STRING

javascript - 将正则表达式转换为掩码输入 - Javascript

c++ - 解析标识符但排除 BOOST Spirit 中的保留字

erlang - 如何让进程在 Erlang 中并行运行?

go - 如何将此示例代码从 Go 转换为 Erlang

erlang - Mnesia 查询游标 - 在实际应用中使用它们

javascript - 如何在我的 Node.js 脚本中从我的 Gmail 帐户发送电子邮件?

c - 从微 Controller 发送smtp电子邮件

c++ - X3 : How to create parser to read in sets?

go - 为什么我不能从托管在 GCP 中的应用程序使用 Gmail SMTP 发送电子邮件?