TOP

本文を表示しよう

本文の表示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後の改行以降)

※ここまでの処理でデコードは一切行っていません。


<前へ  8  次へ>