簡體   English   中英

Perl使用MIME :: Parser解析電子郵件正文,不包含任何部分

[英]Perl parsing email body without parts using MIME::Parser

我有一個使用MIME :: Email解析來自stdin的電子郵件的perl腳本,但不適用於沒有任何部分的電子郵件。 我無法在發送之前修改電子郵件。

我希望能夠識別電子郵件的重要部分,而不管它是HTML還是文本,並將其存儲在緩沖區中以便以后處理。 這些電子郵件中有許多是通過郵件列表自動生成的。

有時它們似乎只有一個“ Content-Type:”標頭,沒有邊界。

MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit

其他時候,它們具有多個文本/純文本部分,其中一個是電子郵件的正文,另一個是簽名。

此后還有其他幾行標題行,但隨后僅顯示了正文而沒有任何邊界標記。

這是我兩年前的文章,展示了我最終如何弄清如何將大部分電子郵件與零件一起解析使用Email :: MIME和多部分/與子部分混合來解析電子郵件

use strict;
use MIME::Parser;
use MIME::Entity;
use Email::MIME;
use Email::Simple;
my $parser = MIME::Parser->new;
$parser->extract_uuencode(1);
$parser->extract_nested_messages(1);
$parser->output_to_core(1);
my $buf;
while(<STDIN> ){
        $buf .= $_; 
}

my $entity = $parser->parse_data($buf);

$entity->dump_skeleton;
my $num_parts = $entity->parts;
for (my $i=0; $i < $num_parts; $i++) {
    my $part = $entity->parts($i);
    my $content_type = $part->mime_type;
    my $body = $part->as_string;

    print "body: $body\n";
}

正文永遠不會打印。 dump_skeleton中只有以下內容:

Content-type: text/plain
Effective-type: text/plain
Body-file: NONE
Subject: Security update 

我真的很希望能夠修改現有腳本(如上一則stackexchange文章中所示),以便能夠無限制地打印此類電子郵件。

格式不正確嗎? 我一直無法找到可用於僅可靠地打印電子郵件的正文,主題和其他基本標題的庫的任何示例,而沒有復雜的步驟來按部分分析整個消息。

我知道mimeexplode可以做到,但是我不知道怎么做。 我需要將郵件正文存儲在緩沖區中以進行操作,因此無論如何使用像mimeexplode這樣的命令行程序都是一種回旋方式。

對於我來說,您要實現的目標尚不完全清楚,因為您僅發布代碼,但沒有足夠詳細的意圖。 但是您正在使用parts來檢查消息,該消息已明確記錄為返回multipart/*或類似部件(即message/rfc822 )的部分,並且不處理單個消息:

...返回所有子部分的數組,如果不存在則返回空數組(例如,如果這是單個部分消息或簡並的多部分) 在標量環境中,這將返回零件數。

如果只想獲取包括獨立“部件”在內的所有部件(即,不屬於任何部件的單個實體),請使用parts_DFS如以下示例所示,該示例為具有非零主體的所有實體打印主體:

use MIME::Parser;
my $parser = MIME::Parser->new;
my $entity = $parser->parse(\*STDIN);
for my $part ($entity->parts_DFS) {
    defined(my $body = $part->bodyhandle) or next; # has no body, likely multipart or similar
    print "body: ".$body->as_string."\n";
}

編輯:給定您已更新的問題,您不是要查找所有部分,而是要查找正文部分。 確定實際的主要部分並不容易,但是您可以嘗試使用內聯的第一個text/*部分。 這可能看起來像這樣:

use MIME::Parser;
my $parser = MIME::Parser->new;
my $entity = $parser->parse(\*STDIN);
for my $part ($entity->parts_DFS) {
    defined(my $body = $part->bodyhandle) or next; # has no body, likely multipart or similar
    if (my $disp = $part->head->get('content-disposition')) {
        next if $disp !~ m{inline}i;
    }
    print "body: ".$body->as_string."\n";
    last;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM