| 前へ << モジュールをインストールしよう | 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 からいきましょう。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 オプション (: が書いてあるもの) は後ろに値を持っています。 そのため、というオプション指定ができ、その結果が %opts というハッシュに格納されます。
- -h ホスト名
- -u ユーザ名
- -p パスワード
- -a APOP を使う
-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 のサイズが入っています。ここでリファレンスとは何かを説明することはできません。 本を読んで理解して下さい。
| 前へ << モジュールをインストールしよう | UDP を使ってみよう (1) >> 次へ |
$Id: module-pop3.html,v 1.3 2005/01/14 12:22:33 68user Exp $