もし似たような質問をした方がいらっしゃるのかわかりませんね。
現在、電子メールがスパムフォルダの内外に移動したときにスパム/ハムとして認識できるように、電子メールをスパムフィルタにプッシュしようとしています。そのために、私は次のガイドに従いました。https://workaround.org/ispmail/stretch/filtering-out-spam-with-rspamd「ユーザー操作による学習」セクションで。
sieve スクリプトは指示に従って作成され、sievec で処理され、指示に従って権限が付与されました。これにより、2つのシェルスクリプトも作成されました。唯一の違いは、ユーザーまたはグループ「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 を無効なフォルダに設定しました。これで、2つの.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など)
2番目:Dovecotを再起動して設定をロードします。
3番目:フォルダを作成します。
mkdir /usr/lib/dovecot/sieve-pipe
私はこれをルートとしています。他のユーザーがフォルダにアクセスできるようにするには、chmod 755を使用します。
第四:パイプするCLIコマンドの実行可能ファイルをこのフォルダに保存します。
dovecot-ldaにはすでに「deliver」というシンボリックリンクがあります。これはdovecot-ldaへのハードコーディングを防ぐための一般的な参照です。だから私は/usr/lib/dovecot/deliverを/usr/lib/dovecot/sieve-pipeにコピーしました。
5番目: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を偶然発見した方のためです。