しぃぶろぐ。

仕事とか技術関係のこと。

PHPでメール受信処理(PHPプログラムの自動起動)

お久しぶりです。
この一ヶ月の間に第二子出産してましたw
3560gのでっかい男の子ですー。
第一子よりもでっかくて、よく飲んで、よく寝てくれるので、
いやもう楽ちん楽ちん。。。
やっぱり二人目は楽できますねー。
その分、おにーちゃんが物凄く甘えんぼになっているので、
そっちの方が大変です。。。


さて、本題です。


先月までにcakeとPEARを入れておいたので、
早速プログラミングに入りたいと思います。


作りたいのは、(携帯)メールによるお買い物etcメモです。
全体像としては、

  1. メール受信
  2. メールの内容でDB更新
  3. DBの内容でメール送信

になります。
もちろん、メモの閲覧・更新はwebでも行なえるようにしたいと思っています。


今日は一番最初のメールを受信して分解する部分です。
メールの内容をパイプで渡す部分は、
CPA-LABテクニカルさんのさくらインターネットでリアルタイムメール処理
などを参考にしてください。

#/usr/local/bin/php-cgi-default
<?php

#-- PEARのmimeデコーダーを読み込む
require_once 'Mail/mimeDecode.php';

#-- メールデータの取得
$params['include_bodies'] =true;
$params['decode_bodies'] =true;
$params['decode_headers'] =true;
$params['input'] = file_get_contents("php://stdin"); //標準入力
$params['crlf'] = "\r\n";
$mail_data = Mail_mimeDecode::decode($params);

#-- From
$FromAddress = $mail_data->headers['from'];
$FromAddress = addslashes($FromAddress); //エスケープ処理
$FromAddress = str_replace('"','',$FromAddress);
#-- 署名つきの場合
preg_match("/<.*>/",$FromAddress,$str);
if($str[0]!=""){
	$str=substr($str[0],1,strlen($str[0])-2);
	$FromAddress=$str;
}

#-- Subject フィールドの取得
$Subject = $mail_data->headers['subject'];
$Subject = mb_convert_encoding($Subject,"UTF-8","JIS");

#-- 本文の取得
switch(strtolower($mail_data->ctype_primary)){
	case "text": //テキストメール
	 $MailBody = $mail_data->body;
	 $MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS");
	 break;
	case "multipart": //マルチパート(添付ファイル(画像前提)付)
	 foreach($mail_data->parts as $part){
	 	switch(strtolower($part->ctype_primary)){
			case "text":
			 $MailBody = $part->body;
			 $MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS");
			 break;
			case "image":
			 $type = strtolower($part->ctype_secondary);
			 // jpg,gif,png以外の画像形式は受け付けない
			 if($type != "jpeg" and $type != "jpg" and $type != "gif" and $type != "png"){
			 	continue;
			 }
			 // ファイルを保存
			 $fp = fopen("/tmp/". time() . $type, "w");
			 $length = strlen($part->body);
			 fwrite($fp,$part->body,$length);
			 fclose($fp);
			 break;
		}
	 }
	 break;
	default:
	 $MailBody="";
}

あとで、説明追加します。。。