지금 작성을 끝내려고 하는 스크립트에서는 현재 사용자의 사서함에서 읽지 않은 가장 오래된 메시지를 가져와야 합니다(특히 해당 항목의 제목 줄이 필요합니다).
가장 오래된 메시지를 추출한 후 보관을 위해 다른 사용자에게 전달해야 합니다.
어떻게 추출할 수 있나요?오직bash 또는 Python의 정보?
사용하면 더 좋겠죠?프로그램 메일제목 줄을 파일로 추출한 다음 메시지를 전달하고 스크립트에서 파일을 처리하도록 하시겠습니까? 그렇다면 어떻게 해야 합니까?
답변1
기존 시스템에서는 정의에 따라 mbox
첫 번째 메시지는 읽지 않았으며 사용 가능한 가장 오래된 메시지입니다./var/mail/you
formail -zxSubject: -1 -s </var/mail/you
메시지를 파일로 추출하고(편리하게 메시지를 전달할 수 있도록) 헤더를 추출하려면 Subject:
다음과 같이 시도하십시오.
tmp=$(maketemp -t findoldestunread.XXXXXXXX) || exit 127
trap 'rm -f $tmp' EXIT # remove temp file when done
trap 'exit 1' 1 2 3 5 15 # remove also in case of error / interruption
formail -1 -s </var/mail/you >"$tmp"
formail -zxSubject: <"$tmp"
sendmail -oi [email protected] <"$tmp"
Maildir에서는 상황이 약간 더 복잡합니다. 새 메시지는 에 임시 저장된 tmp
후 로 이동됩니다 cur
. 파일 이름은 플래그를 나타냅니다.그 많은 말로S
, 쉼표 뒤의 문자 가 아닌 끝 부분에 쉼표가 포함된 파일 이름을 찾습니다 .
find path/to/Maildir/cur -maxdepth 1 -type f \
-regex '.*,[^S,]*$' -printf '%C@ %p\n' |
sort | sed '1s/^[^ ]* //;q' | xargs formail -zxSubject:
형식 printf
지정자는 정렬을 용이하게 하기 위해 타임스탬프를 먼저 인쇄합니다. 정렬하고, 첫 번째 행을 잡고, 타임스탬프를 다듬고, 헤더를 formail
추출하기 위해 피드합니다. Subject:
(개행 문자 등이 포함된 펑키한 파일 이름이 있는 경우 분명히 문제가 발생할 수 있습니다. 이 문제를 해결할 수 있는 방법이 있지만 여기서는 게으르고 실용적입니다.)
이 경우 파일 이름만 인쇄하는 리팩토링은 간단해야 합니다. 파이프를 제거하고 xargs
출력을 변수에 캡처하기만 하면 됩니다.
일부 Maildir 구현에는 일종의 색인이 있어 파일 시스템의 전체 편지함을 순회하는 것보다 이 작업을 더 쉽고 빠르게 할 수 있지만, 어떤 구현을 사용하고 있는지에 대해 더 자세히 알지 못하면 이는 단지 추측일 뿐입니다. 그 순간.
귀하의 이메일이 이러한 형식 중 하나가 아닌 경우 (이상한 것 같습니다) 더 자세한 내용으로 질문을 업데이트해야 합니다.
귀하의 인용문은 mail
귀하가 전통적인 Berkeley 시스템을 사용하고 있음을 암시 mbox
하지만 버전이 많고 그 중 일부는 다소 난해합니다.
답변2
이 mail
명령은 비대화식으로 사용하여 받은 편지함에 있는 이메일 목록을 인쇄할 수 있습니다.
mail -H | head -1
>U 1 [email protected] Tue Apr 29 14 08:13 18/774 "Subject of mail"
답변3
이메일 전달 형식에는 최소한 세 가지가 있습니다. 어떤 것을 사용하고 있는지 아는 것이 도움이 됩니다.
formail
메일 파일을 읽고 건너뛰기 및 전체 옵션을 사용하여 특정 메시지의 헤더를 출력할 수 있습니다. 이는 메시지가 알려진 파일로 전달되었다고 가정합니다. 모든 메시지를 보관하고 싶다면 이 도구가 적합한 도구가 될 것입니다.
procmail
메시지가 도착하면 보관하는 것이 좋습니다. 배송 시 사본을 다른 주소로 보내도록 쉽게 구성할 수 있습니다. 메일 잠금을 방지하고 특정 유형의 메시지를 건너뛰는 몇 가지 표준 방법이 있습니다.