You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dovecot+Rspamd环境下无法触发垃圾邮件与正常邮件学习脚本的问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:47:59