在邮箱上运行规则?

在邮箱上运行规则?

我正在尝试在 IMAP 邮箱上运行一些 smartsieve 规则,我当然可以对发送到该邮箱的邮件执行此操作,但对于已经在该邮箱中的电子邮件或移动到该邮箱的电子邮件(通过 thunderbird/outlook),规则不会被处理。是否有任何应用程序/方法可以每隔 X 秒/分钟在邮箱上运行规则?

答案1

根据设计,Sieve 会在邮件从外部进入用户邮箱时对其进行处理。没有内置方式来事后处理文件夹。

但是,可以从 cyrus 文件夹 (“hotfolder”) 收集消息,然后通过常规 MTA 将它们重新发送到特殊邮箱 (“specialmailbox”),而该邮箱又具有您需要的筛选规则。

为此,您可以使用类似这样的方法,例如通过 cron:

#!/bin/sh
for msg in /var/spool/cyrus/mail/hotfolder; do
    sendmail speicalmailbox <$msg && rm $msg
done

“热门”文件夹中的消息从文件系统中删除,但未从 Cyrus 索引中删除,这不是最佳选择。您可以使用iprune(Cyrus 发行版的一部分,它将根据消息的年龄从文件夹中删除消息)来解决这个问题。需要从文件系统中删除,这样我们就不会多次处理每条消息。

我希望这有帮助。

答案2

较新版本的 dovecot 和 pidgeonhole 现在带有 sieve-filter 命令。因此,您可以编写一个脚本来扫描所有邮箱以查找“INBOX.Refilter”文件夹,然后针对该文件夹运行 sieve-filter。

该脚本假定您已将邮件文件夹构造为 /var/vmail/domain/user。

#!/bin/bash

FIND=/usr/bin/find
GREP=/bin/grep
RM=/bin/rm
SED=/bin/sed
SORT=/bin/sort

# BASE should point at /var/vmail/ and should have trailing slash
BASE="/var/vmail/"

RESORTFOLDER="INBOX.Refilter"

SEARCHFILE="dovecot-uidlist"

echo ""
echo "Search for messages to resort under ${BASE}"
echo "Started at: " `date`
echo "Looking for mailboxes with ${RESORTFOLDER}"
echo ""

# since RHEL5/CentOS5 don't have "sort -R" option to randomize, use the following example
# echo -e "2\n1\n3\n5\n4" | perl -MList::Util -e 'print List::Util::shuffle <>'

DIRS=`$FIND ${BASE} -maxdepth 3 -name ${SEARCHFILE} | \
    $SED -n "s:^${BASE}::p" | $SED "s:/${SEARCHFILE}$:/:" | \
    perl -MList::Util -e 'print List::Util::shuffle <>'`

# keep track of directories processed so far
DCNT=0

for DIR in ${DIRS}
do
    UD="${BASE}${DIR}.${RESORTFOLDER}"
    D=`echo "$DIR" | tr '/' ' ' | awk '{print $1}'`
    U=`echo "$DIR" | tr '/' ' ' | awk '{print $2}'`

    if [ -d "$UD/cur" ] 
    then
        echo "`date` - $DIR"
        echo " domain: $D"
        echo "   user: $U"
        FILES=`find $UD/cur/ $UD/new/ -type f -name '*' | wc -l`
        echo "  files: $FILES"

        if [[ $FILES -ge 1 ]]; then
            echo "Run $FILES messages back through the sieve filter."
            # -c2 means run at best-effort, -n7 is least priority possible
            ionice -c2 -n7 sieve-filter -e -W -C -u "${U}@${D}" "${BASE}${DIR}.dovecot.sieve" "${RESORTFOLDER}"
        fi

        echo ""
    fi

    # the following is debug code, to stop the script after N directories
    #DCNT=$(($DCNT+1))
    #echo "DCNT: $DCNT"
    #if [[ $DCNT -ge 5 ]]; then exit 0; fi
done

echo ""
echo "Finished at:" `date`
echo ""

相关内容