Я переписываю тему некоторых входящих писем в зависимости от поля «КОМУ»:
:0fhw
* ! ^TO_user@domain\.com\>
* ^TO_[^<>@ ]+@domain\.com\>
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPAM]$MATCH"
Приведенный выше код (из моего предыдущего вопроса)procmail переписывает тему, если получатель электронной почты не проходит проверку на соответствие) работает отлично - если я получаю почту НЕ ОТКУДА[email protected], тема письма переписывается как [СПАМ] (исходная тема)
Но я хотел бы сделать несколько условий, подобных этому: рабочий блок, представленный выше, будет последним, но перед этим я хотел бы переписать строку темы, если поле «Кому» соответствует другому адресу.
Поэтому я добавил этот блок прямо над ним:
:0fh
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH"
$DEFAULT
... и это работает - письма отправляются на адрес '[email protected]' перепишите тему письма.
Проблема в том, что Procmail не останавливается — он переходит наследующийблокирует и переписывает его снова. Поэтому письма, отправленные с целью [email protected]
переписать свои темы, можно переписать следующим образом:
[СПАМ] [СПЕЦИАЛЬНОЕ] Оригинальная тема бла-бла
Почему это так? Почему $DEFAULT
действие в конце первого блока не заставляет Procmail останавливать обработку этого фрагмента письма?
Как мне сопоставить новый блок иостанавливатьсяобработать это письмо и просто покончить с этим?
решение1
В $DEFAULT
конце — синтаксическая ошибка. Вы не можете указать несколько действий в одном рецепте.
Вы можете разделить его на два рецепта или, как в данном случае, просто объединить переписывание и доставку.
:0:
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH" >>$DEFAULT
Здесь больше нет fh
флагов, поскольку мы хотим передать все сообщение (а не только заголовки, что h
делается) и хотим доставить, а не захватить результаты конвейера обратно в Procmail (что f
делается).
Здесь предполагается, что $DEFAULT
это файл, а не каталог; поэтому мы также добавляем второй параметр :
для указания блокировки.
Если вы хотите указать два действия при одном наборе условий, вы можете использовать фигурные скобки с несколькими рецептами внутри них. Каждый рецепт может иметь ноль или более условий, но только одно действие.
:0
* ^TO_special@domain\.com
* ^Subject:\/.+
{
:0fhw
| formail -I"Subject: [SPECIAL]$MATCH"
:0:
$DEFAULT
}
но в данном случае это ненужное усложнение.
(Возможно, было бы более идиоматичным перенести ^Subject:
условие в formail
рецепт, где оно логически и должно быть, но в любом случае это всего лишь отступление.)
Также, кстати, возможно, стоит убедиться, что вы указали PATH
правильный путь в самом начале, .procmailrc
чтобы избежать необходимости указывать полный путь к внешним утилитам, таким как formail
.