2015-01-24 4 views
0

То, что я использую ниже, работает, но тестовое электронное письмо попадает как в папку «Входящие», так и в целевую папку (Stuff). Есть ли способ избежать дублирования сообщений IMAP?Procmail копирует сообщение, а не перемещает его

VERBOSE=on 
PATH=/usr/bin:/usr/local/bin 
MAILDIR=$HOME/boxes/domain.com/fred^/.imap/ 
LOGFILE=$HOME/proclog 
SHELL=/bin/sh 

:0: 
* ^Subject:.*test 
Stuff 

Результат журнала:

procmail: Assigning "SHELL=/bin/sh" 
procmail: Match on "^Subject:.*test" 
procmail: Locking "Stuff.lock" 
procmail: Assigning "LASTFOLDER=Stuff" 
procmail: Opening "Stuff" 
procmail: Acquiring kernel-lock 
procmail: Unlocking "Stuff.lock" 
procmail: Notified comsat: "[email protected]:/usr/home/username/boxes/domian.com/fred^/.imap//Stuff" 
From [email protected] Sat Jan 24 00:04:42 2015 
Subject: test 
Folder: Stuff         2213 

Update: Предполагая сообщение дублируется, когда он находит совпадение, вот как я пытался разобраться, а затем обнаружить и устранить дубликат:

VERBOSE=yes 
LOGABSTRACT=all 
PATH=/usr/bin:/usr/local/bin 
LOGFILE=$HOME/proclog 
SHELL=/bin/sh 

MAILDIR=$HOME/boxes/mydomain.com/ 
INBOX=$HOME/boxes/mydomain.com/fred 
STUFF=$HOME/boxes/mydomain.com/fred^/.imap/Stuff 

:0 
* ^Subject:.*test 
${STUFF} 

:0 Whc: msgid.lock 
| formail -D 4096 $MAILDIR/msgid.cache 

:0 a: 
dev/null 

Я также видел этот пример:

:0 Wh:dup 
| formail -D 4096 $MAILDIR/msgid.cache 
+0

procmail вызван рецептом фильтра хост-провайдера - все сообщения для почтового ящика «fred» через procmail, расположенные в/usr/local/bin/procmail. Здесь мой опыт попадает в стену, но, похоже, мой хост использует Postfix под Dovecot. – bobzIlla

+0

По какой-то причине он создает копию с тем же идентификатором сообщения. Обнаружение дубликатов может работать с помощью:: 0 Whc: msgid.lock | но после нескольких десятков попыток я не могу составить рецепт для успешного сортировки по теме, а затем вытеснить дубликат. Я также видел «Wh: dup», но что более уместно? – bobzIlla

+0

Сначала вам нужно удалить дубликаты, а затем доставить то, что осталось. – tripleee

ответ

0

Ваша проблема не связана с Procmail. Если дубликаты были обработаны Procmail (и вы показываете нам все ваши рецепты), они будут доставлены в тот же почтовый ящик Stuff в качестве сообщений, которые вы обрабатываете, а не в свои почтовые ящики. Вам нужно будет изучить конфигурацию Postfix вашего провайдера или просто вызвать эту проблему при их поддержке.

С учетом этого есть несколько пояснений, которые могут быть сделаны для обработки Procmail. Двойное обнаружение не имеет смысла выполнять после того, как вы доставили сообщение: когда сообщение доставляется, Procmail выполняется, и следующие рецепты никогда не выполняются.

Рецепт, который у вас есть, немного ошибочен тем, что у вас есть орфографическая ошибка /dev/null, но также очень неэффективна тем, что вы копируете сообщение только для его выброса. Стандартный рецепт для отбрасывания дубликатов просто

:0Wh:msgid.lock 
| formail -D 8192 msgid.cache 

Но прежде всего, это должно идти , прежде чем любой доставки рецепта. Этот, фактически, доставляет до небес, если сообщение является дубликатом сообщения, которое мы видели раньше; и поэтому Procmail прекращает обработку тогда и там. («Доставка» происходит, потому что сообщение передается в formail для доставки, что, конечно же, не доставит его в любом месте. Если это не дубликат, formail - в этом конкретном режиме с опцией -D - сигнализирует об ошибке, который заставляет Procmail улавливать ошибку и возобновлять со следующего рецепта, надеясь, что это удастся вместо этого.)

На самом деле не имеет значения, что вы называете файлом блокировки, но msgid.lock довольно стандартный. Главное, что два экземпляра Procmail должны использовать один и тот же файл блокировки, чтобы вы могли называть его Ширли и избегать его - пока вы его не меняете, это может быть что угодно (но Ширли плохой потому что вы забудете, что это значит, и позвоните в поддержку вашего провайдера и истерично заявите, что некоторые Ширли, похоже, взломали вашу коробку).

Рецепт с флагом c не полностью переписан с справочной страницы procmailex(5) - это пример того, как хранить подозрительные дубликаты в отдельном почтовом ящике, а не набрасывать их на всякий случай.

Я знаю, не называйте меня Ширли.

1

Благодарим вас за внимание. Вы абсолютно правы, не связаны с procmail и не поддерживали поддержку Pair Networks. BTW, никаких других рецептов в использовании.

Большой удар удачи: найден старинный пост от чрезвычайно полезного пользователя Pair Networks, объясняющего, как писать рецепт, не позволяя qmail вмешиваться.

http://ziggr.com/pairmail/

ExitCode = 99 говорит, что мы Стань собираются заботиться о доставке каждого сообщения, и что Qmail не нужно доставить его в почтовый ящик . Если бы мы этого не сделали, qmail увидит по умолчанию возвращаемый код 0 (ОК) и интерпретирует это как «программа фильтра сказала, что письмо было приемлемым, поэтому теперь я должен его доставить». Это приводит к дублированию копий всех почтовых посылок в вашем почтовом ящике, а также отфильтрованных копий спама/окошка при посадке в почтовых ящиках спама/ветчины.

Включенная на этой странице диаграмма, показывающая, как qmail обрабатывает почту, и рецепт для восстановления фильтрации spamassassin. Моя собственная фильтрация работает без дублирования посадки в INBOX и ждет, чтобы проверить, работает ли фильтрация спама.

LOGFILE=$HOME/proclog 
VERBOSE=YES 

# prevent qmail (the program that is calling procmail 
# as a filter) from delivering the original mail. 
EXITCODE=99 

MAILDIR=$HOME/boxes/domain.com 
INBOX=$MAILDIR/fred 
GREY=$MAILDIR/fred^/.imap/grey 
JUNK=$MAILDIR/fred^/.imap/Junk 
TEST=$MAILDIR/fred^/.imap/Test 


# Spam level 5.0 or greater 
:0 
* ^X-Spam-Level: \*\*\*\*\* 
${JUNK} 

# Spam level 2.0-4.9: hold in grey area 
:0 
* ^X-Spam-Level: \*\* 
${GREY} 

:0: 
* ^Subject:.*test 
${TEST} 

# Spam level < 2.0: it's probably real email, deliver as normal 
:0: 
${INBOX} 
+0

См. Также http://stackoverflow.com/questions/28204990/procmail-recipe-causes-wrong-timestamp – tripleee

+0

Qmail, да? Кто бы вздумал. Вероятно, вы должны принять этот ответ. – tripleee

+0

Да, просто скажите, что имеет смысл включать ссылки между этими вопросами (и/или, возможно, удалить ваш другой вопрос из комментария). – tripleee