ヘッダーに最初のリレーメールサーバーを一覧表示する

ヘッダーに最初のリレーメールサーバーを一覧表示する

メッセージは、完全なヘッダーとともにテキストファイルに保存されます。 (このファイルはThunderbirdメールクライアントの受信トレイにあります。ファイル形式は次のとおりです。Mboxted多様性。 )

受信トレイに到達する前に各メッセージが通過する最初のサーバーを一覧表示する方法は? 「受信済み」行には、電子メールが通過したサーバーが一覧表示されます。 「受信済み」行を下から上に読みます。結論はイニシエータです。

1 つのオプションはsed、、、grepなどによるawkテキスト処理のためのカスタムスクリプトです。また、メールアナライザを検索して見つけました。電子メールヘッダーアナライザ(MHA)メールディレクトリツールそしてnmh - メッセージ処理システム。まず、電子メールを配信するサーバーのリストを完成させるために、これらのツールのいずれかを使用してファイルを照会する方が簡単ですか?

答え1

発生する状況に応じて、mboxファイルをその構成メッセージの近似値に分割します。~から(コロンなし)。次にコレクション全体を繰り返し、最後のコレクションを選択します。受け取ったそれぞれのタイトル。

mbox=/path/to/mbox/file

mkdir xx
(
    cd xx
    csplit -ksz -n5 "$mbox" '/^From /' '{*}'

    for m in *
    do
        awk '
            /^\r?$/ { gsub(/[\r\n[:space:]]+/, " ", received); print received; exit }
            /^[^[:space:]]/ { flag = 0 }
            /^Received:/ { received = $0; flag = 1 }
            /^[[:space:]]/ && flag { received = received " " $0 }
        ' "$m"
    done
)
rm -rf xx

元のmboxファイルを読むことは難しくありませんがawk、ソリューションの作成を始めたときにメッセージを使用していました。シェルループを使用するよりもこのソリューションを拡張する方が簡単ですが、振り返ってみると、awkおそらくどちらも約60:40に過ぎませんでした。

awkスクリプトが一度に1つのメッセージを処理することを考えると、次のようになります。formail(もともとはコメントからprocmailコレクション)を使用してmbox形式のファイルからのメッセージを繰り返すことができます。

formail < "$mbox" -s awk '....'

答え2

awk '/^Received: / {
   LASTREAD=$0
   exit
}
/^\r{0,1}$/ {
   if "" == LASTREAD {
      exit 1
   }
   print LASTREAD
   exit 0
}
END {
   if "" == LASTREAD {
      exit 1
   }
   print LASTREAD
}'

(検証されていません)。

これにより、一致する最初の行が抽出されます。これが最初のジャンプかどうかは別の問題です。内容の構造は異なる場合があります。

関連情報