Назад | Перейти на главную страницу

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

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

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

У меня есть procmailrc с одним рецептом и двумя переменными, а именно:

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

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

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

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

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

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

Спасибо!

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

: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:ed на текущий адрес, например (в этом случае сообщение будет отправлено на видимый получатели в заголовках, но не вам снова; так что петли почты нет).

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

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