SHOEISHA iD

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

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

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

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

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

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

添付ファイルの保存

 前項で作成したMailDecoderクラスを使ってのメールデータ解析は次のようになります。

 「メール件名」「メール本文」「添付ファイル」「送信元メールアドレス」をそれぞれ対応するメソッドで取得します。

[リスト3]mail_receive.php(抜粋)
// 標準入力からメールデータを取得
$raw_mail = stream_get_contents(STDIN);
// MailDecoderクラスでメールデータを解析
$decoder =& new MailDecoder($raw_mail);
// メール件名を取得
$subject = $decoder->getDecodedHeader('subject');
// メール本文を取得
$body = $decoder->getBodyText();
// 送信元メールアドレスを取得
$fromAddress = $decoder->getFromAddress();
// 添付ファイルを取得
$attachments = $decoder->getAttach();

 今回のサンプルでは添付ファイルは1枚なので上記コードの$attachmentsの0番地に格納されます。

 携帯のカメラで撮影された写真の画像名は年月日時刻になることが多く、重複を避けるためPHPの関数uniqid()を使って一意な名前にして保存します。

[リスト4]mail_receive.php(抜粋)
// 保存する画像名
$image_name = "";
// 一意な名前にするためのID
$uniq = uniqid();

// 添付ファイル情報を取得して拡張子を判別する
$data = pathinfo($attachments[0]['name']);
$ext = $data['extension'];
// 保存する画像名
$image_name = $uniq .'.'. $ext;
// 保存する画像パス
$image_path = $image_dir. $image_name;
// 画像を保存
if($fp=fopen($image_path, "wb")){
    fwrite($fp, $attachments[0]['binary']);
    fclose($fp);
    chmod($image_path, 0775);
}

メールデータの保存

 解析したメールの「件名」「本文」をMySQLのデータベースに、添付ファイルをサーバー上に保存します。

 PHPからデータベースを操作する方法については「PDOでサクサクDB開発」を参照ください。

 本サンプルではデータベース接続情報をconfig.phpに記述しています。

[リスト5]config.php(抜粋)
$MYSQL_HOST = 'MySQLサーバーのアドレス';
$MYSQL_USER = 'MySQLユーザー名';
$MYSQL_PASSWORD = 'MySQLユーザーのパスワード';
$MYSQL_DATABASE = 'データベース名';
$dbType = "mysql";

 解析後のメールデータを保存するテーブルを以下のSQLで作成します。

[リスト6]メールデータを保存するテーブル作成SQL文
CREATE TABLE IF NOT EXISTS `mail` (
  `id` int(11) NOT NULL auto_increment COMMENT 'ID',
  `hash` varchar(13) default NULL COMMENT 'アクティベーションに用いるキー',
  `subject` varchar(255) default NULL COMMENT 'メール件名',
  `body` text COMMENT 'メール本文',
  `image_name` varchar(32) default NULL COMMENT '添付画像名',
  `lat` varchar(32) default NULL COMMENT '緯度',
  `lon` varchar(32) default NULL COMMENT '経度',
  `address` varchar(255) NOT NULL COMMENT '地名',
  `status` tinyint(1) default '0' COMMENT 'ステータス 1:位置情報取得済',
  `created_date` datetime default NULL COMMENT '作成年月日',
  `updated_date` datetime default NULL COMMENT '更新年月日',
  PRIMARY KEY  (`id`),
  KEY `hash` (`hash`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

 作成したテーブルにメールの件名、本文、画像名を格納します。

 次回記事で説明予定のGPS情報取得の際にアクティベーションを利用しますので、その際のキーとしてuniqid()関数で作成した値も保存します。

[リスト7]mail_receive.php(抜粋)
// メール情報をDBに保存
$pdo = new PDO("{$dbType}:host={$MYSQL_HOST}; dbname={$MYSQL_DATABASE}","{$MYSQL_USER}", "{$MYSQL_PASSWORD}");
$stmt = $pdo->prepare("INSERT INTO mail (hash,subject,body,image_name,created_date) VALUES(:HASH, :SUBJECT, :BODY, :IMAGE_NAME, :DATE)");
$stmt->bindValue(':HASH', $uniq);
$stmt->bindValue(':SUBJECT', $subject);
$stmt->bindValue(':BODY', $body);
$stmt->bindValue(':IMAGE_NAME', $image_name);
$stmt->bindValue(':DATE', date('Y-m-d H:i:s'));
$stmt->execute();

 テーブルに保存したデータはGPS位置情報取得の際に使用します。

次のページ
メール送信クラスの作成

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

目的に応じて適材適所で使う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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー