仕様で正式に定義されているRFC822 (SMTP)の「Received」行の要素を解析したい。
アトム = 1* [...] 受け取った=「受け取った」「:」; リレーごとに 1 つ [「から」のドメイン] ; 送信ホスト [「ドメイン別」] ; 受信ホスト [「アトム経由」] ; 物理パス *("with" アトム) ; リンク/メールプロトコル ["id" msg-id] ; 受信者のメッセージ ID ["for" addr-仕様]; 初期形 ";" 日付時刻 ; 受け取った時間 [...] msg-イド=「」; 一意のメッセージ ID [...] addr-spec = ローカル部分「@」ドメイン。グローバル アドレス ドメイン、日時など
実際の例を次に示します。
受け取ったもの: ll-194.132.162.89.kv.sovam.net.ua (ll-194.132.162.89.kv.sovam.net.ua [83.170.243.194] (偽造されている可能性があります)) から raq2073.uk2.net (8.10. 2/8.10.2) <johnsmithsvt@matts.co.uk> の ESMTP ID lASHDDE10765 を使用。2007 年 11 月 28 日水曜日 17:13:13 GMT
正規表現は、受信した行の一部をキャプチャするための優れた戦略でしょうか?
多くの SMTP サーバーが受信した行を適切にフォーマットしていないことを認識しています (実際には)。
それ以外の場合、これをうまく行うJavaのライブラリを知っている人はいますか?
編集これは、私がしばらく試した正規表現とテストを示すフィドルです。これは機能しているようです。
Received:\s+(?:from\s+(.+?))?(?:\(qmail (.+?)\))?(?:\s+by\s+(.+?))?(?:\\s+via\s+(.+?))?(?:\s+with\s+(.+?))?(?:\;?\s+id\s+(.+?))?(?:\s+for\s+(.+?))?(?:;\s*(?!.*\;.*)(.+))?$