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