Рецепт 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". Но это может быть приемлемым для вас.

Другие вопросы по тегам