내 Postfix 사서함에 수신되는 시간당 최소 3,000통의 수신 이메일을 처리해야 합니다. 처리에는 이메일 첨부 파일을 추출하고 이메일 첨부 파일의 내용을 외부 이메일 주소로 보내는 작업이 포함됩니다. 각 이메일 첨부 파일에 대해 이메일을 보냅니다. 매초마다 cronjob을 절전 모드로 전환하는 스크립트를 작성하면 이를 달성할 수 있을 것 같지만 이것이 좋은 방법인지는 확실하지 않습니다(이렇게 하면 시간당 약 3600개의 이메일을 쉽게 처리할 수 있습니다). 이 문제를 해결하는 가장 좋은 방법을 제안해주세요. 이메일을 가져오고 이메일을 보내는 스크립트가 이미 있습니다. 이 스크립트의 유일한 문제점은 한 번에 하나의 이메일만 처리할 수 있다는 것입니다. 분당 cronjob을 사용하면 시간당 60개의 이메일만 처리할 수 있지만 목표는 실제로 시간당 최소 3000개의 이메일입니다.
답변1
서버에 트래픽을 유지할 수 있는 CPU와 대역폭이 있는 한 Procmail은 이 문제를 쉽게 해결할 수 있습니다. 이를 처리하는 스크립트가 이미 있는 경우 각 수신 메시지를 스크립트로 연결하면 됩니다. 다음을 다음 항목에 입력하세요 $HOME/.procmailrc
.
:0
| /path/to/your/script
스크립트는 메시지를 표준 입력으로 수신하고 거기에서 메시지를 전달하거나 처리하는 일을 담당합니다. (즉, Procmail은 이 메시지를 받은 편지함에 전혀 전달하지 않습니다. 이 동작을 수정하는 방법을 알아보려면 아래를 참조하세요.)
(Procmail은 이를 위해 꼭 필요한 것은 아니지만 스크립트가 가능한 모든 오류 사례를 처리할 필요가 없도록 멋진 안전망을 추가합니다. .forward
스크립트가 충분히 강력하다면 파이프를 스크립트에 간단히 넣을 수 있습니다. 이것은 도구를 사용하지 않고 Postfix의 구성 파일에서 이 작업을 수행한다는 점을 제외하고는 본질적으로 @number5의 설명에서도 알 수 있는 내용입니다 .forward
.)
스크립트의 두 인스턴스가 동시에 실행될 수 없는 경우(예: 백엔드 데이터베이스에 대한 단독 액세스가 필요하기 때문에) 잠금 파일을 추가합니다.
:0:yourscript.lock
| /path/to/your/script
이로 인해 Procmail은 파일을 찾고 파일 yourscript.lock
이 있으면 사라질 때까지 기다린 다음 파일을 생성하고 레시피를 실행하고 잠금 파일을 삭제합니다.
잠금 파일을 사용하여 전송을 강제로 직렬화합니다. 하지만 이렇게 하면 성능이 저하됩니다. 가능하다면 스크립트를 병렬 실행에 더욱 강력하게 만드는 것이 좋습니다.
반면에 스크립트가 서버에 과도한 로드를 가하는 경우 여러 동시 인스턴스를 실행하고 싶지 않을 수 있습니다. 이 경우 직렬화된 전달을 강제하면 성능이 실제로 향상될 수 있습니다.
받은편지함에도 복사본을 보관하려면 스크립트로 전달할 때 복사본을 복제하세요.
:0c # or :0c:yourscript.lock
| /path/to/your/script
특정 제목 줄이 있는 메시지만 스크립트에 연결하는 조건을 추가할 수도 있습니다. 조건은 첫 번째 문자로 별표를 사용하여 지정되고 그 뒤에는 메시지 헤더와 일치해야 하는 정규식이 옵니다.
:0
* ^Subject: xyzzy$
| /path/to/your/script
위의 방법이 적합하지 않은 경우 다음 레시피는 모든 첨부 파일을 디렉터리로 추출하고 각 수신 메시지에 대해 이메일을 보냅니다. 첨부 파일을 반복하는 것은 아마도 위와 같은 외부 스크립트를 통해 수행하는 것이 가장 좋지만 최소한 Procmail 자체 내에서 좀 더 많은 작업을 수행하는 것이 어떤 것인지에 대한 아이디어를 제공해야 합니다.
METAMAIL_TMPDIR=`mktemp -d /tmp/extracted.XXXXXXXXX`
# Crude attachment extraction ... how are you currently doing this?
:0c
| metamail -w -d
COUNT=`find "$METAMAIL_TMPDIR" -printf "%i\n" | wc -l`
:0
| ( echo Subject: $COUNT attachments extracted into $METAMAIL_TMPDIR; echo; echo ) \
| sendmail -oi [email protected]