헤더에 첫 번째 릴레이 메일 서버 나열

헤더에 첫 번째 릴레이 메일 서버 나열

메시지는 완전한 헤더와 함께 텍스트 파일에 저장됩니다. (이 파일은 Thunderbird 메일 클라이언트의 받은 편지함에 있습니다. 파일 형식은 다음과 같습니다.Mboxted다양성. )

받은 편지함에 도달하기 전에 각 메시지가 통과하는 첫 번째 서버를 나열하는 방법은 무엇입니까? "수신됨" 줄에는 이메일이 통과한 서버가 나열됩니다. "수신됨" 줄을 아래에서 위로 읽습니다. 결론은 개시자입니다.

한 가지 옵션은 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스크립트가 한 번에 하나의 메시지를 처리한다는 점을 고려하면 다음과 같습니다.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
}'

(검증되지 않은).

그러면 일치하는 첫 번째 행이 추출됩니다. 이것이 첫 번째 점프인지 여부는 또 다른 문제입니다. 내용의 구조는 다를 수 있습니다.

관련 정보