添付ファイルの保存
前項で作成したMailDecoderクラスを使ってのメールデータ解析は次のようになります。
「メール件名」「メール本文」「添付ファイル」「送信元メールアドレス」をそれぞれ対応するメソッドで取得します。
// 標準入力からメールデータを取得
$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()を使って一意な名前にして保存します。
// 保存する画像名
$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に記述しています。
$MYSQL_HOST = 'MySQLサーバーのアドレス'; $MYSQL_USER = 'MySQLユーザー名'; $MYSQL_PASSWORD = 'MySQLユーザーのパスワード'; $MYSQL_DATABASE = 'データベース名'; $dbType = "mysql";
解析後のメールデータを保存するテーブルを以下の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()関数で作成した値も保存します。
// メール情報を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位置情報取得の際に使用します。
