Как я могу прочитать одно сообщение за раз из / var / mail

4

Допустим, у меня есть 5 сообщений в / var / mail /, и я хочу прочитать одно сообщение за раз, а затем выполнить поиск строки в этом письме, прежде чем перейти к следующему сообщению. Есть ли команда, которую я могу использовать для разбора одного сообщения за раз?

Я ищу написать bash-скрипт, который будет читать все сообщения в файле mbox, а затем читать их по одному, чтобы я мог затем извлечь Subject, To, From & Status сообщения (код возврата). Мой план состоял в том, чтобы использовать grepmail для подсчета количества писем в файле, а затем использовать это число в цикле for, чтобы получать по одной почте за раз, и они выполняли операции над текстом. Что-то вроде:

$count = grepmail -r . /var/mail/user | awk '{print $2}'
for($i=1;$i<=$count;$i++) {
    $content = *GetMessage* -number $i /var/mail/user
    ...
    Do string operation on this message & save to $DelimitedData
    ...
}
$Delimiteddata

Я не могу понять, как получить одно сообщение за раз, чтобы выполнить над ним строковую операцию. Может кто-нибудь подсказать мне, какая команда / программа может помочь мне сделать это не в интерактивном режиме.

OjasP
источник
1
Я предполагаю, что вы в основном работаете с powershell?
Jesse_b
@Jesse_b Да, я в основном пишу в PowerShell. У меня есть сценарий, который делает именно то, что я хочу, но мы переходим на ящик Linux для некоторых писем, и я хочу убедиться, что я получаю отчеты.
OjasP
Вы можете установить powershell в linux, но, надеюсь, кто-то также может помочь вам с решением для оболочки, так как оно будет быстрее.
Jesse_b
formailОтвет @Gilles хорош, но также стоит знать, что маркер «начала сообщения» в файле формата mbox - это строка, начинающаяся с From («From» и пробел). Это может быть надежно использовано для разделения файлов mbox на отдельные сообщения с регулярным выражением, ^From поскольку гарантированно НЕ находится в заголовках или теле сообщения (любые строки тела, которые начинаются с «От», изменяются при сохранении в mbox , обычно "> From" или аналогичный). См en.wikipedia.org/wiki/Mbox
саз

Ответы:

10

formailИнструмент из Procmail (доступен в любом дистрибутиве, это классический) предназначен именно для этой цели.

Основное использование:

formail -s myprogram --option

работает myprogram --optionпо каждой почте по очереди. Программа получает каждое письмо на свой стандартный ввод.

жилль
источник
Не уверен, что formailможет забрать N-е сообщение в существующий файл спула, хотя может ли это?
Ройма
@roaima Я не думаю, что это необходимо (у ОП был этот цикл, потому что они не знали, как обрабатывать сообщения в mbox один за другим), но formailесть +skipопция и -totalопция («пропустить» в +skipэто количество пропущенных сообщений, а "total" in -total- это общее количество выводимых сообщений - поэтому +5 -1будет выводиться только 6-е сообщение).
саз
Спасибо за комментарий @ Жиль. Я не могу понять, как использовать поток из formail в сценарии оболочки. В моем тестовом сценарии я просто читаю ввод из команды formail -s и отображаю его, но я не получаю никакого вывода, и скрипт ждет, пока я не нажму Ctrl + C. Вот мой сценарий: #! / Bin / sh print $ 1 read -p message </ dev / tty echo "$ {message}" Я вызываю его с помощью formail -s test.sh -d
OjasP
1
@OjasP formailчитает со стандартного ввода, например,formail </var/mail/bob -s test.sh
Жиль
Спасибо @ Жиль! Для кого - то другого , кто спотыкается через это, я использовал эту команду: formail -s </var/mail/user ./test.sh. И в файле test.sh я читаю сообщение, используяmessage=$(</dev/stdin)
OjasP