Назад | Перейти на главную страницу

Рецепт 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"

У вас неправильный порядок пролога и условия. Но кроме того, 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 затем будет содержать все, что соответствует регулярному выражению после \/, так что "route \ d".

К сожалению, с таким адресом, как me-route2-ab@example.com, с участием MATCH будучи "route2". Но это может быть приемлемо для вас.