プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、WEBメールを作ってみる(2)受信メールの詳細を取得して画面に表示する
PHP、WEBメールを作ってみる(1)受信メールの一覧を取得して画面に表示する」で
受信メールの一覧を表示するのに成功しました。
じゃあ次は一覧から選択してメールの詳細を表示してみましょうかね。

それでは早速……の前に、なんかいろいろ重複しそうなので、
一覧取得のコードをこんな感じに変更φ(--)

■mail_list2.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
    <title>webmail</title>
</head>
<body>

<?php
    require_once dirname(__FILE__) . '/inc.php';

    //-------------------------------
    //接続&ログイン
    //-------------------------------
    require_once dirname(__FILE__) . '/mail_connect.php';

    //-------------------------------
    //受信メール件数取得
    //-------------------------------
    fputs($fp, "STAT\r\n");
    $line = fgets($fp, 512);
    print $line . "<br>";    //STAT結果表示

    //STAT結果を変数に展開
    list($status, $cnt, $size) = explode(' ', $line);

    //受信メール件数チェック
    if(intVal($cnt) == 0){
        print "受信メール無し<br><br>";
    }else{
        print "受信メールあり<br><br>";
    }

    //テスト用に件数制限入れておきます(100件を超える場合は100件まで)
    $cnt = ($cnt > 100 ? 100 : $cnt);

    //-------------------------------
    //受信メール一覧表示
    //-------------------------------
    for($i = 1; $i <= $cnt; $i++){
        //メッセージヘッダ取得
        //「TOP」が使えない環境の人は「RETR」で代用してください
        //fputs($fp, "RETR $i\r\n");
        fputs($fp, "TOP $i 0\r\n");

        do{
            $line = fgets($fp, 512);

            //件名を表示する
            if(preg_match("/^Subject/", $line)){
                $subject = mb_decode_mimeheader($line);
                $subject = preg_replace("/^Subject:/", "", $subject);
                print '<a href="mail_detail.php?no=' . $i . '" target="blank">';
                print $i . ":" . mb_convert_encoding($subject, $enc, "auto") . "<br>";
                print '</a>';
            }
        }while (!preg_match("/^\.\r\n/", $line));
    }

    //切断
    require_once dirname(__FILE__) . '/mail_disconnect.php';
?>

</body>
</html>

■inc.php
<?php
    //-------------------------------
    //パラメータ定義
    //-------------------------------
    //文字エンコード
    $enc = "UTF-8";
    //POPサーバ
    $mail_host = "mail.example.com";
    //ポート
    $mail_port = 110;
    //ユーザ
    $mail_user = "mailuser";
    //パスワード
    $mail_pwd = "mailpwd";

■mail_connect.php
<?php
    require_once dirname(__FILE__) . '/inc.php';

    //-------------------------------
    //接続&ログイン
    //-------------------------------
    //接続
    $fp = fsockopen($mail_host, $mail_port);

    //ログイン
    $line = fgets($fp, 512);
    fputs($fp, "USER $mail_user\r\n");    // USER名
    $line = fgets($fp, 512);        
    fputs($fp, "PASS $mail_pwd\r\n");    // パスワード
    $line = fgets($fp, 512);
    if(!preg_match("(OK)", $line)){    // ログイン失敗?
        fclose($fp);
        die("ログイン失敗");
    }

■mail_disconnect.php
<?php
    require_once dirname(__FILE__) . '/inc.php';

    //切断する
    fputs($fp, "QUIT\r\n");
    fclose($fp);

見た目ほど大きな変更はありません。
定数部分とメールサーバへの接続、切断処理を外出しにして、
一覧画面から詳細画面へのリンクを付けただけです。

ほんで、詳細画面の方のコードはこんな感じφ(--)

■mail_detail.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
    <title>webmail</title>
</head>
<body>

<?php
    require_once dirname(__FILE__) . '/inc.php';

    //-------------------------------
    //パラメータ取得
    //-------------------------------
    $no = $_GET['no'];
    if(empty($no) || !is_numeric($no)){
        die("なんかおかしいよ");
    }

    //-------------------------------
    //接続&ログイン
    //-------------------------------
    require_once dirname(__FILE__) . '/mail_connect.php';

    //-------------------------------
    //メール詳細を表示
    //-------------------------------
    fputs($fp, "RETR $no\r\n");
    do{
        $line = fgets($fp, 512);

        if(preg_match("/^Subject/", $line)){
            //件名を表示する
            //取りあえず件名くらいはデコードしてあげようかと。
            $subject = mb_decode_mimeheader($line);
            print mb_convert_encoding($subject, $enc, "auto") . "<br>";
        }else{
            //件名以外を表示する
            print mb_convert_encoding($line, $enc, "auto") . "<br>";
        }

    }while (!preg_match("/^\.\r\n/", $line));


    //切断
    require_once dirname(__FILE__) . '/mail_disconnect.php';
?>

</body>
</html>

こちらも特に難しいことはしていません。
メッセージ番号をパラメータで渡して「RETR」コマンドでメールを取得、
その後画面に表示しています。

エラー処理とかセキュリティ関連の対策とか何にもない必要最低限ですが、
取りあえず受信メールの詳細も表示できました。

おぉ、何だかんだで最低限のメーラーにはなった気がします(*´ェ`*)
メール送信の方はお問い合わせフォールとかと同じ理屈なので、
特に難しい部分はないですしね。

PHPでのWebメールの作成、これにて完了?\(--)/



あっ、添付ファイルのこと忘れてたΣ(´・д・`)
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事