モジュールを使って POP3 クライアントを作ってみよう

前へ << モジュールをインストールしよう UDP を使ってみよう (1) >> 次へ

モジュールのチェック

Net::POP3 モジュールと、Mail::POP3Client モジュールを 使って POP3 クライアントを作ってみましょう。 前項でインストール方法は説明しましたが、
% perl -e 'use Net::POP3;'
で何も表示されなければ OK です。ホームディレクトリ以下に インストールしている場合は、
% perl -e 'use lib '/home/username/p5-module/'; use Net::POP3;'
とします。もし
Can't locate Net/POP3.pm in @INC (@INC contains: /usr/local/lib/perl5/5.00503/i386-freebsd
  /usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/site_perl/5.005/i386-freebsd
  /usr/local/lib/perl5/site_perl/5.005 .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
となってしまったら、perl が Net/POP3.pm を捜し出せない ということです。目的のディレクトリに本当にインストールできたか どうかをチェックして下さい。

Net::POP3

まずは Net::POP3 からいきましょう。

pop3-client-Net::POP3.pl

    1: #!/usr/local/bin/perl
    2: 
    3: # $Id: pop3-client-Net::POP3.pl,v 1.2 2007/07/20 10:59:14 68user Exp $
    4: 
    5: use Net::POP3;                       # Net::POP3 モジュールを使う
    6: 
    7: use Getopt::Std;                     # オプション解析用
    8: 
    9: getopts('au:h:p:',\%opts);
   10: 
   11: $hostname = $opts{'h'} || 'pop3.foo.bar.com';
   12: $username = $opts{'u'} || 'username';
   13: $password = $opts{'p'} || 'password';
   14: $use_apop = $opts{'a'} || 0;
   15: 
   16: $pop = Net::POP3->new($hostname);    # 接続
   17: 
   18: if ( ! $pop ){
   19:     die "接続失敗: $!";
   20: }
   21: 
   22: if ( $use_apop ){
   23:                                      # APOP コマンド送信
   24:     $auth_check = $pop->apop($username,$password);
   25: } else {
   26:                                      # USER・PASS コマンド送信
   27:     $pop->user($username);
   28:     $auth_check = $pop->pass($password);
   29: }
   30: 
   31: if ( ! defined $auth_check ){
   32:     die "認証失敗: ";
   33: }
   34: 
   35: 
   36: $ref_mailsize = $pop->list();        # メール一覧のハッシュのリファレンスを得る
   37:                                      # メールサイズ表示
   38: foreach ( sort {$a<=>$b} keys %{$ref_mailsize} ){
   39:     print "Mail NO.$_ $$ref_mailsize{$_}bytes\n";
   40: }
   41: 
   42: *mailindex = $ref_mailsize;          # $ref_mailsize の 別名を作る
   43: 
   44: foreach ( sort {$a<=>$b } keys %mailindex ){
   45:     print "\nMail No.$_ $mailindex{$_}bytes\n";
   46: 
   47:     $ref_lines = $pop->get($_);      # メール本文を取得
   48: 
   49:     $line = 1;
   50:     foreach ( @$ref_lines ){         # 1行ずつ表示
   51:         s/^\.\././;                  # 行頭の .. を . に変換
   52:         print "$line: $_";
   53:         $line++;
   54:     }
   55: }
   56: 
   57: $pop->quit();                        # ログアウト
まず、Net::POP3 モジュールを使うことを宣言します。
    5: use Net::POP3;                       # Net::POP3 モジュールを使う
もし個人のホームディレクトリの下 (例えば ~/p5-module/) に モジュールをインストールした場合は、この前に
use lib '/home/username/p5-module'
と書かなくてはいけません。


まずはオプション解析です。

    7: use Getopt::Std;                     # オプション解析用
    8: 
    9: getopts('au:h:p:',\%opts);
   10: 
   11: $hostname = $opts{'h'} || 'pop3.foo.bar.com';
   12: $username = $opts{'u'} || 'username';
   13: $password = $opts{'p'} || 'password';
   14: $use_apop = $opts{'a'} || 0;
Getopt::Std モジュールを使って、getopts 関数で 引数を解析しています。
    9: getopts('au:h:p:',\%opts);
は、a、u、h、p オプションを受け取り、そのうち u、h、p オプション (: が書いてあるもの) は後ろに値を持っています。 そのため、
  • -h ホスト名
  • -u ユーザ名
  • -p パスワード
  • -a APOP を使う
というオプション指定ができ、その結果が %opts というハッシュに格納されます。
-h pop3.hostname.com -u myusername -p secret -a
というオプションを与えたら、
  • $opts{'h'} eq 'pop3.hostname.com'
  • $opts{'u'} eq 'myusername'
  • $opts{'p'} eq 'secret'
  • $opts{'a'} eq '1'
となります。
getopts 関数の他に getopt 関数というものもあります (これも Getopt モジュールに含まれています)。 getopt の方は引数を一つしか解析してくれません。getopts のつもりで getopt と書いてしまうのは非常にありがちです。だって、モジュール名は Getopts::Std じゃなくて Getopt::Std だから。これで何度はまったことか。


接続とユーザ認証です。

   16: $pop = Net::POP3->new($hostname);    # 接続
   17: 
   18: if ( ! $pop ){
   19:     die "接続失敗: $!";
   20: }
   21: 
   22: if ( $use_apop ){
   23:                                      # APOP コマンド送信
   24:     $auth_check = $pop->apop($username,$password);
   25: } else {
   26:                                      # USER・PASS コマンド送信
   27:     $pop->user($username);
   28:     $auth_check = $pop->pass($password);
   29: }
   30: 
   31: if ( ! defined $auth_check ){
   32:     die "認証失敗: ";
   33: }
面倒なことは全て Net::POP3 モジュールがやってくれます。 Net::POP3->new() で新しいオブジェクトを作り、 $pop に代入。 その後は $pop->関数名 として各種関数を使います。

$use_apop が 1 なら、$pop->apop() を使い、 そうでなければ $pop->user()$pop->pass() を使います。戻り値が undef なら認証に失敗したということです。


   36: $ref_mailsize = $pop->list();        # メール一覧のハッシュのリファレンスを得る
   37:                                      # メールサイズ表示
   38: foreach ( sort {$a<=>$b} keys %{$ref_mailsize} ){
   39:     print "Mail NO.$_ $$ref_mailsize{$_}bytes\n";
   40: }
   41: 
$pop->list() でメールがいくつあるか、 各メールのサイズがわかります。list() が返すのは 「ハッシュへのリファレンス」です。 $ref_mailsize にはハッシュへのリファレンスが代入されますので、 それをデリファレンスした %{$ref_mailsize} が ハッシュになります。 key にはメール番号 (1からの連番)、value にはメール番号のサイズが入っています。 つまり、$$ref_mailsize{'1'} には メール番号 1 のサイズが入っています。
ここでリファレンスとは何かを説明することはできません。 本を読んで理解して下さい。

Mail::POP3Client

前へ << モジュールをインストールしよう UDP を使ってみよう (1) >> 次へ

ご意見・ご指摘は Twitter: @68user までお願いします。