【问题标题】:Header parsing + MIME标头解析 + MIME
【发布时间】:2010-11-08 00:05:39
【问题描述】:

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

标题结构:

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.comReceived: by 1.gnu.geodesic.net (fdm 1.5, account "mail");\n\tFri, 03 Jul 2009 16:56:03 +0530\n 使用某种方式与\n 分割。但是第二个标头的值包含\n\t,所以拆分停在那里......我想要一个严格的拆分,它只会与\n拆分。

提前致谢。

【问题讨论】:

    标签: parsing erlang smtp mime


    【解决方案1】:

    顺便说一句,MIME 标头(几乎?)与 HTTP 标头相同,因此您可以使用 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,<<>>}
    

    希望对您有所帮助……

    【讨论】:

      【解决方案2】:

      你的意思是这样的吗?

      split(String) ->
        split(String, [], []).
      
      
      split([], [], Result) ->
        lists:reverse(Result);
      
      split([], Buffer, [{Key}|Result]) ->
        split([], [], [{Key, lists:reverse(Buffer)}|Result]);
      
      split("\n\t" ++ String, Buffer, Result) ->
        split(String, "\t\n" ++ Buffer, Result);
      
      split("\n" ++ String, Buffer, [{Key}|Result]) ->
        split(String, [], [{Key, lists:reverse(Buffer)}|Result]);
      
      split(": " ++ String, Buffer, Result) ->
        split(String, [], [{lists:reverse(Buffer)}|Result]);
      
      split([C|String], Buffer, Result) ->
        split(String, [C|Buffer], Result).
      

      这是您输入标题的结果:

      > split("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","xyz@geodesic.com"},
       {"Received",
        "by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530"}]
      

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 2013-02-09
        • 2016-06-09
        • 2014-03-15
        • 2019-10-08
        • 2010-09-09
        • 1970-01-01
        • 2010-11-05
        相关资源
        最近更新 更多