TOP

本文を表示しよう

本文の表示4

 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: 			if($charset=~m/iso-2022-jp/i){$resp = Jcode->new($resp, "jis")->sjis;}
47: 			if($charset=~m/utf-8/i){$resp = Jcode->new($resp, "utf8")->sjis;}
			〜省略〜
48: 		}
49: 
50: 		#---boundary文字列発見時-----
51: 		if($resp =~m/$Boundary/){
			〜省略〜
52: 		}
53: 
54: 		#---領域ヘッダー処理-----			#charset,filename,Encodingの取得。終わったら[Stage]をbbodyに変更
55: 		if($Stage eq "bhead"){
			〜省略〜
56: 				if ($filename=~m/ISO-2022-JP?B?/i){$filename = jcode($filename)->mime_decode->sjis;}
57: 				$Linkname = $filename;
58: 				$Linkname =~ s/(\W)/'%' . unpack('H2', $1)/eg;
59: 				$Linkname =~ s/ /%20/g;
60: 				$Linkname =~ s/%2e/./g;
61: 				print "<A href=\"./tmp/$Linkname\">$filename</A><BR>\n";	#ファイルへのリンク追加
			〜省略〜
62: 		}
63: 
64: 		#---領域内データ処理-----
65: 		if($Stage eq "bbody"){
66: 			if($filename eq ""){
67: 				if($charset=~m/iso-2022-jp/i){$resp = jcode($resp)->mime_decode->sjis;}
68: 				if($charset =~m/utf-8/i){$resp = Jcode->new( $resp, "utf8")->sjis;}
69: 				print "$resp\n";	#データが添付でない場合、そのまま画面に表示
70: 				}
71: 
72: 			if($filename ne ""){	#データが添付ファイルの場合、『./tmp/$filename』に書き込む
73: 				if($Encoding =~m/base64/i){$resp = bodydecode($resp,b64);}
74: 				if($Encoding =~m/quoted\-printable/i){$resp= bodydecode($resp,qp);}
75: 				open(FILE,">>./tmp/$filename");
76: 				print FILE $resp;
77: 				close (FILE);
78: 			}
79: 			next;
80: 		}
81: 
82: 	}
83: 	print "</PRE>\n";
84: 	close (SOCKET);		#ソケット接続の終了
85: }
86:
87: #----------------------------------------------
88: #ヘッダー処理(ヘッダー名を変数名とし、値を代入)
89: #----------------------------------------------
90: sub HeaderList{
		〜省略〜
91: }
92:
93: #----------------------------------------------
94: #接続
95: #----------------------------------------------
96: sub ConnectPop{
		〜省略〜
97: }
98:
99:  #----------------------------------------------
100:  #ヘッダー処理(ヘッダー名を変数名とし、値を代入)
101: #----------------------------------------------
102: sub MailHeader{
		〜省略〜
103: }
メモ:
46〜47行目で本文(非マルチパート)のエンコード。「jis」「utf-8」が標準ですので、とりあえずこの二つの対応を追加。
67〜68行目で本文(マルチパート)のエンコード。
73〜74行目で添付ファイルのエンコード。標準的に「base64」「quoted-printable」のどちらかでしょう。
56〜61行目で添付ファイルへのリンク作成。URIへのエスケープ処理です。

また、前回説明しませんでしたが、添付ファイルと判断する材料として変数「filename」のみを使用しました。
その他の変数は本プログラムではあえて無視しました。

基本的なデコードは、これでいったん終了とします。


<前へ  9  次へ>