LINUX.ORG.RU

Парсинг email сообщения

 , , ,


0

1

На своем почтовом сервере (postfix+dovecot) имеем папочку с письмами. Задача достать email из поля «From» заголовка письма.

Для этого пытаюсь написать скрипт вида:

path="/mail/domen/box/folder/*"
pat="<(.*)>"
for mes in $path
do
     str=$(awk '/^From: /' $mes)
     [[ $str =~ $pat ]]
     echo "${BASH_REMATCH[1]}"
done

Если интересующий email находится в одной строке со словом «From:» то все прекрасно отрабатывает, но в некоторых заголовках это разбито на 2 строки. Вопрос: как решить задачу? Можно ли получить 2 строки разом от awk? Использовать sed для склеивания этой строки или же есть другое более разумное решение?


Можно ли получить 2 строки разом от awk? Использовать sed для склеивания этой строки

Можно и можно. По поводу других решений - не знаю. Ты хоть пример строки приведи, которую парсить надо и с которой проблема.

anonymous
()
Ответ на: комментарий от anonymous

например если строка From не содержит @ делай getline и объединяй строку.

anonymous
()
Ответ на: комментарий от anonymous

Фрагмент заголовка сообщения


Return-Path: <blabla@bla.ru>
Delivered-To: aaa@eee.ru
Received: from mail21-244 blablablabla
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=mailing; d=srv2.de;
 h=Date:From:Subject:To:Reply-To:Message-ID:MIME-Version:Content-Type:X-ulpe:
 List-Id:X-CSA-Complaints:List-Unsubscribe:List-Unsubscribe-Post;
 bh=I29asyzsdkTVfjdTtas+9pWBasdaIOS0vJasdasdL4J23dSjP7hCunUTGak=;
 b=KL+odPTNQ4vCO9/ACTvfOssyNNWm970QF15upOfeexKZq0jjeQeYOAcqOWf7Vx/+Hhac2Rdasd2cApq
   VuH4sSfOZ89A2Ibo3fEty2d+StygNsc0oO/MmNcUfeaw5UwDjB5BTElbaHnPiNyfAAliekrFSWgX
   xMtiMCbxg85qhdMGgxc=
Date: Tue, 9 Jun 2020 11:06:38 +0000 (UTC)
From: =?utf-8?Q?=D0=9A=D0=BE=D0=BC=D1=83=D1=81?=
 <aaaaaa@bbbb.ccc.net>
Subject: =?utf-8?Q?=D0=9E=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?=
 =?utf-8?Q?=D1=8F_=D0=BF=D0=B8=D1=82=D0=B0=D0=BD=D0=B8=D1=8F_=D1=81?=
 =?utf-8?Q?=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2_?=
 =?utf-8
Icy
() автор топика
Ответ на: комментарий от anonymous

Если бы всё так просто. Ну, допустим, после print можно и exit, чтобы из тела не брать From:, но вот если присмотреться на rfc822, то вдруг обнаруживается, что не только @ в кавычках допустим, но и как именах персон без кавычек. Как различать — полезное упражнение для самостоятельного изучения и программирования :)

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

пусть изучает, парсинг со всеми нюансами для него писать никто не будет

anonymous
()
Ответ на: комментарий от Icy

кури ман по awk и шишки хорошие можешь тоже

anonymous
()
str=$(perl -MEmail::Simple -E'local $/; say Email::Simple::->new(<>)->header("From")' "$mes")
anonymous
()

Что-то захотелось «размяться»

$ grep -A1 -m1 '^ *From:' FILE | sed -r 'N;s/^[^<]*<([^>]*)>.*/\1/'
pavlick ★★
()
Ответ на: комментарий от Icy

если ты парсаешь mbox, то лучше взять perl ибо тут 20 строк на всю программу. все модуля есть в дебиан.

#!/usr/bin/perl -w
use strict;
use Mail::Mbox::MessageParser;
use Email::Simple;

Mail::Mbox::MessageParser::SETUP_CACHE({ 'file_name' => '/tmp/cache' } );

my $mbox="/var/mail/vitus";
my $mboxHandle = new FileHandle($mbox);

my $folderReader =
  new Mail::Mbox::MessageParser( {
    'file_name' => $mbox,
    'file_handle' => $mboxHandle,
    'enable_cache' => 1,
    'enable_grep' => 1,
  } );

die $folderReader unless ref $folderReader;

my $count = 0;

while(!$folderReader->end_of_file()) {
  my $email = $folderReader->read_next_email();
  my $from = new Email::Simple($$email)->header('FROM');
  print $from, "\n";
  $count = $count + 1;
}

print "Email count: $count\n";

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.