2

我正在尝试使用输出电子邮件正文的 Net::IMAP::Client 编写脚本,但到目前为止,我尝试从模块输出的每个变量都显示为:ARRAY(0x86f5524) 或给出错误“不能使用未定义的值作为 SCALAR 引用。”

模块文档说

# fetch full messages
my @msgs = $imap->get_rfc822_body([ @msg_ids ]);
print $$_ for (@msgs)

应该包含对标量的引用。@msg_id 应该是收件箱中电子邮件号码的数字数组,但也作为数组引用返回。

我不确定如何正确输出这些数据以使其可读。这是模块参考:Net::IMAP::Client

这是我的代码片段:

use Net::IMAP::Client;
use Net::IMAP;
use Net::SMTP;
use strict;
use warnings;

my $imap = Net::IMAP::Client->new(
server => ,
user   => ,   # i omitted this data for privacy
pass   => ,
ssl    => ,
port   =>  ,
) or die "could not connect to IMAP server";

$imap->login or die('Login Failed: ' . $imap->last_error);

my $num_messages = $imap->select('[Gmail]/All Mail');

my @msg_id = $imap->search('ALL');
print @msg_id;
print "\n";

my @data = $imap->get_rfc822_body([@msg_id]);
print $$_ for (@data);

编辑:我使用 Data::Dumper 并获得了包含电子邮件和所有格式标签的一大块测试。我也知道 $imap-search 应该返回一些东西,因为收件箱有 4 封电子邮件,2 封未读。但是,由于变量@data 保存了电子邮件,我无法找出在输出中取消引用它的正确方法

4

2 回答 2

5

$imap->search('ALL')返回数组引用而不是数组。所以你需要改变

my @msg_id = $imap->search('ALL');

my @msg_id = @{$imap->search('ALL')};

最好在取消引用之前检查方法是否返回定义的值,以防万一失败。

于 2012-08-09T19:31:37.527 回答
2

查看代码,正确的用法是:

my $msgs = $imap->get_rfc822_body([ @msg_ids ]);
print $$_ for @$msgs;

获取记录在案的行为,

return $wants_many ? \@ret : $ret[0];

应该

return $wants_many ? (wantarray ? @ret : \@ret) : $ret[0];
于 2012-08-09T19:30:17.107 回答