
나는 다음으로 구성된 (Linux) 메일 서버를 가지고 있습니다.postfix
메일 수신을 위해,amavisd-new
콘텐츠 필터링( clamav
및 사용 SpamAssassin
)dovecot
배달 및 IMAP용.
이메일이 특정 사서함에 전달될 때마다 스크립트가 실행되도록 설정하고 싶습니다. 스크립트는 메시지의 내용이나 헤더에 대해 반드시 알 필요는 없습니다. 나는 적어도 몇 가지 옵션을 알고 있습니다.
사용
postfix
의 내장 필터링. 이 사서함으로 향하는 모든 이메일을 내 스크립트로 다시 라우팅하도록 헤더 검사를 설정하세요. 그런 다음 다시postfix
. 여기서 단점은 모든 것이amavis
의 필터링 전에 발생하므로 이메일이 전달되기 전에 차단되는 경우에도 내 스크립트가 실행된다는 것입니다. 이메일을 제대로 다시 전달하지 않으면 성능 저하 및 이메일 손실 위험이 있을 수도 있습니다postfix
.내 스크립트를 에 콘텐츠 필터로 추가합니다
amavis
. 이는 이전에 비해 성능이 향상되었을 수 있으며, 이를 위해서는 더 나은 곳인 것 같습니다. 불행하게도 메시지에 대한 go/no-go 결정이 내려지기 전에는 여전히 실행 문제가 발생합니다. 또한amavis
이것이 실제로 어떻게 수행되어야 하는지 자세히 설명하는 문서를 찾을 수 없었 으며 conf 파일은 실제로 결정적이지 않습니다.
최종 dovecot
전달 단계가 필터링된 메일만 받을 수 있는 가장 좋은 장소인 것 같지만 그렇게 할 수 있는 방법이 있는지 확실하지 않습니다.
제안? 내가 간과하고 있는 게 있나요?
편집하다:추가하는 것을 잊어버렸습니다. 폴링 유형 솔루션(로그 보기, IMAP 클라이언트 스크립트 등)은 피하고 싶습니다.
답변1
나는 충분히 좋은 해결책이 될 수 있는 또 다른 옵션을 찾았습니다. 즉, 에서 로 전달되는 메시지를 가로채는 것 postfix
입니다 dovecot
.
의 경우 postfix
다음 줄을 변경합니다 master.cf
.
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(user)@$(domain)
에게:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/scripts/emaildeliverycheck.py $(user)@$(domain)
/scripts/emaildeliverycheck.py
그런 다음 다음과 같이 생성합니다 (Python 3.4).
#!/usr/bin/python3
from sys import argv, stdin, exit
from subprocess import Popen, check_call, CalledProcessError
# Define recipients that should trigger the script here
notifyusers = ('[email protected]',
'[email protected]')
recipient = argv[1]
if recipient in notifyusers:
# Run the script. Use Popen so that we don't have to wait for the
# script to finish
Popen(['/scripts/myscript.py', recipient])
try:
# Now pass the email to dovecot-lda. Use check_call because we *do*
# want to wait for it to finish
check_call(['/usr/lib/dovecot/dovecot-lda', '-d', recipient], stdin=stdin)
except CalledProcessError as error:
# Propagate any error codes back to Postfix
exit(error.returncode)
Postfix의 pipe
프로세스는 최종 전달을 위해 이메일을 직접 전달하는 대신 위 스크립트로 전달합니다 dovecot-lda
. 스크립트는 목록과 비교하여 수신자(명령줄에서 전달되었으므로 메시지를 전혀 볼 필요가 없음)를 확인하고 일치하는 경우 다른 스크립트를 실행합니다. 그런 다음 dovecot-lda
Postfix에서 직접 가져오지 않는다는 것을 알 수 없어야 하는 메시지를 로 파이프하고 종료 상태를 pipe
프로세스에 다시 전파합니다.
초기 테스트에서는 잘 작동합니다. 이렇게 하면 필터링된 이메일만 받게 됩니다. 이것이 바로 제가 원하는 것입니다.
답변2
저는 procmail
지역 배송 대행업체로 이용하고 있습니다. 이를 통해 사용자에게 적용 가능한 규칙을 사용하여 광범위한 필터링이 가능합니다. procmail을 사용하여 필터링 및 원하는 경우 이메일 전달을 수행하도록 postfix를 구성하는 것이 가능해야 합니다.
procmail
헤더, 콘텐츠 또는 둘 다에 필터를 적용하는 광범위한 기능이 있습니다. 모든 프로그램을 필터로 사용할 수 있으므로 지정된 사용자에게 전송되는 각 이메일에 대해 스크립트를 트리거할 수 있어야 합니다.