Рецепт Procmail с группой захвата
Попытка направить электронную почту на основе соответствия регулярному выражению.
Я знаю, что я могу сделать это:
echo | mail -s test1 me-route2
с этим рецептом:
* ^To:.*me-route2\@
:0:
/home/me/folder-route2/afile
Я хотел бы сделать что-то вроде этого:
* ^To:.*me-(route\d)\@
:0:
/home/me/folder-$MATCH/afile
но я получаю:
procmail: Lock failure on "/home/me/folder-/afile.lock"
2 ответа
У вас есть строка пролога и условие в неправильном порядке. Но кроме того, Procmail не распознает Perlism \d, (См., Например, здесь немного истории регулярных выражений и тайны.) Попробуйте вместо этого:
:0:
* ^To:.*me-\/route[0-9]
/home/me/folder-$MATCH/afile
или, если вы действительно хотите убедиться, что за соответствующим выражением сразу следует знак @,
:0:
* ^To:.*me-\/route[0-9]@
* MATCH ?? ^\/route[0-9]
/home/me/folder-$MATCH/afile
Из ввода To: reallynotme-route2@example.com, первое условие фиксирует route2@ и второе условие соответствует через route2 для того, чтобы отбросить трейлинг @ от MATCH,
Я подозреваю, что файл блокировки не требуется, поэтому следует удалить второе двоеточие, но это зависит от того, что afile является. Если это обычный mbox-файл Berkely, вам обязательно следует использовать блокировку. Если это папка Maildir, вы не должны.
Вы также можете посмотреть на замену ^To:.*me с ^TO_me - это будет соответствовать на Cc: и другие соответствующие заголовки, а также буквальный To: заголовок и избегайте совпадений на reallynotme,
Procmail не использует группы захвата, как обычные регулярные выражения, по крайней мере, для MATCH. Со страницы руководства:
Эта переменная присваивается procmail всякий раз, когда ей приказывают извлечь текст из соответствующего регулярного выражения. Он будет содержать весь текст, соответствующий регулярному выражению после токена `/'.
Таким образом, следующее должно работать (не проверено):
* ^To:.*me-\/route\d
MATCH будет содержать все, что соответствует регулярному выражению после \/так что "маршрут \ д".
К сожалению, это может сделать неожиданные вещи с таким адресом, как me-route2-ab@example.com, с MATCH будучи "route2". Но это может быть приемлемым для вас.