[英]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.