SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

GPS携帯を使った口コミサイト構築 - PHPによるメールの受信処理 -

目的に応じて適材適所で使うPHPライブラリ(3)

メールデータ解析用クラスの作成

 Mail::mimeDecodeを毎回そのまま使用するとコードが煩雑になりますのでMail::mimeDecodeをラップしたメールデータ解析用クラスを作成します。

 今回必要なメールデータは送信元アドレス、件名、本文、添付ファイルになりますので、メールヘッダ、本文、添付ファイルをそれぞれ取得するためのメソッドを作成することになります。

 コンストラクタで標準入力で取得したメールデータを渡し、Mail::mimeDecodeを使用して解析後、本文や添付ファイルを取得し、それぞれをget~の形式で返却できるメソッドを作成しておきます。

[リスト1]MailDecoder.class.php(抜粋)
/**
 * コンストラクタ
 */
function MailDecoder($source)
{
    $params = array();
    $params['include_bodies'] = true; // ボディを解析する
    $params['decode_bodies']  = true; // ボディをコード変換する
    $params['decode_headers']  = true; // ヘッダをコード変換する

    $this->_decoder = new Mail_mimeDecode($source);
    $this->_structure = $this->_decoder->decode($params);
    // ボディ部分を解析
    $this->getMailData($this->_structure);
}

# 省略

/**
 * 添付ファイルを返却する
 */
function getAttach(){
    return $this->attachments;
}

 今回のサンプルではマルチパートのメールを解析しますので、メール本文の解析はマルチパート内にある各パートの解析を行うことになります。

 $structure->partsの各パート内の要素を参照してそれが何のデータになるのか解析します。

 添付ファイルの場合はパートの中に「disposition」という要素があり、「attachment」という値になっていますのでこの要素で判断します。

 通常の携帯メール本文は「ctype_primary」「ctype_secondary」の要素を参照してそれぞれ「text」「plain」となるパートに入っています。

 その他、htmlメールやマルチパートの中にマルチパートがある場合にも対応できるように汎用的なメソッドを作成します。

[リスト2]MailDecoder.class.php(抜粋)
/**
 * メール本文部分の処理
 */
function getMailData($structure){
    static $i = 0;
    // マルチパートの場合
    if (strtolower($structure->ctype_primary) == "multipart") {
        // 各パートを解析する
        foreach ($structure->parts as $part) {
            // 添付ファイルの場合
            if (isset($part->disposition) && $part->disposition=="attachment") {
                //添付ファイル
                $this->attachments[$i]['type'] = strtolower($part->ctype_primary)."/".strtolower($part->ctype_secondary);
                $this->attachments[$i]['name'] = $part->ctype_parameters['name'];
                $this->attachments[$i]['binary'] = $part->body;
                $i++;
            } else {
                switch (strtolower($part->ctype_primary)) {
                    case "text": // テキスト本文
                        if ($part->ctype_secondary=="plain") {
                            $this->body_text = trim(mb_convert_encoding($part->body, 'UTF-8', 'auto'));
                        } else { // HTML本文
                            $this->body_html = trim(mb_convert_encoding($part->body, 'UTF-8', 'auto'));
                        }
                        break;
                    case "image": // マルチパート内に画像がある場合
                        $this->attachments[$i]['type'] = strtolower($part->ctype_primary)."/".strtolower($part->ctype_secondary);
                        $this->attachments[$i]['name'] = $part->ctype_parameters['name'];
                        $this->attachments[$i]['binary'] = $part->body;
                        $i++;
                        break;
                    case "multipart": //マルチパートの中にマルチパートがある場合は再帰的に自分自身を呼び出します
                        $this->getMailData($part);
                        break;
                }
            }
        }
    //テキスト本文のみのメール
    } elseif (strtolower($structure->ctype_primary) == "text") {
        $this->body_text = trim(mb_convert_encoding($structure->body, 'UTF-8', 'auto'));
    }
}

 上記メソッドのメールデータ解析イメージ図は次のようになります。

getMailDataメソッドでのメールデータ解析イメージ図
getMailDataメソッドでのメールデータ解析イメージ図

次のページ
添付ファイルの保存

この記事は参考になりましたか?

目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4749 2010/02/03 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー