3

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.comして使用する必要があります。しかし、2番目のヘッダーの値には含まれているため、分割はそこで停止します... でのみ分割される厳密な分割が必要です。Received: by 1.gnu.geodesic.net (fdm 1.5, account "mail");\n\tFri, 03 Jul 2009 16:56:03 +0530\n\n\n\t\n

前もって感謝します。

4

2 に答える 2

4

ちなみに、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と残りのデータを取得しました。

<<"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,<<>>}

お役に立てば幸いです…</p>

于 2009-07-06T12:48:10.547 に答える
1

このような意味ですか?

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"}]
于 2009-07-27T18:15:04.210 に答える