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 を使用し、電子メールとすべての書式タグを含むテストの大きなブロックを取得しました。また、受信トレイには 4 件のメールと 2 件の未読メールがあるため、 $imap-search が何かを返す必要があることも知っています。しかし、変数 @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 に答える