GmailをPerlから操作する

| | トラックバック(0)

カテゴリ:

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) 」としていますが、これは自分でもこれをかかないとダメなのかどうかイマイチわかっておりません。

トラックバック(0)

このブログ記事を参照しているブログ一覧: GmailをPerlから操作する

このブログ記事に対するトラックバックURL: https://nozawashinichi.sakura.ne.jp/MT-4.25/mt-tb.cgi/1248

comments powered by Disqus

このブログ記事について

このページは、Shinichi Nozawaが2014年11月 7日 22:17に書いたブログ記事です。

ひとつ前のブログ記事は「あとでよみたい」です。

次のブログ記事は「Perlにおいて「偽」とは何か」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。