Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Mime::Parser! Тело письма.


Автор: antananarivu 1.7.2010, 16:55
Есть вот такое письмо:


Код

Received: from gw1.next-line.ru (gw1.next-line.ru [89.179.136.51])
    by mail.nextline.ru (Postfix) with ESMTP id E91263120DBD
    for <[email protected]>; Tue,  8 Jun 2010 06:10:44 +0400 (MSD)
Envelope-to: [email protected]
Delivery-date: Tue, 08 Jun 2010 06:05:39 +0400
Received: from [89.108.67.18] (helo=f5.relay.agava.net)    by cp127.agava.net
    with esmtp (Exim 4.69 (FreeBSD))    (envelope-from <[email protected]>)
    id 1OLoCB-0006sd-CL    for [email protected]; Tue, 08 Jun 2010 06:05:39 +0400
Received: from f5.relay.agava.net (unknown [10.0.0.1])
    by f5.relay.agava.net (Postfix) with ESMTP id DD34DA61354;
    Tue,  8 Jun 2010 06:07:44 +0400 (MSD)
X-Virus-Scanned: AGAVA Mail Filter at cluster.relay.agava.net
Received: from mail.rtds.ru ([62.112.126.90]:48077)    by f5.relay.agava.net
    with esmtp (Exim 4.71 (FreeBSD))    (envelope-from <[email protected]>)
    id 1OLoE9-0007pM-9q; Tue, 08 Jun 2010 06:07:41 +0400
Received: from [192.168.5.252] (helo=mx.rtds)    by mail.rtds.ru
    with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32)    (Exim 4.63)    (envelope-from <[email protected]>)
    id 1OLoEL-0002Mq-Uo; Tue, 08 Jun 2010 06:07:54 +0400
Received: from [192.168.5.252] (helo=puppis.rtds)    by mx.rtds
    with esmtp (Exim 4.68)    (envelope-from <[email protected]>)
    id 1OLoEL-0002Mb-KN; Tue, 08 Jun 2010 06:07:53 +0400
Received: from [192.168.5.101] (helo=dbsvr.rtds) by mx.rtds
    with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32)    (Exim 4.68) (envelope-from <[email protected]>)
    id 1OLoEK-0002MJ-5w    for [email protected]; Tue, 08 Jun 2010 06:07:52 +0400
Received: from firebird by dbsvr.rtds
    with local (Exim 4.63) (envelope-from <[email protected]>)
    id 1OLoEK-0002Pr-1u; Tue, 08 Jun 2010 06:07:52 +0400
Subject: List of existents parts;RTDS
 VOLVO;VOLVO;Obrucheva,52,tel:718-6677;1;08/06/2010
To: [email protected], [email protected]
X-Mailer: mail (GNU Mailutils 1.1)
Message-Id: <[email protected]>
Date: Tue, 08 Jun 2010 06:07:52 +0400
From: active volvo list <[email protected]>
X-BeenThere: [email protected]
X-Mailman-Version: 2.1.9
Precedence: list
Reply-To: [email protected]
List-Id: active volvo list <volvoslist.rtds.ru>
List-Unsubscribe: <https://mailman.rtds/cgi-bin/listinfo/volvoslist>,
    <mailto:[email protected]?subject=unsubscribe>
List-Archive: <https://mailman.rtds/cgi-bin/private/volvoslist>
List-Post: <mailto:[email protected]>
List-Help: <mailto:[email protected]?subject=help>
List-Subscribe: <https://mailman.rtds/cgi-bin/listinfo/volvoslist>,
    <mailto:[email protected]?subject=subscribe>
Sender: [email protected]
Errors-To: [email protected]
Return-Path: [email protected]
MIME-Version: 1.0

1161056;0.9;1784.16
1161059;16.1;1987.12
1161075;0.8;620.68
1161347;1;737.5
1161397;1;1821.92
1161409;4;5815.04
1161436;15.4;903.88
1161521;19.7;719.8
1161540;393;1171.74
1161620;0.2;931.02
1161621;15.15;2803.68
1161627;6;1163.48
1161631;40;2624.32


При этом все, что идет после строки "MIME-Version: 1.0" - это тело письма. Стандартные программы (Outlook и т. д.) каким то образом корректно это дело отображают и понимают. Mime::Parser же выдает следующее:

Код

my $entity = $parser->parse_data($p_stdin);
...
...
return $entity->parts


Вернет 0. То есть он считает, что кроме заголовка у этого письма и нет ничего.

Заголовок письма - subject, from, - все корректно. Но тело письма не видит в упор. 


Можно ли заставить MIME::Parser корректно работать с таким письмом?

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

Автор: arto 1.7.2010, 17:37
почему вы считаете, что там есть mime-инкапсуляция?

Автор: antananarivu 1.7.2010, 23:08
Я не очень понимаю, что такое майм инкапсуляция.

Есть письмо которое сохранено в Postges. Это письмо корректно воспринимается Outlook. Как и тысяча других писем, приходящих на почту. И тайм парсер корректно обрабатывает уйму писем. А вот в данном случае почему то считает что тела у письма нет. Хотя по стандарту вроде как достаточно того чтобы тело было отделено от заголовка пустой строкой. А оно в данном случае отделено.  

Автор: arto 1.7.2010, 23:13
тело отделено.
майма нет.
парсер честно отвечает, что ничего не нашел.
чего вы ожидаете?

Автор: antananarivu 2.7.2010, 08:28
arto, 

можете нормально объяснить?
согласно стандарту тело письма должно быть отделено от заголовка пустой строкой.
мне надо распарсить письмо. 
есть стандартный MIME::parser. есть письмо от поставщика. заставить парсер работать с таким типом писем невозможно?
писать обработчик вручную?

P.S. MIME-Version: 1.0 - значит майм есть, разве не так?

Автор: Jimy 4.7.2010, 10:34
как я понял этот модуль тело письма сохраняет в отдельный (типа, временный?) файл путь к которому хранится в $entity->{'ME_Bodyhandle'}->{'MB_Path'}
получить тело соответственно можно так:
Код

my $parser = new MIME::Parser;
$entity = $parser->parse_data($p_stdin);
open (MAILBODY, "<$entity->{'ME_Bodyhandle'}->{'MB_Path'}");
print <MAILBODY>;
close MAILBODY;


Автор: arto 6.7.2010, 15:19
у вас в письме нет content-type, чтобы определить, что у вас там.

Автор: antananarivu 6.7.2010, 18:02
Цитата(arto @ 6.7.2010,  15:19)
у вас в письме нет content-type, чтобы определить, что у вас там.

а как мне тогда обработать такое сообщение? добраться до тела? ручками? 
я в принципе так и сделал. загнал все письмо в переменную и сплитом отрезал все по пустой строке.
просто мне хотелось сделать это с помощью стандартного парсера. 
насколько я понимаю с помощью него никак?

Автор: arto 6.7.2010, 18:10
попробуйте добавить в заголовки правильный content-type, если вам обязательно нужен mime-parser.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)