WEBデザイン・開発講義WEB Design&Development Lecture

メールサーバーとPHP連携プログラミング

メールサーバーとPHP連携プログラミング

メールサーバーとPHP連携プログラミング

PHPプログラムによるメール処理※画像クリックで拡大表示(リンク)

  • メールサーバとPHPメール送受信処理の概要
    インストールしたメールサーバ「radish」の設定が、「localhost」のサーバ、ドメイン「cxm.com」であることを確認します。
    メールサーバとPHPメール送受信処理の概要
    • シンプルなメール送信
      メール送信時には、「php.ini」設定にある「SMTP」(ポート番号:25)の「localhost」へ送信し、メールサーバ側でドメインとユーザ(user1@cxm.com)をチェックして、OKのときにメールを保存します。ドメインが違うとメールを保存しません。
    • マルチパート形式のメール送信
      マルチパート形式のメール送信する場合は、シンプルなメール送信に、PEARライブラリの「mail」「main_mine」を読み込むPHPプログラムを実行すると送信できます。
    • メール受信した内容の表示
      受信したメールを表示する場合は、PHPの「IMAP」関数を利用して、メールサーバの「POP3」(ポート番号:110)を通してメールボックスにアクセスし、受信したメールを呼び出すことが可能です。「IMAP」関数には、受信メールの削除やマルチパートメールを受信処理する関数が揃っておりますので、WEBメールアプリケーションの開発が可能です。
  • マルチパート形式のメール送信PHPプログラムの作成
    マルチパートのメール送信プログラムは、PEARの「mail」と「mail_mime」を利用してプログラムを作成します。
    • PEARのMail関連ライブラリを取り込む
      include_once('Mail.php');
      include_once('Mail/mime.php');
      include_once('Mail/mail.php');
    • Mail_mimeの新規インスタンス作成
      使用する行末の種類「"¥r¥n"」を指定して、「new Mail_mime("¥r¥n")」により、"mail_mime"オブジェクトの「$mime」を作成します。
      $crlf = "¥r¥n"; //使用する行末の種類
      // Mail_mimeの新規インスタンス作成
      $mime = new Mail_mime($crlf);
    • 本文メールデータ作成:「alternative」の指定
      「テキストメール」と「HTMLメール」の両方を作成して、受信するメールアプリケーション側の設定でどちらかを表示できるようにするためのマルチパートの「alternative」の指定となります。 日本語を取り扱うため、内部コードの'UTF-8'から'JIS'へ変換する「mb_convert_encoding('本文','JIS','UTF-8')」関数を利用します。
      メールデータ作成は、「テキストメール部」作成のsetTXTBodyと「HTMLメール部」作成のsetHTMLBodyのメソッドを利用します。
      本文メッセージのメール構築は、エンコードとコードセットの連想配列を引数とした「get」メソッドを利用します。
      // テキストメールの内容のJIS化
      $text = mb_convert_encoding(
         'テキストのメール内容','JIS','UTF-8');
      // テキストメール部セット
      $mime->setTXTBody($text);
      
      // HTMLメールの内容のJIS化
      $html = mb_convert_encoding(
         '<html><body>HTMLのメール内容</body></html>',
         'JIS','UTF-8');
      // HTMLメール部セット
      $mime->setHTMLBody($html);
      
      //本文:メッセージのメールを構築する
      $body = $mime->get(
            //本文のエンコーディングとコードセット
            array(
              "text_encoding" => 'base64',
              "html_encoding" => 'base64',
              "head_charset"  => 'ISO-2022-JP',
              "text_charset"  => 'ISO-2022-JP',
              "html_charset"  => 'ISO-2022-JP'
            )
          );
    • 添付ファイルの追加セット
      addAttachment('ファイルパス','MIMEタイプ')」のメソッドを利用して、マルチパートに追加できます。
      // 添付ファイルのプレーンテキスト指定
      $mime->addAttachment($file,'text/plain');
      // 添付ファイルの画像(jpg)指定
      $mime->addAttachment($img,'image/jpg');
    • メールヘッダ作成と件名のBASE64変換
      日本語のメールヘッダ変換できる「mb_encode_mimeheader('件名','JIS','UTF-8')」関数を利用し、「headers」メソッドでメールヘッダ部のメールを構築します。
      // ヘッダー部のコンテンツ指定
      $hdrs = array(
        'From'    => 'information@cxm.com',
        // 件名の日本語エンコーディング
        'Subject' => mb_encode_mimeheader(
             'Mail_Mimeのサンプルメール','JIS','UTF-8')
      );
      //ヘッダ行のメールを構築する
      $hdrs = $mime->headers($hdrs);
    • マルチパート・メール送信:PHPのmail関数利用指定
      Mail::factory('mail')」のインスタンスの「$mail」を作成して、メール送信メソッドのsend('メールアドレス','ヘッダ配列','メール本文')を利用します。
      // 'mail'は、第5番目引数のPHPのmail関数利用指定
      $mail =& Mail::factory('mail');
      // メールアドレスにメール送信
      $mail->send('user1@cxm.com',$hdrs,$body);
    • マルチパート・メール送信PHPプログラム:「mail_php.zip」のダウンロード
  • マルチパート・メール送信PHPプログラムの配置と実行
    ダウンロードした「mail_php.zip」を解凍して、ドキュメントルート(C:¥WEBserver¥htdocs¥)に配置します。
    C:¥WEBserver¥htdocs¥
       ├ mail_php
          ├ file      ←送信する添付ファイルのフォルダ
          ├ mail_box  ←保存した添付ファイルのフォルダref_pear_mail.php 
  • 「ref_pear_mail.php」の実行
    メールサーバの「radish」を起動して、実行状態にしておきます。
    • 「ユーザ」アカウントの追加
      「設定」→「ユーザ」のタブをクリックして、ユーザ名「user01」:パスワード「user1234」とユーザ名「user2」:パスワード「user1234」の2件を追加します。「ツール」→「サーバ再起動」のタブをクリックして入力内容を有効にします。
    • ブラウザから「ref_pear_mail.php」を実行すると
      送信完了!♪」のメッセージが表示されて、メール送信が完了しますので、メールサーバの「MAILBOX」に保存されているか確認します。
      メールサーバ「radish」に保存されている「user1」最新メールをダブルクリック
    • 「user1」の最新メールをダブルクリックすると
      メールソフト(Windowas Liveメール)が立ち上がり、マルチパートメールの送信結果の内容が確認できます。
      メールソフト「Windowas Liveメール」で表示した内容(HTMLメール、添付ファイルなど)

PHPの送受信メールプログラム作成

  • メール送受信処理ライブラリ関数プログラムの作成
    mail_mpart_lib.php」は、マルチパートのメールを送信・受信するPHPライブラリ関数を汎用的なプログラムとして、簡単にメール処理ができるようにしたものです。
    • マルチパートの送信処理では、
      PEARの「Mail」「Mail_Mine」ライブラリを利用し、主プログラムから、「mail_send()」関数を利用して引数に「送信データの連想配列」を参照渡しで指定します。送信結果は、送信成功「true」、送信失敗「false」の戻り値が返されます。
    • マルチパートの受信処理では、
      PHP組み込み関数の「IMAP」を利用し、主プログラムから、「mail_recieve()」関数を利用して引数に「受信データの接続条件」と「受信データ格納エリア」を参照渡しで指定します。送信結果は、送信成功「true」、送信失敗「false」の戻り値が返され、受信データ(一括)が指定したエリアにセットされます。
    • PHPライブラリ関数「mail_mpart_lib.php」仕様(PDF)
      に詳細内容が説明されています。
    • マルチパート・メール送受信処理ライブラリ関数プログラム:「mail_mpart_lib.zip」のダウンロード
  • マルチパート・メール送信処理プログラムの作成
    • mail_mpart_lib.phpを取り込む
      require_once('mail_mpart_lib.php');
      
    • 送信データの連想配列設定
      連想配列キー「from」「to」「cc」「bcc」「subject」がメールヘッダのパラメータに対応し、メール本文がプレーンテキスト「body」、HTMLメール「html」、添付ファイルが「attach」に対応しています。 添付ファイルは、複数個の対応のため、"「ファイルパス」[;]区切り「ファイルタイプ」"の形式の文字列の配列で指定します。画像やテキストのファイルタイプなど"[;]区切り「ファイルタイプ」"を省略することも可能です。
      $mail_param = array(
        'from'    => 'inquiry@cxm.com',
        'to'      => 'user1@cxm.com',
        'cc'      => 'user2@cxm.com',
        'subject' => 'サンプル・マルチパートメール',
        'body'    => 'テストメール1の内容です。',
        'html'    => 
          '<html><body>HTMLメールサンプル</body></html>',
        'attach'  => array(
            'file/mail_detail.txt;text/plain',
            'file/sample.jpg'
            )
       );
    • 送信データの関数「mail_send()」の実行
      送信データの連想配列を引数に指定して、mail_send()関数を記述します。$jdgの変数には、送信成功「true」又は送信失敗「false」がセットされますので、判断用データからecho関数でその内容メッセージを表示します。
      $jdg = mail_send($mail_param);
      if($jdg){
         echo "送信完了!♪";
      }else{
         echo "送信失敗・・・";
      }
    • プログラムの配置と実行確認
      作成したプログラムを「mail_php」フォルダに「mail_mpart_lib.php」ライブラリ関数も同じフォルダに配置して実行すると「送信完了!♪」が表示されれば送信OKです。メールボックスをダブルクリックして、メール内容を確認します。 マルチパート・メール送信実行して「送信完了!♪」を表示
    • マルチパート・メール送信処理プログラム:「mail_send_mp01.zip」のダウンロード
  • マルチパート・メール受信処理プログラムの作成
    メール送信と同様にmail_mpart_lib.phpを取り込む。
    • 添付ファイル保存パスの設定
      require_once('mail_mpart_lib.php');
      $out_dir = 'mail_box/';
      
    • 「mail_mpart_lib.php」の接続パラメータとメール受信データエリア・クリアの設定
      連想配列のキー「server」が"localhost"のポート番号「110」で「POP3」メールサーバの接続指定を設定します。メールサーバのログインチェックは「user」「password」を指定します。受信データを取り込んだ後に受信メールを削除したい場合は、「delete」で'on'(文字列があれば良い)を設定します。 本文のプレーンテキストの表示コントロールでの改行は、「crlf」を指定します。
      メール受信した内容の格納エリアをクリアして置きます。受信データの内容が参照渡しで受信処理実行後にセットされます。
      $mail_param = array(
         'server'   => '{localhost:110/pop3}INBOX',
         'user'     => 'user1',
         'password' => 'user1234',
         'delete'   => 'on',
         'crlf'     => "<br>¥n"
       );
      //メール受信データのエリアクリア
      $mail_box = array();
    • 受信データ取得の関数「mail_recieve()」の実行
      「メール受信サーバの接続パラメータ」と「受信データの格納配列エリア」を引数に指定して、mail_recieve()関数を記述します。$jdgの変数には、受信成功「true」又は受信失敗「false」がセットされますので、受信成功のとき「受信データ一覧のテーブル表示」(後述)で、受信失敗のときecho関数でエラー表示します。
      $jdg = mail_recieve($mail_param,$mail_box);
      if($jdg){
         ... //(受信データ取得処理のプログラム処理)
      }else{
         echo "メールボックスに接続できませんでした。";
      }
    • 受信データ取得処理のプログラム内容
      プログラム内容が長くなるため、全体的な処理フローと添付ファイルのファイル保存を中心に説明します。ファイルオープン「fopen」がバイナリ出力モード「wb」に注意して下さい。
      //table headerのヒアドキュメント
      $html_dr =<<<_EOL_
          ... 
      _EOL_;
      //メール受信データのテーブル作成
      foreach($mail_box as $mt){
         ...
       //添付ファイルがあるとき
       if(isset($mt['body']['file'])){
          $fary=explode("¥n",trim($mt['body']['file']));
          $html_dr .="[添付ファイル]<br>";
          //各添付ファイルの表示データセット
          foreach($fary as $it){
            $ix=explode("¥t",$it);
            $html_dr .="[{$ix[0]}]<br>";
            //添付ファイル保存
            $tmpName = $out_dir.$ix[0];
            if($fp = fopen($tmpName,"wb")){
              fwrite($fp,$mt['body']['data'][$ix[0]]);
              fclose($fp);
            }
          }
       }
        ...
      }
      //HTML tableドキュメントの出力
      echo $html_dr;
    • プログラムの配置
      作成したプログラムを「mail_php」フォルダに配置します。添付ファイルの格納フォルダ「mail_box」を作成しておきます。 「mail_box」フォルダを作成した「mail_php」フォルダ構成内容
    • プログラムの実行確認
      作成したプログラムを、「mail_php」フォルダに配置して実行するとメールボックスにある受信データの一覧が表示され、各メールに対して「プレーンテキスト」、「HTMLメール」、「添付ファイルリスト」の内容と指定フォルダに保存されていることを確認します。 マルチパート・メール受信リストを実行して「受信一覧」を表示
      添付ファイルの格納フォルダ内容
    • マルチパート・メール受信処理プログラム:「mail_recieve_mp01.zip」のダウンロード

PHPプログラミング補足説明

PHPリファレンス

参考資料の表示

pagetopへ