콘텐츠에 따라 하나의 받은 편지함에서 다른 두 개의 받은 편지함으로 이메일을 분할합니다.

콘텐츠에 따라 하나의 받은 편지함에서 다른 두 개의 받은 편지함으로 이메일을 분할합니다.

Postfix 및/또는 procmail 또는 기타 소프트웨어를 통해 하나의 받은편지함에서 다른 2개의 받은편지함으로 이메일을 전달할 수 있는 방법이 있습니까? 때로는 메시지가 여러 부분으로 구성되어 있고 키워드가 첫 번째 부분 내에 있는 경우도 있습니다.

ベストアンサー1

Procmail 자체에는 수신한 메시지를 반복하는 기능이 없지만 해당 formail유틸리티는 mbox 파일의 메시지를 반복할 수 있습니다. 물론 Maildir과 같은 메일박스 형식을 사용하는 경우 다음을 포함하는 메시지를 반복할 수 있습니다. 그들은 문서를 작성합니다.

for file in ~/Maildir/cur/deadbeefdecafbadc001b00c ~/Maildir/cur/badc0415106644511745; do
    procmail -m testing.rc <"$file";
done

다음 testing.rc과 유사한 콘텐츠가 포함될 수 있습니다.

:0
* ^Subject: (foo|bar)
! [email protected]

:0
! [email protected]

일치하는 메시지를 첫 번째 주소로 보내고 다른 메시지를 두 번째 주소로 보냅니다. (아무데도 아무 것도 보내지 않는 규칙으로 테스트했을 수도 있습니다!)

mbox 파일을 조작하기 위한 호출은 다음과 같습니다.

formail -s procmail -m testing.rc <messages.mbox

첫 번째 MIME 부분의 내부를 보려면 기본적으로 해당 부분을 Procmail이 읽을 수 있는 것으로 추출하는 방법을 알아야 합니다. 콘텐츠가 Base64일 가능성이 있는 경우 Base64 디코더가 필요하고 메시지 부분을 분리하기 위한 상당히 복잡한 로직이 필요합니다. 어쩌면 그 시점에서 더 나은 지원을 제공하는 타사 도구를 사용하여 최신 MIME 메시지의 내부 구조를 검사할 수 있을까요? 이것은 간단한 Python 도구입니다.

from email import message_from_binary_file
from email.policy import default
import sys

for filename in sys.argv[1:]:
    with open(filename, "rb") as msg:
        message = message_from_binary_file(msg, policy=default)
    if "fnord" in message.get_body(preferencelist=('plain', 'html')).get_content():
        print(f"{filename}: there")
    else:
        print(f"{filename}: not there")

이는 검색어가 발견되었는지 여부에 따라 "거기" 또는 "거기 없음"을 인쇄합니다. 분명히 이를 확장하여 입력 파일을 다른 디렉터리로 이동하거나 복사하거나, 다른 주소로 메시지를 보내거나, Python 스크립트 자체 내에서 다른 작업을 수행하거나 Bash 스크립트에서 실행하고 출력에 응답할 수 있습니다.

그러나 Procmail로 돌아가서, 필요한 것이 간단한 텍스트/일반 텍스트 섹션을 검색하는 것뿐이고 첫 번째 섹션 외에 다른 섹션을 불필요하게 검색하는 것을 허용할 수 있다면 아마도 다음과 같이 말할 수 있을 것입니다.

:0B
* (\<fnord\>)
! [email protected]

(검색 구문 주변의 단어 경계를 보여주는 Python 예제와는 다릅니다). 인용된 인쇄 가능한 메시지에도 다음과 같은 내용이 포함될 수 있으므로 이는 여전히 취약합니다.

Content-type: text/plain; charset="utf-8"
Content-transfer-encoding: quoted-printable

Annoyingly, QP lets you insert a newline in the midd=
le of a word, so you could end up not finding this f=
nord occurrence.

위의 간단한 Python 도구는 이 문제를 매우 잘 처리합니다.

おすすめ記事