У вас, кажется, есть два или три разных вопроса; Правильный этикет для переполнения стека будет заключаться в том, чтобы спрашивать каждого по отдельности - это также помогает будущим посетителям, у которых есть только одна из ваших проблем.
Прежде всего, чтобы разделить mbox-файл Berkeley, содержащий несколько сообщений, и запустить Procmail для каждого отдельно, попробуйте
formail -s procmail -m <file.mbox
Возможно, вам потребуется прочитать о форматах почтовых ящиков, поддерживаемых Procmail . Почтовый ящик Berkeley - это отдельный файл, содержащий несколько сообщений, просто разделенных строкой, начинающейся с From
(с пробелом после четырех буквенных символов). Этот разделитель должен быть уникальным, и поэтому сообщение, которое содержит эти пять символов в начале строки в теле, должно быть каким-либо образом экранировано (обычно путем написания >
перед From
).
Чтобы сохранить каждое сообщение в отдельном файле, выберите другой формат почтового ящика, чем в однофайловом формате Беркли. Конкретно, если местом назначения является каталог, Procmail создаст новый файл в этом каталоге. Как именно будет назван новый файл, зависит от содержимого каталога (если он содержит подкаталоги Maildir new
, tmp
и cur
, новый файл создается в new
в соответствии с соглашениями об именах Maildir) и о том, как именно указан каталог (косая черта и точка выбирают формат MH; в противном случае формат почтового каталога).
Сохранение в одном почтовом ящике для каждого получателя имеет ряд неприятных угловых случаев. Что если сообщение было отправлено нескольким местным получателям? Что делать, если адрес получателя не отображается в заголовках? и т. д. (Мини-FAQ по Procmail содержит раздел об этом в контексте виртуального хостинга домена, который, по сути, представляет собой вариант). Но если мы просто проигнорируем это, вы сможете выполнить что-то вроде
:0 # whitespace before ] is a literal tab
* ^TO_\/[^ @ ]+@(yourdomain\.example|example\.info)\>
{
# Trim domain part from captured MATCH
:0
* MATCH ?? ^\/[^@]+
./$MATCH/
}
Это захватит в $MATCH
первый адрес, который соответствует регулярному выражению, затем выполнит другое сопоставление регулярного выражения для захваченной строки, чтобы захватить только часть перед знаком @
. Это, очевидно, требует, чтобы все адреса, которые вы хотите сопоставить, находились в наборе определенных доменов (здесь я использовал yourdomain.example
и example.info
; очевидно, заменили их фактическими именами доменов), и чтобы захват первого подходящего адреса был достаточным ( поэтому, если сообщение было To: alice@yourdomain.example
и Cc: bob@example.info
, то, какое из них ближе к началу сообщения, будет выбрано по этому рецепту, а другое будет проигнорировано).
Более подробно, специальный токен \/
заставляет Procmail скопировать текст, который соответствует регулярному выражению после этой точки, во внутреннюю переменную MATCH
. Как показывает этот рецепт, вы можете выполнить сопоставление регулярных выражений для самой переменной, чтобы извлечь ее подстроку (или, другими словами, отбросить часть захваченного совпадения).
Действие ./$MATCH/
использует захваченную строку в MATCH
в качестве имени папки для сохранения. Начальный ./
указывает текущий каталог (который равен значению переменной Procmail MAILDIR
), а завершающий /
выбирает формат почтового каталога.
Если ваши ожидаемые получатели не могут быть ограничены определенным набором доменов или иным образом сопоставлены одним регулярным выражением, я рекомендую задать новый вопрос с более ограниченной областью действия и достаточным количеством деталей, чтобы фактически определить, что вы хотите достигнуть.