특정 사용자가 이메일을 받을 때마다 스크립트를 실행하려면 어떻게 해야 합니까?

특정 사용자가 이메일을 받을 때마다 스크립트를 실행하려면 어떻게 해야 합니까?

나는 다음으로 구성된 (Linux) 메일 서버를 가지고 있습니다.postfix메일 수신을 위해,amavisd-new콘텐츠 필터링( clamav및 사용 SpamAssassin)dovecot배달 및 IMAP용.

이메일이 특정 사서함에 전달될 때마다 스크립트가 실행되도록 설정하고 싶습니다. 스크립트는 메시지의 내용이나 헤더에 대해 반드시 알 필요는 없습니다. 나는 적어도 몇 가지 옵션을 알고 있습니다.

  1. 사용postfix의 내장 필터링. 이 사서함으로 향하는 모든 이메일을 내 스크립트로 다시 라우팅하도록 헤더 검사를 설정하세요. 그런 다음 다시 postfix. 여기서 단점은 모든 것이 amavis의 필터링 전에 발생하므로 이메일이 전달되기 전에 차단되는 경우에도 내 스크립트가 실행된다는 것입니다. 이메일을 제대로 다시 전달하지 않으면 성능 저하 및 이메일 손실 위험이 있을 수도 있습니다 postfix.

  2. 내 스크립트를 에 콘텐츠 필터로 추가합니다 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-ldaPostfix에서 직접 가져오지 않는다는 것을 알 수 없어야 하는 메시지를 로 파이프하고 종료 상태를 pipe프로세스에 다시 전파합니다.

초기 테스트에서는 잘 작동합니다. 이렇게 하면 필터링된 이메일만 받게 됩니다. 이것이 바로 제가 원하는 것입니다.

답변2

저는 procmail지역 배송 대행업체로 이용하고 있습니다. 이를 통해 사용자에게 적용 가능한 규칙을 사용하여 광범위한 필터링이 가능합니다. procmail을 사용하여 필터링 및 원하는 경우 이메일 전달을 수행하도록 postfix를 구성하는 것이 가능해야 합니다.

procmail헤더, 콘텐츠 또는 둘 다에 필터를 적용하는 광범위한 기능이 있습니다. 모든 프로그램을 필터로 사용할 수 있으므로 지정된 사용자에게 전송되는 각 이메일에 대해 스크립트를 트리거할 수 있어야 합니다.

관련 정보