나는 수신 이메일을 디렉토리에 저장하기 위해 procmail
간단한 규칙(아래 참조)을 사용합니다.Maildir/
:0:
* ^X-Spam-Status: Yes
Spam/
이제 특정 디렉터리/규칙의 새 이메일에 대한 데스크톱 알림을 원합니다. 알림 처리 방법을 이미 알고 있지만 procmail
디렉터리에 저장 하도록 지정하는 방법은 무엇입니까?그리고스크립트를 실행하시겠습니까?
나도 할 수 있다는 걸 알아관로a 하지만 저는 파일을 저장한 다음 스크립트를 실행하는 |command
것을 선호합니다 .procmail
이메일(적어도 헤더)을 파이프에 넣거나 dir + 파일 경로를 매개변수로 전달하는 것은 스크립트를 비동기적으로 실행하는 것과 마찬가지로 좋을 것입니다.
고쳐 쓰다
따라서 @slm의 답변을 바탕으로 결과는 다음과 같습니다.
:0 c:
* ^X-Spam-Status: Yes
Spam/
:0 Whi
* ^X-Spam-Status: Yes
| $HOME/install/bin/notify.sh
c
복사메시지가 카탈로그에 있지만 다음 규칙으로 계속됩니다.
나는 이것을 사용하지 않습니다. f
왜냐하면 이것은 필터가 아니며 규칙이 일치하면 procmail이 여기서 멈추기를 원하기 때문입니다. (여기서 매뉴얼을 오해하지 않기를 바랍니다)
W
모든 프로그램 오류 억제
h
도착하다관로제목만
i
파이프에 대한 쓰기 오류를 무시합니다.
w
스크립트가 반환될 때까지 기다리고 싶지 않기 때문에 사용하지 않습니다.
파일을 잠글 필요도 없을 것 같아요( :
그 이후는 아님 Whi
)
2014년 12월 5일 업데이트됨
결국 나는 @tripleee가 제안한 솔루션을 완전히 채택했습니다.
나는 mailutils-comsatd
포기하기 전에 몇 분 동안 플레이했습니다.
.procmailrc:
COMSAT=no
답변1
스크립트를 통해 메일을 실행하려면 다음 두 가지 규칙을 사용하여 규칙을 수정할 수 있습니다.
:0: c
* ^X-Spam-Status: Yes
Spam/
:0: fw
* ^X-Spam-Status: Yes
| /usr/bin/python /work/scripts/process_mail.bash
귀하의 프로그램은 STDIN으로 메일을 받게 됩니다. STDOUT에서 변환된 메시지를 "에코"해야 합니다.
fw는 다음을 의미합니다.
f
파이프를 필터로 생각하십시오.w
필터나 프로그램이 완료될 때까지 기다리고 종료 코드를 확인합니다(일반적으로 무시됨). 필터링에 실패하면 텍스트가 필터링되지 않습니다.c
이 메시지의 사본을 만드세요. 이는 레시피를 제공할 때만 의미가 있습니다. 이 플래그가 영향을 미치는 유일한 비전이적 레시피는 중첩된 블록에 있으며, 이는 복사본을 만들기 위해 실행 중인 procmail 프로세스를 복제하므로(잠긴 파일은 상속되지 않음) 복제는 평소대로 진행되고 상위 프로세스는 계속 실행됩니다. . 블록을 건너뜁니다.
인용하다
답변2
이것은 @slm의 답변을 약간 수정한 것입니다.
Maildir에서 잠금을 사용해서는 안 되며, 플래그와 잠금 콜론은 잘못된 방법입니다. ( c
메시지를 복제하는 대신 이라는 잠금 파일을 효과적으로 생성하므로 두 번째 작업이 실행되지 않습니다.)
깃발이 f
제자리에 있지 않은 것 같았습니다.
Procmail의 관점에서 먼저 전달한 다음 알리는 것이 합리적이지만 알림은 실패할 수 있는 보조 작업이므로 복제에서 이 작업을 수행하고 종료 상태를 무시합니다.
마지막으로 중괄호를 사용하여 조건 내에서 두 작업을 그룹화하는 것이 더 직관적입니다.
:0
* ^X-Spam-Status: Yes
{
:0cWhi
| $HOME/install/bin/notify.sh
:0
Spam/
}
그런데 나는 Procmail이 이미 comsat
즉시 알림을 생성한다는 사실도 알아냈습니다. 이는 레거시 알림 프로토콜이지만 일부 목적으로 사용할 수 있습니다. 둘째, 스크립트 모니터링을 사용하여 간단한 알림 메커니즘을 구축할 수 있습니다 procmail.log
. (그러나 로그 파일을 구문 분석하는 것은 좋지 않습니다.)