CALENDAR
S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930    
<< April 2019 >>
ARCHIVES
CATEGORIES
RECOMMEND
RECOMMEND
RECOMMEND
WiiRemoteプログラミング
WiiRemoteプログラミング (JUGEMレビュー »)
白井 暁彦,小坂 崇之,くるくる研究室,木村 秀敬
RECOMMEND
RECOMMEND
RECOMMEND
MOBILE
qrcode
<< ひとまず、ここまで。。。(※メモ書きとして) | main | 結局はHTMLなのね(メモ書きとして。。) >>
なんとなく 動く。。(※メモ書きとして)
 なんとなく 動くようになりました。

ただ、これは叩き台ですね。エラー処理も、XSSもなにも考えていない。。。
きちんと使うためには、もう少し手を入れなければ、たとえそれが個人用のものでも不安です。

機能的な面としては、
まず、今のようにテーブルの中のリンクでは、iphone に直接読み込めない。これはこれで置いておいて、最新のカレンダーが常に特定の場所にあるようにしなければならないらしいです。
さらに、UIDを乱数なんかで作ってしまったからには、二度読み込むと、すべて違うデータと解釈され、予定が二重になってしまう。。。これはどうしましょうか。。

★(5月29日加筆)実はデータがiCalで二重になってしまうのは、UIDのせいではなかった。もう少し調査の必要がありますね。うーん、よくわからない(笑)。。。


セキュリティの面は、全体にXSS対策、それに、データにHTMLのタグをエスケープさせる。

あとは、安定性の問題で、エラー処理をきちんとしていく。

そこまで根気が続くかどうか、、、今度は人間の側の問題かもしれません。。(笑)

※iCalヘッダの読み込みから、テーブルの終りまで。修正。。。

//iCalヘッダの読み込み
$caldata1 = "";
$caldata2 = "";
require_once("caldata1.php");
require_once("caldata2.php");


//一つ一つのメッセージに対する処理ループ
 for($i =1 ; $i<=$no ; $i++)
        {
        echo "<tr>";
        
        echo "<th>".$i,"</th>";
        
        //空行をみつけてヘッダと本文を分ける
         list( $head[$i], $body[$i]) = split("¥r¥n¥r¥n", $mssg[$i], 2);
         $head[$i] = ereg_replace("¥r¥n[¥t ]+", " ", $head[$i]);

         //日付の抽出。変数$dateは配列。22文字分だけにする。
         //なお、$date[1]だけ使っている。
         eregI("Date:[ ¥t]*([^¥r¥n]+)", $head[$i], $date);
         $maildate[$i] = Substr($date[1], 0, 22);
         echo "<th>".$maildate[$i]."</th>";
        
         //タイトルを取り出す。変数$mailsub[$i]
         eregI("¥nSubject:[ ¥t]*([^¥r¥n]+)", $head[$i], $subj);
         $mailsub[$i] = $subj[1];
         //とりあえず、Base64デコード。さらにmb_convert_encoding()で日本語に。
        eregI("(.*)=¥?iso-2022-jp¥?B¥?([^¥?]+)¥?=(.*)", $mailsub[$i], $sub);
        $mailsub[$i] = $sub[1].Base64_Decode($sub[2]).$sub[3];
        $mailsub[$i] = mb_convert_encoding($mailsub[$i],"SJIS","JIS");
        echo "<th>".$mailsub[$i]."</th>";
        
        //送信元を取り出す。ここではFrom:を使う。変数$mailsender[$i]
        eregI("From:[ ¥t]*([^¥r¥n]+)", $head[$i], $sender);
        //メールアドレスであるか確認
        eregI("[-!#$%&¥'*+¥¥./0-9A-Z^_`a-z{|}~]+@[-!#$%&¥'*+¥¥/0-9=?A-Z^_`a-z{|}~]+¥.[-!#$%&¥'*+¥¥./0-9=?A-Z^_`a-z{|}~]+", $sender[1], $sender2);
        $mailsender[$i] = $sender2[0];
        echo "<th>".$mailsender[$i]."</th>";

        //本文データと、添付ファイルデータを取り出す。
        //本文はJISからSJIS変換。添付ファイルはBase64デコード、その後mb_convert_encoding()で日本語に。
        if (EregI("¥nContent-type:.*multipart/", $head[$i]))
            {
            EregI('boundary="([^"]+)"', $head[$i], $bound);
            $part = Split("¥r¥n--".$bound[1], $body[$i]);
            $hon = Split("Content-Transfer-Encoding: 7bit", $part[1]);
            $honbun[$i] = mb_convert_encoding($hon[1],"SJIS","JIS");
            
            //本文データ
            echo "<th>".$honbun[$i]."</th>";
            EregI('filename="([^"]+)"', $part[2], $file);
            $filename = $file[1];
            
            //添付ファイル名
            echo "<th>".$filename."</th>";
            $att = Split("filename="."¥".*¥"", $part[2]);
            $attch[$i] = Base64_Decode($att[1]);
            
            
            echo "<th>";
            //ここから添付ファイルデータを解析 $attch[$i]の中身を見る。
            //まず1行ずつ切り分け、配列に入れる。$data[0]は項目行。
            $data = explode  ( "¥r¥n" , $attch[$i] );
            
            $caldata = "";
            
            //個々の日付データ、切り分けた1行ごとの処理 1行目からm行目まで。
            for( $m=1; $m<=count($data); $m++)
                    {
                    $item = explode  ( "," , $data[$m] );
                    
                    //$item[0]開始日  $item[1]開始時間  $item[2]終了日  $item[3]終了時間
                    //$item[4]項目内容  $item[5]場所  $item[6]分類
                    //csvをicsデータに変換する。
                    
                    $uid = rand();
                    
                    $dtstart = str_replace("/", "", $item[0]) . "T" . str_replace(":", "", $item[1]) . "00";
                    $dtend   = str_replace("/", "", $item[2]) . "T" . str_replace(":", "", $item[3]) . "00";
                    
                    $caldata .="¥r¥n";
                    $caldata .="BEGIN:VEVENT"."¥r¥n"."UID:".$uid."¥r¥n";
                    $caldata.="DTEND;TZID=Japan:".$dtend."¥r¥n";
                    $caldata .="SUMMARY:".$item[4]."¥r¥n";
                    $caldata .="DTSTART;TZID=Japan:".$dtstart."¥r¥n";
                    $caldata .="END:VEVENT"."¥r¥n";
                    }
            //個々の日付データの処理ここまで
            
            //実際にカレンダーデータを持ったファイルを作り出し、それにリンクを張る。
            $caldata = $caldata1. $caldata . $caldata2;
            $fname = rtrim( $filename, ".csv").".ics";
            touch($fname);
            $caldata = mb_convert_encoding($caldata , 'utf8', 'sjis-win');
            file_put_contents( $fname , $caldata);
            $link = "<a href=". $fname . ">" . $fname . "</a>";
            echo $link;
            
                    }
            echo "</th>";
            echo "</tr>";
            //}
            
        //添付ファイルがない場合の処理をここに記述
        //ここまで
        
        
        }
//一つ一つのメッセージに対する処理ループ ここまで
echo "</table>";
| php scripting | 11:34 | comments(0) | trackbacks(0) | pookmark |
コメント
コメントする









この記事のトラックバックURL
http://blog.h2caster.net/trackback/1068712
トラックバック