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