"받는 사람:" 및 "참조:"를 기반으로 이메일에 "delivered_to" 줄을 추가할 수 있는 유틸리티는 무엇입니까?

"받는 사람:" 및 "참조:"를 기반으로 이메일에 "delivered_to" 줄을 추가할 수 있는 유틸리티는 무엇입니까?

요약:이메일을 읽고 "받는 사람:" 및 "참조:" 필드를 확인하여 알려진 주소 목록에서 이메일 주소를 찾는 유틸리티가 필요합니다. 하나를 찾으면 deliver_to: <address>추가 봉투 줄이 포함된 이메일을 출력하고 싶습니다.

배경

내 ISP는 모든 회사 메일을 "도메인 사서함"/"모두 캡처" 사서함으로 보내지만 봉투 수신자를 어디에도 기록하지 않습니다. 우리는 이 사서함에서 데이터를 수신하고(소위 "POP3 커넥터"를 사용하여) 이를 사용자 사서함에 배포하는 교환 서버를 보유하고 있습니다. 숨은 참조 메시지와 메일링 리스트의 메시지는 기본 메일함으로 전달됩니다. 스왑을 교체하는데 이 부분만 남았네요. getmail을 사용하여 메시지를 검색할 수 있지만 MultidropPOP3Retrievergetmail은 수신자의 이메일 주소가 포함된 봉투 줄을 찾을 것으로 예상합니다(예: Deliver_to:[이메일 보호됨]) 내 ISP가 이를 제공하지 않습니다. 그래서 To:/CC:에서 복구하기 위해 최선을 다해야 합니다.

답변1

내 대답은 광범위한 getmail 문서에 있다는 것이 밝혀졌습니다. getmail이 호출하는 것을 사용해야 합니다 MultiGuesser.

그러나 제 경우에는 ISP가 봉투 헤더에 다음과 같은 줄을 추가했습니다.

for <[email protected]>

MultiGuesser는 완벽하지 않기 때문에(예를 들어 수신자가 BCC인지 정확하게 추측할 수 없음) 결국 delivered_to행을 추가하는 원래 아이디어를 구현하게 되었습니다. 내 ISP가 이 유용한 라인 추가를 중단할 경우를 대비해 MultiGuesser를 유지합니다. 이 유틸리티는 formail(dirkt가 답변에서 제안한) bash 스크립트입니다 . 처리하는 모든 메시지에 대해 임시 파일을 생성하기 때문에 빠르지는 않지만 잘 작동합니다.

#!/bin/bash
# Reads email from stdin and prints it to stdout with a twist:
# If it finds a line like " for <[email protected]>" in the envelope
# it will assume it refers to the receipient and will add a "Delivered-To"
# envelope line that will make getmail happy. -- Nick Demou 2018

# bash options for safety in case of errors
set -euf -o pipefail

# read stdin to temp file
cat - > /tmp/deliver.to.$$
logger -p mail.info "getmail, filtering via temp file /tmp/deliver.to.$$"

formail -X "" < /tmp/deliver.to.$$ > /tmp/deliver.to.$$.env
# logger -p mail.info "getmail, extracted envelope/headers to /tmp/deliver.to.$$.env"

ID=`grep 'SMTP id ' /tmp/deliver.to.$$.env 2>/dev/null| head -1|sed -e 's/^ *//'` || ID=UNKNOWN
# logger -p mail.info "getmail, extracted ID $ID"

ADDR=`grep '^ *for <.*@domain\.com>' /tmp/deliver.to.$$.env 2>/dev/null|head -1|sed -e 's/^.*<\([^>]*\)>.*$/\1/'` || ADDR=UNKNOWN
# logger -p mail.info "getmail, extracted delivery address $ADDR"

if echo $ADDR | grep -q '^[^@]*@domain.com *$' ; then
        cat /tmp/deliver.to.$$ | formail -A "Delivered-To: $ADDR"
else
        cat /tmp/deliver.to.$$
fi
logger -p mail.info "getmail filtered mail for $ADDR, $ID"

rm /tmp/deliver.to.$$
rm /tmp/deliver.to.$$.env

getmailrc필터에는 위의 스크립트를 호출하는 다음과 같은 필터가 포함되어 있습니다.

[filter-1]
type = Filter_external
path = /opt/envelope-add-delivered-to.sh

답변2

"유틸리티"가 "송신자/수신자 쉘 스크립트"를 의미하는 경우이메일 포맷. 각 사용자의 수신 메일을 자동으로 처리하려면 다음을 확인하세요.메일 처리.

Exchange 서버를 Linux 메일 서버로 교체하는 경우 어떤 방식으로든 서버 내에서 이를 수행할 수 있습니다.

관련 정보