本文を表示しよう
本文の表示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」のみを使用しました。
その他の変数は本プログラムではあえて無視しました。
基本的なデコードは、これでいったん終了とします。