Email :: MIME无法解析来自Gmail的邮件

时间:2013-05-21 01:07:41

标签: perl email imap

所以我使用PERL和Email :: MIME从gmail收到一封电子邮件。这是我的代码:

use Net::IMAP::Simple::Gmail;
use Email::Mime;


# Creat the object that will read the emails
$server = 'imap.gmail.com';
$imap = Net::IMAP::Simple::Gmail->new($server);


# User and password
$user = 'username@gmail.com';
$password = 'passowrd';

$imap->login($user => $password);

# Select the INBOX and returns the number of messages
$numberOfMessages = $imap->select('INBOX');

# Now let's go through the messages from the top

for ($i = 1; $i <= $numberOfMessages; $i++)
{
        $top = $imap->top($i);
    print "top = $top\n";

    $email = Email::MIME->new( join '', @{ $imap->top($i) } );
    $body = $email->body_str;
    print "Body = $body\n";
}#end for i

当我运行它时,我收到以下错误:

can't get body as a string for multipart/related; boundary="----=_Part_6796768_17893472.1369009276778"; type="text/html" at /Library/Perl/5.8.8/Email/Mime.pm line 341
Email::MIME::body_str('Email::MIME=HASH(0x87afb4)') called at readPhoneEmailFeed.pl line 37

如果我更换

$body = $email->body_str;

$body = $email->body;

我得到了输出:

Body = 

(即空字符串)

这里发生了什么?有没有办法让我得到消息的原始主体( - &gt; body_raw也不起作用)?我可以使用正则表达式解析身体

1 个答案:

答案 0 :(得分:0)

Email :: MIME不是我见过的最好的文档包。

body和body_str方法仅适用于单个mime部分。大多数情况下,这将是一个简单的短信。对于任何更复杂的东西,使用parts方法来获取每个mime组件,它本身就是一个Email :: MIME对象。 body和body_str方法应该对此有用。 HTML格式的消息通常有两个MIME部分:text / plain和text / html。

这不完全是你想要的,但应该足以告诉你发生了什么。

my @parts = $email->parts;
for my $part (@parts) {
print "type: ", $part->content_type, "\n";
print "body: ", $part->body, "\n";
}