혹시 비슷한 질문을 하신 분이 계신지 모르겠네요.
현재 이메일이 스팸 폴더 안팎으로 이동될 때 스팸/햄으로 인식할 수 있도록 이메일을 스팸 필터에 푸시하려고 합니다. 이를 위해 나는 다음 가이드를 따랐습니다.https://workaround.org/ispmail/stretch/filtering-out-spam-with-rspamd"사용자 작업을 통해 학습" 섹션에서.
sieve 스크립트는 지침에 따라 생성되었으며 sievec에서 처리되었으며 지침에 따라 권한이 부여되었습니다. 이에 따라 두 개의 쉘 스크립트도 생성되었습니다. 유일한 차이점은 사용자 또는 그룹 "vmail"이 없다는 것입니다. 나는 그것을 우리 시스템의 대응물인 dovecot:root로 설정했습니다. 폴더는 다음과 같습니다.
drwxr-xr-x 2 dovecot root 4,0K Mai 7 10:52 .
drwxr-xr-x 3 root root 4,0K Jul 29 2019 ..
-rw-r--r-- 1 dovecot root 85 Mai 7 10:47 learn-ham.sieve
-rw-r--r-- 1 root root 246 Mai 7 10:47 learn-ham.svbin
-rw-r--r-- 1 dovecot root 86 Mai 7 10:47 learn-spam.sieve
-rw-r--r-- 1 root root 250 Mai 7 10:47 learn-spam.svbin
-rw-r--r-- 1 dovecot root 509 Mär 16 13:57 mailfilter.sieve
-rw-r--r-- 1 root root 398 Mai 6 18:02 mailfilter.svbin
-rwx------ 1 dovecot root 41 Mai 7 10:52 rspamd-learn-ham.sh
-rwx------ 1 dovecot root 42 Dez 14 10:42 rspamd-learn-spam.sh
시브 스크립트가 실행되어 셸 스크립트를 호출해야 하면 다음 오류가 발생합니다.
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Fatal: execvp(/etc/dovecot/sieve/global/rspamd-learn-spam.sh) failed: Permission denied
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: write(program stdin) failed: Broken pipe
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: program `/etc/dovecot/sieve/global/rspamd-learn-spam.sh' terminated with non-zero exit code 84
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: sieve: pipe action: failed to pipe message to program `rspamd-learn-spam.sh': refer to server log for more information. [2020-05-12 17:16:28]
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: sieve: left message in mailbox 'Junk'
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed
"서버 로그"가 무엇을 의미하는지 전혀 모른다는 것 외에는 문제가 무엇인지 알 수 없습니다. 물론, 이는 권한 오류처럼 보이지만 어떻게 해결할 수 있을까요?
시스템 정보: Dovecot 2.3.4.1 및 piginghole 0.5.4가 포함된 Debian 10.4
편집하다:
실수를 발견했습니다. sieve_pipe_bin_dir을 잘못된 폴더에 설정했습니다. 이제 두 개의 .sh 파일이 포함된 폴더를 가리키지만 여전히 다음 오류가 발생합니다.
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Fatal: execvp(/etc/dovecot/sieve/global/rspamd-learn-spam.sh) failed: Permission denied
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: write(program stdin) failed: Broken pipe
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: program `/etc/dovecot/sieve/global/rspamd-learn-spam.sh' terminated with non-zero exit code 84
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: sieve: pipe action: failed to pipe message to program `rspamd-learn-spam.sh': refer to server log for more information. [2020-05-22 15:40:06]
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: sieve: left message in mailbox 'Junk'
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed
어떤 소유자를 설정하든(root:root 또는 dovecot:root, "인간 사용자"가 아닌 유일한 다른 사용자는 _apt, bin, nslcd, daemon, dovenull 또는 www-data와 같습니다) 원인이 될 수 있는 모든 아이디어 저것?
편집 2:
이제 접근 방식을 변경하고 rspamc로 직접 파이프하려고 합니다. 내 learn-spam.sieve 스크립트는 다음과 같습니다.
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];
그래서 90-plugin.conf를 다음과 같이 변경했습니다.
sieve_pipe_bin_dir = /usr/bin/rspamc
rspamc의 위치. 이제 오류가 발생합니다.
Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: Error: sieve: pipe action: failed to pipe message to program: program `rspamc' not found
Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: sieve: left message in mailbox 'Junk'
Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed
무엇이 잘못되었나요? 아니면 pidgeonhole 파이프라인 명령은 쉘 스크립트만 호출할 수 있습니까?
답변1
작동하지 않는 것을 찾은 것 같습니다. 어떤 이유로 dovecot에는 쉘 스크립트에 대한 실행 권한이 없는 것 같습니다. 그래서 해결책은 실제로 sudo -u dovecot chmod +x *.sh
제 경우의 올바른 파일 권한은 다음과 같습니다.
/etc/dovecot/sieve/global # ls -la
insgesamt 44K
drwxr-xr-x 2 dovecot root 4,0K Jul 8 07:33 .
drwxr-xr-x 3 root root 4,0K Jul 29 2019 ..
-rw-r--r-- 1 dovecot root 144 Jun 5 10:06 learn-ham.sieve
-rw-r--r-- 1 root root 306 Jun 5 10:07 learn-ham.svbin
-rw-r--r-- 1 dovecot root 86 Jun 17 15:45 learn-spam.sieve
-rw-r--r-- 1 root root 250 Jun 17 15:45 learn-spam.svbin
-rw-r--r-- 1 dovecot root 509 Mär 16 13:57 mailfilter.sieve
-rw-r--r-- 1 dovecot root 462 Jul 29 2019 mailfilter.sieve~
-rw-r--r-- 1 root root 398 Mai 6 18:02 mailfilter.svbin
-rwxrwxr-x 1 dovecot root 41 Jun 5 10:25 rspamd-learn-ham.sh
-rwxrwxr-x 1 dovecot root 42 Jul 8 07:33 rspamd-learn-spam.sh
답변2
에서 sieve_pipe_bin_dir
설정이 재정의되었는지 확인하세요 . 이 경우 에서 주석 처리를 해제 하거나 에서 제거하고 기본 디렉토리를 사용할 수 있습니다(예:90-plugin.conf
90-sieve-extprograms.conf
90-sieve-extprograms.conf
90-plugin.conf
90-plugin.conf
/usr/lib/dovecot/sieve-pipe/
sieve_pipe_bin_dir
실행 파일의 파일 이름이 아닌 원래 디렉터리 이름과 같은 디렉터리 이름으로 설정해야 합니다.
Permission denied
프로그램을 실행한다는 것은 dovecot이 프로그램(실행 파일이나 상위 디렉터리)을 읽거나 실행할 수 있는 권한이 없다는 것을 의미할 수 있습니다. stat $file
실행 파일의 권한을 사용하거나 확인할 수 있습니다 ls -l $file
. chmod +x $file
실행 가능하게 만듭니다(모든 사용자). dovecot이 프로그램을 실행하여 프로그램을 실행할 수 있는지 여부를 테스트해 볼 수 있습니다 sudo -u dovecot $file
(이런 방식으로 실행해도 스크립트가 나쁜 작업을 수행하지 않는다고 가정).
$file
예를 들어/etc/dovecot/sieve/global/rspamd-learn-spam.sh
답변3
참고로 이를 달성하기 위해 수행한 단계는 다음과 같습니다.
디렉터리(예:
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
.
답변4
일반적인 예를 사용하여 비슷한 문제에 직면했습니다 pipe :copy "dovecot-lda"
.
첫째: 파이프라인 실행 파일이 어디에 있는지 Doveco에 알려줍니다. 00-zzzzz.conf 파일에서 sieve_pipe_bin_dir = /usr/lib/dovecot/sieve-pipe
. 이는 Sieve 스크립트의 "파이프라인" 명령에만 적용됩니다. HyperActive의 대답은 "실행" 명령입니다. dovecot.conf 또는 .conf 파일을 가져올 수 있는 다른 위치에 !include가 있는 한 .conf 파일은 중요하지 않습니다. (90-sieve.conf, 90-sieve-extprograms.conf 등)
둘째: Dovecot을 다시 시작하여 설정이 로드되도록 합니다.
셋째: 폴더를 만듭니다.
mkdir /usr/lib/dovecot/sieve-pipe
나는 이것을 루트로하고 있습니다. 다른 사용자가 폴더에 액세스할 수 있도록 하려면 chmod 755를 사용하세요.
넷째: 파이프할 CLI 명령에 대한 실행 파일을 이 폴더에 저장합니다.
dovecot-lda에는 이미 "deliver"라는 심볼릭 링크가 있습니다. 이는 dovecot-lda에 대한 하드 코딩을 방지할 수 있는 일반적인 참조입니다. 그래서 /usr/lib/dovecot/deliver를 /usr/lib/dovecot/sieve-pipe에 복사했습니다.
다섯째: dovecot-lda 실행 파일 자체의 권한이 755인지 확인하세요. "deliver"에 대한 권한은 777로 표시되지만, 대상의 실제 권한은 를 통해 확인할 수 있습니다 ls -LaAFl /usr/lib/dovecot/deliver
. 755는 이러한 목적에 완벽합니다.
요약:
- 귀하의 체 스크립트는 다음과 같이 말합니다
pipe :copy
. - 이 지침은 통과되었습니다
require ["vnd.dovecot.pipe", "copy"...
. - :copy 다음에 나오는 모든 명령은 :copy로 식별되는 폴더에 정의되어야 합니다.sieve_pipe_bin_dir활성 Dovecot .conf 파일에서 이 변수를 설정하려면 Dovecot을 다시 시작해야 합니다.
- OP의 경우 이는 /usr/lib/dovecot/sieve-pipe에 /usr/bin/rspamc를 가리키는 "rspamc"에 대한 심볼릭 링크가 있어야 함을 의미합니다.
좋아요, 몇 년 늦었지만 이 Q&A를 우연히 발견한 분들을 위한 것입니다.