이메일 수신 후 스크립트 실행

이메일 수신 후 스크립트 실행

저는 개인적인 용도로 Postfix/Dovecot 메일 서버를 운영하고 있습니다. 실제 사서함은 소수에 불과하며 기본적으로 [email protected][email protected].

나는 종종 이 virtual파일을 사용하여 에 전달할 가상 사서함을 만듭니다 [email protected]. 온라인 상점에서 일회성 구매를 하는 경우, 스팸 걱정 없이 해보고 싶은 온라인 게임 등 일회성 계정이 많습니다. 이를 위해 SSH를 통해 다음 명령을 실행합니다.

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # [email protected]      [email protected]
sudo postmap virtual
sudo service postfix restart

나는 프로세스를 어느 정도 자동화하고 싶을 만큼 자주 이 작업을 수행합니다. 단순히 가상 메일함과 실제 메일함을 매개변수로 사용하여 쉘 스크립트를 작성하고 직접 변경하는 것을 고려했지만 그 이상을 바랐습니다.

[email protected]서버의 다른 사서함에서 가상 사서함 이름을 메시지 본문으로 사용하여 메시지 본문으로 이메일을 보낼 수 있기를 원합니다 . 문제는 통화에 있지만 sudo이 문제를 처리하는 책임만 맡은 새 사용자를 생성할 수 있습니다. 이 사용자는 이 문제를 처리해야 합니다.

주요 질문은 이메일로 트리거되는 이벤트를 어떻게 생성합니까?입니다. 이를 수행할 수 있는 서비스가 어딘가에 있습니까? 이 이메일을 수신하고 이 이벤트에 대해 명령을 실행하도록 Postfix 또는 Dovecot을 구성할 수 있습니까?

답변1

이메일 메시지를 받은 후 스크립트(나는 쉘 스크립트를 사용함)를 실행하는 올바른 절차는 다음과 같습니다. 그것은 수정을 포함한다접미사구성 파일,기본 구성 파일(내 데비안에서는 다음 위치에 있습니다./etc/접미사) 다음 줄을 추가하여:

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}

이것은 나타냅니다접미사특정 이벤트가 발생할 때 스크립트를 실행합니다(실행 가능하게 만들어야 함).

스크립트 실행 시기를 지정하려면 다음을 수행하십시오.[이메일 보호됨]메시지가 수신되었습니다. 다음 줄을 배치하십시오

 [email protected] FILTER my_shell_script:dummy

파일 내부/etc/postfix/address.txt;적절한 데이터베이스를 생성해야 합니다.접미사이 파일을 사용하면 다음과 같이 할 수 있습니다.

  postmap /etc/postfix/address.txt

출력으로 이름이 지정된 파일을 생성합니다./etc/postfix/address.db. 이제 다시/etc/postfix/main.cf파일을 작성하고 다음 줄을 추가합니다.

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

지금 다시 시작접미사,

  postfix reload

가셔도 좋습니다.

답변2

나는 두 가지 확실한 해결책을 볼 수 있습니다.

당신이 사용하는 경우MDA로 procmail귀하의 서버에서 또는 이를 사용하도록 변환하려는 경우 |procmail의 (파이프라인) 레시피 작업을 통해 임의의 이메일에 대해 임의의 스크립트를 실행할 수 있습니다. 루트로 시작되지 않기를 바라지만, 필요한 마법을 수행하는 스크립트를 쉽게 만들 수 있어야 하며, 관련 사용자는 비밀번호 없이 루트로 스크립트를 호출할 수 있어야 합니다. 스크립트의 출력은 다시 피드백될 수도 있습니다.같은레시피를 필터 작업으로 설정하여 나중에 이메일과 이메일을 보냅니다.

또 다른 옵션(수동 유지 관리가 덜 필요함)은 다음과 같습니다.단일 사서함 만들기 및 Postfix 구성$recipient_delimiter.예 를 들어, 일반적으로 해당 목적으로 사용되지 않는 것입니다 -. receive_delimeter는 서버 전체 설정입니다. 사서함을 설정 [email protected]하고 설정했다고 가정하면 해당 로컬 사서함으로 보낼 $recipient_delimeter = .수 있습니다 . 이들 중 하나를 비활성화하려면 거부 작업을 사용하여 해당 수신자 테이블에 추가하십시오. 단점은 접두사에 대한 포괄적인 사서함이 되기 때문에 접두사를 우연히 또는 사전 공격으로 발견하기 어렵게 만들고자 한다는 것입니다. 좋은 점은 일반적인 상황(발신자가 귀하의 의사를 존중하고 귀하의 이메일 주소를 재판매하지 않음)에서 이 접근 방식은 유지 관리가 전혀 필요하지 않으며 언제든지 접두사를 변경하여 진행 방법을 명확하게 설명할 수 있다는 것입니다. 메일을 받는 것입니다.dummy.<anything>@example.com[email protected]dummy.<whatever>@example.com

답변3

만일을 대비해협회그게 다입니다. 요약은 다음과 같습니다.

master.cf먼저 다음 줄을 추가하여 "myhook" 스크립트를 등록합니다.

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

추가적으로, SMTP 전달을 통해 도착하는 모든 메일에 대해 필터를 실행하도록 Postfix에 지시하기 위해 smtp 행을 편집하십시오:

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

"sendmail" 명령을 사용하여 메일을 보내는 경우 필터가 실행되지 않습니다. 이 경우 '픽업' 배송 방법 뒤에 옵션을 추가하세요.

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

접미사 다시 시작:postfix reload

누구나 스크립트를 읽고 실행할 수 있도록 만드세요.chmod +rx script.sh

들어오는 메일이 있으면 스크립트가 트리거됩니다. 정확한 주소를 지정하려면 @MariusMatutiae의 답변을 참조하세요.

답변4

나는 Dovecot을 구성하는 것이 Postfix 구성에 비해 더 우아한 솔루션이라고 생각합니다. 다음과 같이 진행하세요:

  1. 디렉터리(예: mail_processor.py) 에 스크립트를 만듭니다 /usr/lib/dovecot/sieve-execute/.

    #!/usr/bin/python3
    from sys import stdin
    with open('/var/log/mail_processor.log', 'a') as logfile:
        for line in stdin:
            print(line.rstrip(), file=logfile)
    
    • 스크립트와 대상 파일에 올바른 권한이 있는지 확인하세요.

      $ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py
      $ chmod 0777 /var/log/mail_processor.log
      
  2. 플러그인 활성화 sieve_extprograms:

    • 다음을 사용하여 수정된 \etc\dovecot\conf.d\90-sieve.conf플러그인 섹션:

      sieve_extensions = +vnd.dovecot.execute
      sieve_plugins = sieve_extprograms
      sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
      
    • 비둘기장을 다시 로드하세요:

      $ service dovecot restart
      
  3. 시브 필터를 만듭니다(예: Roundcube에서 goto settings-> filters-> actions-> edit filter set).

    require ["vnd.dovecot.execute"];
    # rule:[mail processing]
    if true
    {
        execute :pipe "mail_processor.py";
    }
    

이제 시브(Sieve) 필터를 사용하여 이 사서함으로 배달된 모든 메시지가 파이프됩니다 mail_processor.py.

Pigeonhole Sieve: Extprograms 플러그인참조 문서

관련 정보