Сплит большой mbox по отправителю

Я ищу способ разделить очень большой файл mbox на несколько файлов mbox (по одному для каждого отправителя).

В качестве альтернативы, чтобы извлечь сообщения только указанным отправителем.

Глядя вверх и вниз по Интернету, но не нашел (или использовал неправильные условия поиска.

Заранее спасибо.

1 ответ

Может быть, Archmbox соответствует вашим потребностям. Там также статья об этом.

Если у вас есть Procmail, formail -s procmail -m simple.rc <mbox разделит сообщения на mbox в отдельные папки на основе любых правил, которые вы вводите simple.rc. (Если нет, перейдите к альтернативе Awk.) Например,

:0:
* ^From:(.*\<)?(billg|william henry gates)
billg

:0:
* ^From steve@(pixar|next|apple)\.com
steve

:0:
* ^Subject: I for one welcome our new lizard overlords
lizard

:0:
unmatched

применяет три регулярных выражения по порядку и перенаправляет входящее сообщение в соответствующую папку mbox для первого совпавшего. Окончательная доставка является безусловной и заботится о любых сообщениях, не соответствующих условию.

Единое понятие "отправитель" четко не определено; есть много разных полей, которые вы можете изучить, которые иногда возвращают разные результаты в зависимости от того, как именно было отправлено сообщение. ТривиальноFrom: заголовок обычно должен содержать имя и адрес отправителя (но некоторые люди используют разные почтовые клиенты, которые по-разному форматируют эту информацию в разных случаях, а иногда и несколько адресов), но есть, по крайней мере, номинальные сценарии, в которых вам следует изучить Sender: или Resent-From: или отправитель конверта (называемый From_ в кругах Procmail), а также.

formail -s program args <mbox просто читает mbox и разбивает его на отдельные сообщения и запускает program args для каждого извлеченного сообщения по очереди, передавая сообщение как стандартный ввод.

Если отправитель конверта в разделителе mbox достаточно точен для сортировки сообщений (совет: попробуйте

LC_ALL=C sed -n '/^From /!d;s///;s/ .*//p' mbox |
sort | uniq -c | sort -r -n >senders

и исследуем полученный sendersфайл, чтобы увидеть, какие адреса отправителя конверта там есть. ВLC_ALL=C может быть необязательным, но должен предотвратить использование Unicode sed от жалобы на ввод, отличный от UTF-8), вы можете использовать простой скрипт Awk для разделения сообщений:

awk '/^From / {
        if (NR>1) close output
        if ($2 ~ /billg|whgates/) output="billg"
        else if ($2 ~ /steve@(pixar|next|apple)/ output="steve"
        else if ($2 ~ /lizard-l@lizzserv/) output="lizard"
        else output="unmatched"}
    { print >>output }' mbox
Другие вопросы по тегам