【发布时间】:2017-01-17 10:57:35
【问题描述】:
我对 perl 很陌生,所以也许我做了一些愚蠢的事情。 我的问题是我目前正在使用脚本通过 IMAP 协议获取电子邮件箱中包含的所有消息,在 PERL 中使用 Net::IMAP::Simple,但它没有给我整个消息正文。 我的整个代码如下所示:
use strict;
use Net::IMAP::Simple;
my $imap = Net::IMAP::Simple->new('xxxxxxxxxxxxxx') or die 'Impossible to connect '.$!;
$imap->login('xxxxxxxx', 'xxxxxxxxx') or die 'Login Error!';
my $nbmsg = $imap->select('INBOX') or die 'Impossible to reach this folder !';
print 'You have '.$nbmsg." messages in this folder !\n\n";
my $index = $imap->list() or die 'Impossible to list these messages !';
foreach my $msgnum (keys %$index) {
#if(!$imap->seen($msgnum)) {
my $msg = $imap->get($msgnum) or die 'Impossible to retrieve this message'.$msgnum.' !';
print $msg."\n\n";
# }
}
$imap->quit() or die 'quitting issue !';
每次检索电子邮件时,它都会给我第一个字符(在我的情况下,这是发送消息的机器人生成的神秘无用元数据),而不是整个正文。
编辑:这是输出中显示的正文部分:
内容类型:文本/纯文本;字符集="utf-8" 内容传输编码:BASE64
Q2UgbWVzc2FnZSBhIMOpdMOpIGfDqW7DqXLDqSBhdXRvbWF0aXF1ZW1lbnQgcGFyIGwnaW1wcmlt YW50ZSBtdWx0aWZvbmN0aW9ucyBYZXJveCBYRVJPWF83ODMwLgogICBFbXBsYWNlbWVudCBkdSBz eXN0w6htZSA6IAogICBBZHJlc3NlIElQIHN5c3TDqG1lIDogMTkyLjE2OC4xLjIwMAogICBBZHJl c3NlIE1BQyBzeXN0w6htZSA6IDlDOjkzOjRFOjMzOjM1OkJECiAgIE1vZMOobGUgc3lzdMOobWUg OiBYZXJveCBXb3JrQ2VudHJlIDc4MzAKICAgTnVtw6lybyBkZSBzw6lyaWUgc3lzdMOobWUgOiAz OTEyNzk4ODk0CgpMJ0Fzc2lzdGFudCBkZSBjb21wdGV1ciBhIGVudm95w6kgbGUgcmVsZXbDqSBz dWl2YW50IGF1IHNlcnZldXIgZGUgY29tbXVuaWNhdGlvbiBYZXJveCBTTWFydCBlU29sdXRpb25z IGxlICAxNC8xMS8xNiAgIDA5OjI0OiAKICBUaXJhZ2VzIGVuIG5vaXIgOiAxMzIwNwogIFRpcmFn ZXMgZW4gY291bGV1ciA6IDkyNjg3CiAgVG91cyBsZXMgdGlyYWdlcyA6IDEwNTg5NA==
它总是以这个“==”结尾,这让我觉得模块正在缩短输出。
我在 CPAN 文档中查看了一些关于它的细节,但遗憾的是没有找到任何东西。
【问题讨论】:
-
请edit 并包含该输出。我相信它实际上不是消息的一部分,而是
$imap->get返回的消息对象的ref。这些对象确实具有将它们转换为文本的字符串重载,但您没有使用它。您必须执行print "$msg"才能将其强制转换为字符串。 -
我已经做到了。但这并没有改变什么。我正在编辑以添加输出。
-
查看文档我认为您不需要获取
list(),您也可以基本上在循环中从1迭代到$nbmsg。该数字不是ID或任何东西,它只是一个索引。所以foreach my $msgnum ( 1 .. $nbmsg ) { ... }会起作用。这也将直接对它们进行排序。您现在所拥有的以随机顺序返回%$index的键,因为 Perl 中的哈希未排序,并且实现细节使顺序随机。不要依赖输出的顺序,在不同的机器上会有所不同。 -
已编辑,感谢您的帮助。 :)
-
FWIW,一个有效的 base64 块的长度是 4x 个字符,不包括空格和一些其他字符,并且用 = 字符填充以使其成为真的。在这种情况下,原始内容是 3a+1 字节,编码为 4b+2,所以最后必须有两个填充字节。