Как фильтровать и доставлять сообщения в Procmail

Как фильтровать и доставлять сообщения в Procmail

Я переписываю тему некоторых входящих писем в зависимости от поля «КОМУ»:

: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.

Связанный контент