Python сам содержит библиотеку email
, которая, безусловно, позволяет извлекать текст из заголовков и тела, с несколько большей точностью, чем чистый регулярное выражение, с которым вы ограничены Procmail.(Особенно структуры MIME сложно обрабатывать в Procmail.)
Если вы этого не хотите, и для каждого сообщения нужен небольшой статический набор заголовков, вполне может быть достаточно регулярного выражения.Procmail позволяет вытащить часть соответствия регулярному выражению с помощью специального токена \/
.Захваченный текст доступен в специальной переменной MATCH
.
:0 # The whitespace between [...] is a space and a tab
* ^Subject:[ ]*\/.+
{ SUBJECT=$MATCH }
:0
| /home/ali/Maildir/a.sh -s "$SUBJECT"
Переменные Procmail, которые вы определяете сами, будут экспортированы, так что вы фактически можете получить доступ к $SUBJECT
из a.sh
напрямую;это создает другую сложность, потому что вы должны явно установить эту переменную при тестировании сценария, но это может быть проще для вашего сценария, чем реализация разбора параметров.
Третий вариант - жестко закодировать аргументы сценария так, чтобы $1
- субъект, $2
- отправитель и т. Д .;но это ужасно с точки зрения юзабилити, поэтому я не рекомендую это делать.(Если вы все равно это сделаете, вам нужно как минимум документировать это в исходном коде скрипта, ради вашего здравого смысла.)
На самом деле я бы реорганизовал это, чтобы просто вызвать ripmime
и python
напрямую из Procmail.
:0
* ^Subject:[ ]*\/.+
{ SUBJECT=$MATCH }
:0c
| ripmime -i - -d Maildir/ --prefix
:0
| python3 Maildir/a.py -s "$SUBJECT"
(В качестве отступления не жестко кодируйте пути к ripmime
и python3
. Вместо этого убедитесь, что ваш PATH
вменяемый. Возможно, также убедитесь, чтоa.py
имеет правильную строку shebang и помечает его как исполняемый, и убирает python3
.)
Ваше текущее решение без необходимости усложняет вопрос, вызывая Python из сценария оболочки, который вы вызываете из Procmail.Если Python не занимает центральное место в актуальном вопросе, может быть что-то вроде
:0
| b.sh
, где b.sh
заменяет a.sh
и a.py
на что-то вроде
#!/bin/sh
t=$(mktemp -t -d procmbXXXXXXXXX) || exit
# clean up when done or if interrupted
trap 'rm -rf "$t"' EXIT HUP INT QUIT TERM
cat >"$t"/00input.msg
ripmime -i "$t"/00input.msg -d "$t" --prefix
# as per your updated requirement in a comment
scp "$t" remotehost:messages/"$(basename "$t")"
Если ваш реальныйНа самом деле вопрос «где Procmail сохранил это сообщение?», переменная Procmail $LASTFOLDER
содержит имя файла.