本文を表示しよう
本文の表示3
1: #!/usr/bin/perl
2: print "Content-type:text/html\n\n";
3: print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n";
4: use Socket;
5: use Jcode;
6: require './code/mimew.pl';
7: use File::Basename qw(basename);
8: $this_Filename = basename($0, ''); #ファイル名の取得
9:
10: #---接続情報の設定-----
11: $pop_server="pop.grot3.com"; #POPサーバー名の指定(サーバ名は仮定です)
12: $account="grot3"; #POPサーバー用アカウント(仮定です)
13: $password="1234567"; #POPサーバー用パスワード(仮定です)
14:
15: #-----表示内容の分岐
16: $query=$ENV{QUERY_STRING}; #URLの引数部分の取得
17: if($query eq ""){ #引数が無い場合、ヘッダー表示(0)
18: &HeaderList(0);
19: } elsif ($query =~ m/page/i){ #引数(page)がある場合、指定ページを開く
20: @args=split(/=/ , $query);
21: &HeaderList(@args[1]);
22: } elsif ($query =~ m/mailno/i){ #引数(mailno)がある場合、メール本文を開く
23: unlink (<./tmp/*>); #[./tmp]内のファイル(前回開いたメールの添付ファイル)を全て消す
24: @args=split(/=/ , $query);
25: &MailBody(@args[1]);
26: }
27:
28: #----------------------------------------------
29: #受信メール表示--(本文)
30: #----------------------------------------------
31: sub MailBody{
32: &ConnectPop; #サブプロシージャ(ConnectPop)の呼び出し
33: $Stage="head"; #変数[Stage]の初期化
34: print SOCKET "RETR $_[0]\n"; #メール内容の表示コマンド
35: while (<SOCKET>){
36: $resp=$_;
37: if($resp eq "\.\r\n"){last;}
38: if($resp ne "\r\n"){$resp=~s/\r\n//g;} #改行を削除
39:
40: #---ヘッダー部の表示-----
41: if($Stage eq "head"){
〜省略〜
42: }
43:
44: #---マルチパートでない場合-----
45: if($Stage eq "body" and $Boundary eq ""){
46: print "$resp\n"; #そのまま表示して終了(他への遷移無し)
47: next;
48: }
49:
50: #---boundary文字列発見時-----
51: if($resp =~m/$Boundary/){
52: $Stage="bhead"; #[Stage]をbheadに変更
53: $charset="";$Encoding="";$filename=""; #変数をクリア
54: next;
55: }
56:
57: #---領域ヘッダー処理----- #charset,filename,Encodingの取得。終わったら[Stage]をbbodyに変更
58: if($Stage eq "bhead"){
59: if($resp=~m/charset=/i){@_=split(/charset=/,$resp);$charset=$_[1];$charset=~s/\r\n//g;$charset=~s/\"//g;}
60: if($resp=~m/filename=/i){
61: @_=split(/filename=/,$resp);
62: $filename=$_[1];
63: $filename=~s/\r\n//g;$filename=~s/\"//g;
64: print "<A href=\"./tmp/$filename\">$filename</A><BR>\n"; #ファイルへのリンク追加
65: }
66: if($resp=~m/Content-Transfer-Encoding:/i){@_=split(/:/,$resp);$Encoding=$_[1];$Encoding=~s/\r\n//g;$Encoding=~s/\"//g;}
67: if($resp eq "\r\n"){$Stage="bbody";next;} #領域内ヘッダーを終了し、[Stage]をbbodyに変更
68: next;
69: }
70:
71: #---領域内データ処理-----
72: if($Stage eq "bbody"){
73: if($filename eq ""){print "$resp\n";} #データが添付でない場合、そのまま画面に表示
74:
75: if($filename ne ""){ #データが添付ファイルの場合、『./tmp/$filename』に書き込む
76: open(FILE,">>./tmp/$filename");
77: print FILE $resp;
78: close (FILE);
79: }
80: next;
81: }
82:
83: }
84: print "</PRE>\n";
85: close (SOCKET); #ソケット接続の終了
86: }
87:
88: #----------------------------------------------
89: #ヘッダー処理(ヘッダー名を変数名とし、値を代入)
90: #----------------------------------------------
91: sub HeaderList{
〜省略〜
92: }
93:
94: #----------------------------------------------
95: #接続
96: #----------------------------------------------
97: sub ConnectPop{
〜省略〜
98: }
99:
100: #----------------------------------------------
101: #ヘッダー処理(ヘッダー名を変数名とし、値を代入)
102: #----------------------------------------------
103: sub MailHeader{
〜省略〜
104: }
メモ:
メールの[ヘッダー][ボディー][添付ファイル]の各部分処理中のフラグとして変数[Stage]を使用(前回でも説明済み)
[Stage]に入る変数は4種類。
メールヘッダー部…"head"
メールボディー部…"body"(ヘッダー直後の改行以降)
領域ヘッダー部…"bhead"(boundary文字列直後)
領域ボディー部…"bbody"(boundary後の改行以降)
※ここまでの処理でデコードは一切行っていません。