在使用 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/