Переменные Procmail и синтаксис рецептов

Я пытаюсь понять синтаксис procmailrc. Из документации, которую я прочитал, я могу установить свои собственные переменные, используя VARNAME= значение, а затем использовать их в другом месте, ссылаясь на $VARNAME.

Я также понимаю, что рецепты фильтруют ввод почты для различных действий (диспозиций)

У меня есть procmailrc с одним рецептом и 2 переменными, как показано ниже:

SUBJECT='formail -xSubject:'
FROM='formail -rt -xTo:'

:0:
* !^From:.gmail\.com
| (formail) | $SENDMAIL -t -oi
archive

Прав ли я, говоря, что переменные SUBJECT и FROM в этом случае не имеют значения, поскольку они не используются где-либо еще в файле?

Кроме того, я довольно плохо разбираюсь в регулярных выражениях, но из того, что я прочитал из документации (как procmail, так и regex), я прав, говоря, что рецепт фильтрует почту, которая НЕ имеет "From:Xgmail.com", где X любой символ? то есть, если в письме есть "mail from:", он не будет фильтроваться по этому рецепту, но если в письме будет "mail from:", то оно будет отфильтровано?

Кроме того, во 2-й последней строке, если у formail нет аргументов, куда он отправляет ответное письмо и с каким контентом? Есть ли дефолт?

Наконец, означает ли последняя строка, что копия письма помещается в файл "архива" в почтовом каталоге?

Спасибо!

1 ответ

Решение

Во-первых, ваш пример содержит синтаксическую ошибку. Рецепт может содержать ровно одно действие. Фактически, ваш рецепт будет эффективно проанализирован как

:0:
* !^From:.gmail\.com
| (formail) | $SENDMAIL -t -oi

archive=''

Вы также получите "посторонний локальный файл блокировки", потому что Procmail не может определить файл блокировки для действия конвейера.

Если вы хотите два действия для рецепта, используйте фигурные скобки:

:0
* !^From:.gmail\.com
{
  :0c
  | (formail) | $SENDMAIL -t -oi
  :0:
  archive
}

c Флаг на первом рецепте внутри фигурных скобок говорит: "Это не окончательная доставка"; по умолчанию Procmail прекращает обработку сообщения, когда оно считается доставленным.

Обратите внимание также на разницу между одинарными кавычками и обратными кавычками. Ваши назначения создают переменные, которые содержат текст между кавычками. Предположительно вы действительно имеете в виду

SUBJECT=`formail -xSubject:`  # not SUBJECT='formail -xSubject:'
FROM=`formail -rt -xTo:`  # not FROM='formail -rt -xTo:'

И действительно, если вы никогда не используете эти переменные для чего-либо, присваивать их бессмысленно (хотя есть и другие переменные, особенные для Procmail, поэтому присваивание, например, LOGFILE или же LOCKFILE или же SENDMAIL будет иметь влияние на работу Procmail).

formail без аргументов просто передает стандартный ввод в стандартный вывод, с некоторой нормализацией заголовков. Я не думаю, что он выполняет какую-либо полезную функцию здесь. Скобки вокруг команды приводят к ее запуску в отдельной оболочке, что также бессмысленно и неэффективно.

Отправка сообщения снова с sendmail -t создаст почтовый цикл, так что вы, вероятно, вообще не хотите выполнять это действие, если сообщения, которые вы обрабатываете, не гарантированно Bcc:например, по текущему адресу (в этом случае сообщение будет отправлено видимым получателям в заголовках, но не вам снова; так что никакой почтовой петли).

^ в регулярном выражении привязывает поиск к началу строки, поэтому другого текста не может быть до From:и неэкранированная точка соответствует любому символу, кроме символа новой строки, в точности как вы объясняете; лучшее регулярное выражение, вероятно, будет ^From:(.*\<)?gmail\.com который, по крайней мере, требует, чтобы перед словом не было символа gmail.com (но это неверный адрес электронной почты, поэтому, возможно, я не могу правильно угадать, чего вы надеетесь достичь). Наконец, как вы уже поняли, восклицательный знак отрицает регулярное выражение, поэтому рецепт срабатывает, когда регулярное выражение не совпадает.

Возможно, вы уже нашли http://www.iki.fi/era/procmail/quickref.html и http://www.iki.fi/era/mail/procmail-debug.html - хотя они устарели, они должны надеяться, помогите разобраться с некоторыми вашими вопросами в будущем.

Другие вопросы по тегам