Dovecot+Rspamd环境下无法触发垃圾邮件与正常邮件学习脚本的问题求助
我自己搭建了一套邮件服务器,用的是Postfix、Dovecot和Rspamd组合,目前邮件投递功能运行得很顺畅,但垃圾邮件和正常邮件的学习功能完全没反应,折腾了好久都没解决,来求助大家。
我查了Dovecot的官方文档,里面提到可以通过Sieve脚本调用learn-ham.sh和learn-spam.sh这两个Shell脚本,由它们来调用Rspamd的学习命令。为了确认脚本是否被执行,我给脚本加了日志功能,会把执行日志写到指定文件里,但观察下来,脚本从来没被调用过。
先贴一下我的/usr/bin/learn-ham.sh脚本内容:
#!/bin/sh set -e LOG_FILE="/var/log/dovecot/$(basename ${0}).log" function logInfo() { TIMESTAMP=$(date '+%Y-%m-%d_%H:%M:%S' ) echo "${TIMESTAMP}: INFO: ${1}" echo "${TIMESTAMP}: INFO: ${1}" >> "${LOG_FILE}" } logInfo "Start learning ham" exec /usr/bin/rspamc --connect "localhost:11333" --password "[masked]" learn_ham logInfo "Finished learning ham"
后来我又给Sieve脚本加了debug_log日志语句,想先确认Sieve脚本本身有没有被执行,但翻遍了debug.log文件,完全找不到对应的日志条目。
这是我的/var/vmail/sieve/global/report-ham.sieve内容:
# Documentation: # https://doc.dovecot.org/configuration_manual/howto/antispam_with_sieve/#replacing-antispam-plugin-with-imapsieve require ["vnd.dovecot.debug", "vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"]; debug_log "Start sieve script for learning ham."; if environment :matches "imap.mailbox" "*" { set "mailbox" "${1}"; } if string "${mailbox}" "Trash" { stop; } if string "${mailbox}" "INBOX/Trash" { stop; } if environment :matches "imap.user" "*" { set "username" "${1}"; } debug_log "Execute learn-ham.sh"; pipe :copy "learn-ham.sh" [ "${username}" ];
另外文档里明确说明:
Sieve allows you to only run scripts under sieve_pipe_bin_dir. You can’t use /usr/local/bin/my-sieve-filter.sh, you have to put the script under sieve_pipe_bin_dir and use my-sieve-filter.sh instead.
所以我把sieve_pipe_bin_dir配置成了/usr/bin,因为sieve-filter也在这个目录里,但在我的Arch Linux系统上,根本找不到sieve-pipe或者sieve-execute的二进制文件,用下面的命令查了官方包也没结果:
pacman --query --list | grep --perl-regexp '/usr/bin/sieve-(pipe|execute)'
文档里还提到了Unix套接字的配置,我不确定是不是需要手动创建这些套接字,也不知道具体该怎么配置相关参数。这里贴一下我相关的配置片段:
# The directory where the program sockets are located for the # vnd.dovecot.pipe, vnd.dovecot.filter and vnd.dovecot.execute extension # respectively. The name of each unix socket contained in that directory # directly maps to a program-name referenced from the Sieve script. #sieve_pipe_socket_dir = sieve-pipe #sieve_filter_socket_dir = sieve-filter #sieve_execute_socket_dir = sieve-execute # The directory where the scripts are located for direct execution by the # vnd.dovecot.pipe, vnd.dovecot.filter and vnd.dovecot.execute extension # respectively. The name of each script contained in that directory # directly maps to a program-name referenced from the Sieve script. #sieve_pipe_bin_dir = /usr/lib/dovecot/sieve-pipe #sieve_filter_bin_dir = /usr/lib/dovecot/sieve-filter #sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute sieve_pipe_bin_dir = /usr/bin sieve_filter_bin_dir = /usr/bin sieve_execute_bin_dir = /usr/bin }
最后是我的Dovecot插件配置:
plugin { imapsieve_mailbox1_before = file:/var/vmail/sieve/global/report-spam.sieve imapsieve_mailbox1_causes = COPY imapsieve_mailbox1_name = Junk imapsieve_mailbox2_before = file:/var/vmail/sieve/global/report-ham.sieve imapsieve_mailbox2_causes = COPY imapsieve_mailbox2_from = Junk imapsieve_mailbox2_name = * sieve = file:~/sieve;active=~/.dovecot.sieve sieve_before = /var/vmail/sieve/global/main.sieve sieve_execute_bin_dir = /usr/bin sieve_filter_bin_dir = /usr/bin sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment sieve_pipe_bin_dir = /usr/bin sieve_plugins = sieve_imapsieve sieve_extprograms }
备注:内容来源于stack exchange,提问作者Volker Raschek

