Регулярные выражения довольно просты. Почти каждый персонаж просто соответствует самому себе. Так что если у вас есть (начало строки) F
r
o
m
:
, за которым следует что-либо, за которым следует a
d
d
r
e
s
s
9
... это должно совпадать.
Procmail не поддерживает различные расширения Perl, такие как \d
или \t
, и, конечно, нет необходимости использовать символы обратной косой черты, которые не имеют специального значения в регулярном выражении, например @
. Если вы хотите сопоставить одну цифру, то есть [0-9]
без каких-либо обратных слешей (они превратят [
и ]
обратно в буквальные совпадения).
^Subject:\/.+
проверяет наличие хотя бы одного символа в заголовке Subject:
и собирает все это в $MATCH
. Этот не проверяет, что объект пуст. Возможно, вы хотите что-то вроде
# \t is not supported, replace with a literal tab character
* ^Subject:[ \t]+$
, где \t
следует заменить буквенной вкладкой. Каждое сообщение должно содержать заголовок Subject:
, поэтому оно всегда будет там, но если его значение полностью состоит из пробелов, это считается пустой темой. И, конечно, если заголовок пуст, нет необходимости захватывать его содержимое.
Сказав это, ваше выражение будет совпадать, если после двоеточия в Subject:
будет хотя бы один пробел, так что, опять же, оно действительно должно совпадать в вашем тестовом примере, если в действительности нет абсолютно ничего в заголовок Subject:
.
Так или иначе, если бы это была ваша проблема, рецепт From:
мог бы действительно соответствовать, но условие Subject
не совпадало. При ведении журнала Procmail VERBOSE
каждое регулярное выражение с "соответствием" или "отсутствием совпадения" будет отображаться в файле журнала.
:0 fhw
* ^From.*address9@gmail\.com
* ^Subject:[ ]*$
| /usr/bin/formail -i "Subject: [New Report]"
Или, возможно, вы хотите сделать это с любым заголовком Subject:
? (На этот раз я использую правильную буквенную вкладку - проверьте, правильно ли вы копируете / вставляете это! Должен быть пробел и вкладка между [
и ]
.)
:0 fhw
* ^From.*address9@gmail\.com
* ^Subject:[ ]*\/.*$
| /usr/bin/formail -i "Subject: [New Report] $MATCH"
Для устранения неполадок, возможно, взгляните на http://www.iki.fi/era/mail/procmail-debug.html
Переполнение стека Минимальный воспроизводимый пример Руководство также полезно. Вкратце, постарайтесь свести проблему к простейшему входному сообщению и простейшему рецепту, который ведет себя не так, как вы ожидаете, а затем, если вы не сможете уменьшить его дальше, внимательно взгляните на то, что у вас осталось. Общие причины путаницы включают
- искаженные входные сообщения
- Пустые строки в заголовках?
- Заголовки, заключенные в несколько физических строк?
- Pesky управляющие символы там, где их не должно быть, ни в сообщении, ни в вашем скрипте Procmail (не используйте редакторы Windows
^W
)
- необоснованные предположения
- Regex не работает, как вы думали?
- Регулярный диалект Procmail отличается, например, от В Perl? Онлайновые тестеры регулярных выражений обычно принимают набор функций регулярных выражений Perl (или иногда Javascript)
- По умолчанию Procmail сопоставляет только заголовки; некоторые начинающие упускают это и удивляются, когда не находят строку, которая явно присутствует только в теле
- MIME-кодирование передачи контента скрывает контент, который, как вы думаете, вы знали, был там?
- Ваше регулярное выражение действительно должно соответствовать буквальному фрагменту текста в сообщении; Procmail не нормализует, например Извлечь только адрес отправителя в удобной форме для сопоставления.
... Да, и все любимые: убедитесь, что вы установили SHELL=/bin/sh
прямо в верхней части вашего файла рецепта. За эти годы это стало источником многих совершенно загадочных неудач.
Вот короткая демонстрация, демонстрирующая, что ваш тестовый пример работает на меня:
tripleee@debian$ cat >test.msg
From: Name Lastname <address9@gmail.com>
Date: Wed, 12 Jun 2019 20:37:17 +1200
Message-ID<CADxD3vdy5cW55mogOK5+543ngU7iFKjJcpDV3Q4YL772F=LdQ@mail.gmail.com>
Subject:
No fooling
^D
tripleee@debian$ cat >test.rc
SHELL=/bin/sh
DEFAULT=/dev/null
VERBOSE=yes
:0 fhw
* ^From.*address9\@gmail\.com
* ^Subject:\/.+
| /usr/bin/formail -i "Subject: [New Report]$MATCH"
^D
tripleee@debian$ procmail -m test.rc <test.msg
procmail: [3717] Wed Jun 12 13:38:55 2019
procmail: Match on "^From.*address9\@gmail\.com"
procmail: Assigning "MATCH="
procmail: Matched " "
procmail: Match on "^Subject:\/.+"
procmail: Executing " /usr/bin/formail -i "Subject: [New Report]$MATCH""
procmail: Assigning "LASTFOLDER=/dev/null"
procmail: Opening "/dev/null"
From address9@gmail.com Wed Jun 12 13:38:55 2019
Subject: [New Report]
Folder: /dev/null 253