Я пытаюсь запустить некоторые правила smartsieve для почтового ящика IMAP, я, безусловно, могу сделать это для писем, которые доставляются в этот почтовый ящик, но для писем, которые уже находятся в этом почтовом ящике, или тех, которые были перемещены в него (через thunderbird / outlook ) правила не обрабатываются. Существуют ли какие-либо приложения / методы для запуска правил в почтовом ящике каждые X секунд / минут?
В новых версиях 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 ""
По своей задумке sieve обрабатывает почту, поступающую в почтовый ящик пользователя извне. Встроенного способа обработки папок впоследствии нет.
Однако можно было бы собирать сообщения из папки cyrus («горячая папка») и повторно отправлять их через обычный MTA в специальный почтовый ящик («специальный почтовый ящик»), который, в свою очередь, имеет нужные вам правила сита.
Для этого можно использовать что-то вроде этого, например, через cron:
#!/bin/sh
for msg in /var/spool/cyrus/mail/hotfolder; do
sendmail speicalmailbox <$msg && rm $msg
done
Сообщения в "горячей" папке удаляются из файловой системы без удаления из индекса cyrus, это не оптимально. Вы могли бы использовать iprune
(часть дистрибутива cyrus, он будет удалять сообщения из папок в зависимости от их возраста), чтобы исправить это. Необходимо удаление из файловой системы, поэтому мы не обрабатываем каждое сообщение несколько раз.
Надеюсь, это поможет.