
*@example.com
다양한 작업을 수행하는 내 서버에서 실행되는 Python 스크립트를 사용하여 수신되는 모든 이메일을 관리하고 싶습니다 .
에 대한 DNS MX 레코드를 이미 작성하여
example.com
내 서버로 지정했습니다.mx.example.com MX mailforwarder.example.com mailforwarder.example.com A 1.2.3.4
postfix와 exim 모두에서 많은 시행착오를 겪었지만 아무 것도 작동하지 않았기 때문에 모두 제거했습니다.
apt-get remove postfix
및apt-get remove exim4
, 그래서 그 중 하나를 새로 설치하여 시작할 준비가 되었습니다. 이 특정 작업에 대한 가장 짧은 솔루션은 무엇입니까?)
*@example.com
들어오는 모든 이메일을 Python 스크립트로 전달하는 주요 단계는 무엇입니까 ?(포함: 서버 외부, 전체 인터넷 등에서 오는 이메일을 수락하도록 MTA에 지시)
답변1
procmail
문제가 있다고 여겨진다.forward
작성자: Philip Guenther(이 경우에는 파일이나 이에 상응하는 항목이 메일을 프로그램에 직접 보낼 수 있으므로 의 불필요한 복잡성을 건너뛰기 때문에 아마도 쓸모가 없을 것입니다 procmail
).
요약: procmail 포트를 삭제합니다. 코드는 안전하지 않으며 추가 작업의 기초로 사용되어서는 안 됩니다.
사람들이 알다시피 나는 1990년대 후반부터 2001년까지 procmail의 업스트림 관리자였습니다.
따라서 다른 솔루션이 권장될 수 있습니다. 이는 MTA(Mail Transport Agent)에 따라 다릅니다. 또 다른 옵션은 MTA를 사용하여 로컬 파일이나 IMAP으로 전달한 다음 프로그램에서 해당 파일이나 IMAP을 구문 분석하도록 하는 것입니다. 여기에는 계속해서 이메일을 수락하고 어딘가에 저장하는 보너스가 있습니다. 프로그램에 버그가 있거나 실행에 실패하면 어떻게 되나요? 실시간 메일 배달보다 문제가 적습니다.
엑심
아마도 Sendmail .forward
메소드를 복사하거나 Eximese에서 이를 올바르게 수행하는 방법을 알아내십시오. (Exim 문서를 파헤치는 데 시간이 너무 많이 걸려서 중단했습니다.)elspy
MILTER 방식으로 SMTP 시간에 검색을 수행하려는 경우...
접미사
맙소사, 길고 복잡해 보이는군요.
메일을 보내다
mailertable
도메인(및 .domain
필요한 경우 하위 도메인)의 모든 메일을 로컬 사용자에게 전달하도록 항목을 여기에서 설정하세요.jdoe
example.com local:jdoe
.example.com local:jdoe
그런 다음 .forward
해당 사용자가 필요한 코드를 실행할 수 있도록 파일을 설정합니다.
$ cat ~jdoe/.forward
"|/etc/smrsh/process"
$
다음과 같이 간단할 수 있습니다.
$ cat /etc/smrsh/process
#!/bin/sh
cat >> /home/jdoe/allmails
$
이메일이 표준 입력으로 제공되기 때문입니다(이러한 인스턴스가 process
한 번에 여러 개 실행되면 좋지 않을 수 있습니다. 아마도 실제 코드가 이러한 경쟁 조건을 처리하거나 그렇지 않으면 멱등적입니다... 맞습니까?). 이 방법은 MTA가 모든 메일을 특정 사용자에게 리디렉션하도록 할 수 있다고 가정하면 Sendmail의 정방향 구문을 복사하는 다른 MTA에서도 작동할 수 있습니다.
이는 mailertable
지원이 활성화되고 confFORWARD_PATH
설정되어 있으며 Sendmail이 코드를 실행할 수 있고( smrsh(8)
일부 공급업체는 문서를 업데이트하지 않고 디렉터리를 변경할 수 있음(실행이 strings /the/path/to/smrsh | fgrep /
도움이 될 수 있음) 참조) selinux와 같은 것도 문제를 일으키지 않는다고 가정합니다.
Sendmail의 또 다른 옵션은 다음과 같은 MILTER를 사용하는 것입니다.MIME디팡거기에서 필요한 모든 비즈니스 로직을 수행합니다. (다른 다양한 MTA는 MILTER를 지원하거나 이와 유사한 기능을 가지고 있습니다.)
단순 메일 전송 프로토콜 데몬(OpenBSD)
살펴보면smtpd.conf(5)
(OpenBSD 6.4 변경 사항에 대해 업데이트됨)
action "mymda" mda "/path/to/your/command" user jdoe
match from any for domain example.com action "mymda"
답변2
이것은 충분히 일반적인 질문인 것 같았습니다. 저는 이것이 제가 제안하고 싶은 답변을 이미 찾았습니다. Procmail은 지역 배달 에이전트입니다.제 생각에는이는 무언가가 이미 네트워크로부터 메일을 수신하여 로컬 배달이나 기타 필터링을 위해 procmail로 전달했다는 의미입니다. 이 경우 접미사가 그런 것입니다. 프로덕션 환경에서 postfix를 실행하면 견고한 도구이며 사용자 정의 메일 처리에 매우 유연합니다.
답변3
나는 Postfix와 Dovecot을 사용하는 Mail-in-a-box 스택을 좋아합니다. 일단 설치하고 나면 다음을 수행하여 특정 주소로 메일을 받을 때 스크립트를 실행할 수 있습니다.
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
플러그인을 활성화합니다
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
체 필터를 만듭니다(예: Roundcube에서 goto
settings
->filters
->actions
->edit filter set
).require ["vnd.dovecot.execute"]; # rule:[mail processing] if true { execute :pipe "mail_processor.py"; }
이제 이 체 필터를 사용하여 사서함으로 전달된 모든 메일은 mail_processor.py
작업을 위해 파이프를 통해 전달됩니다.