use Net::IMAP::Client;
my $imap = Net::IMAP::Client->new(
server => 'imap.gmail.com',
user => "gmailuser",
pass => "gmailpass",
ssl => 1, # (use SSL? default no)
#ssl_verify_peer => 1, # (use ca to verify server, default yes)
#ssl_ca_file => '/etc/ssl/certs/certa.pm', # (CA file used for verify server) or
#ssl_ca_path => '/etc/ssl/certs/', # (CA path used for SSL)
port => 993 # (but defaults are sane)
) or die "Could not connect to IMAP server";
# everything's useless if you can't login
$imap->login or
die('Login failed: ' . $imap->last_error);
# get list of folders
my @folders = $imap->folders;
$imap->logout;
SSLに関する設定はよくわかってなくて、よくわからないところをコメントアウトしても動いたので、それでいっております。
これはこのままやればできるんだけど、日本語のフォルダ名(ラベル名)の扱いに難儀する。IMAP UTF-7という文字コードを使っている。これを扱うためには、おなじみの「 use Encode」だけではダメで、「Encode::IMAPUTF7」というのもつかなわないとダメ。CPANでインストールしてください。
my @folders = $imap->folders;
use Encode 'decode', 'encode';
use Encode::IMAPUTF7;
binmode *STDOUT, ':utf8';
for(@folders){
print decode('IMAP-UTF-7', $_) ,"¥n";
}
こんな風にです。同様の目的のモジュールで「Unicode::IMAPUtf7」というのがありますが、こちらはうまくうごきません。
それから、添付ファイルを保存する場合はこんな感じです。
# 何とかして、添付ファイルのあるメールを指定して下さい
my $mail_list = $imap->search( 'ALL');
my $msg_id = $mail_list->[0];
#そのメールのなかから添付ファイルの情報を抜き出してください
my $sum = $imap->get_summaries([ $msg_id ]);
my $part_id = $sum->[0]{parts}[1]{'part_id'};
my $filename = $sum->[0]{parts}[1]{'disposition'}{attachment}{filename};
use MIME::Base64 'decode_base64';
my $data = $imap->get_part_body($msg_id, $part_id);
open my $fh, '>', $filename or die $!;
binmode($fh); #バイナリで書き込み
print $fh decode_base64($$data); #$dataはスカラーのリファレンス
close $fh;
ここでは、Base64でエンコードされている添付ファイルを「MIME::Base64」というモジュールを使って処理しています。
$imap->get_part_body($msg_id, $part_id)で返ってくるデータがスカラーのリファレンスなので、 $$data とやらないと実体データを参照できないので注意してください。
それから、バイナリでファイルに書き込んでいくために「 binmode($fh) 」としていますが、これは自分でもこれをかかないとダメなのかどうかイマイチわかっておりません。