Я пытаюсь понять синтаксис 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 - хотя они датированы, мы надеемся, что они помогут разобраться в некоторых из ваших вопросов в будущем.