前回は添付ファイルを保存するところまでが出来ました。

今回は以下のことを実装しました。
・保存したファイル(jpg)を特定のフォルダーに保存。
・タイムスタンプ、送信元メールアドレス、ファイル名をデータベースへ保存。
・保存したファイルを表示。


コマンドラインPHPでファイルを作成すると属性が660になるので664に変更するようにソースを修正しました。

    $ret = chmod($filename2,0644); // $filename のパーミッション変更


受信したjpgファイルを縮小してサムネイルを作ります。

ここを参考にしました。
http://goodjob.boy.jp/chirashinoura/id/79.html
http://sandman.s6.xrea.com/nucleus/item-60.html

サムネイルの幅を固定するのに良いサンプルでした。
何箇所か誤記があったので直しています。

ImageCreateFromJPEG(), ImageCopyResized()を使用しています。
参考元ほとんどそのままでfunctionにしました。


resize.php

<?php

function resize($file_path, $file_path2){
	print "function resize {$file_path} {$file_path2} \n";
	// -- ?
	// 画像を読み込む。
	//$file_path = "ファイルパスまたはURL";
	$image = ImageCreateFromJPEG($file_path); //JPEGファイルを読み込む
	//$image = ImageCreateFromGIF($file_path); //GIFファイルを読み込む
	//$image = ImageCreateFromPNG($file_path); //PNGファイルを読み込む

	// -- ?
	// 画像のサイズを取得。
	$width = ImageSX($image); //横幅(ピクセル)
	$height = ImageSY($image); //縦幅(ピクセル)

	// -- ?
	// 縮小した画像のサイズを決める。
	// 例えば、幅を100ピクセルに固定したい場合は以下のとおり。
	$new_width = 240;
	$rate = $new_width / $width; //圧縮比
	$new_height = $rate * $height;

	// -- ?
	// 空の画像を作成する。
	$new_image = ImageCreateTrueColor($new_width, $new_height);

	// -- ?
	// 画像を普通にリサイズコピーする場合。
	ImageCopyResized($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height);
	// サンプリングしなおす場合。
	ImageCopyResampled($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height);

	// -- ?
	// ブラウザに出力する場合。
	//ImageJPEG($image);
	//ImageGIF($image); //環境によっては使えない
	//ImagePNG($image);
	// ファイルに保存する場合。
	ImageJPEG($new_image, $file_path2, 70); //3つ目の引数はクオリティー(0〜100)
	//ImageGIF($image, $file_path); //環境によっては使えない
	//ImagePNG($image, $file_path);

	// -- ?
	// ちゃんとメモリを解放する。※これを怠るとサーバ桝魔キるかもねーw
	imagedestroy ($image); //サムネイル用イメージIDの破棄 ※3
	imagedestroy ($new_image); //サムネイル元イメージIDの破棄 ※4
}

?>


メール受信からデータベース登録まで
完成したメール受信で起動するPHP example.php

#!/usr/local/bin/php


<?php
print "php start!!\n";


//---------------------------------------------------------------------
//標準出力をmail.txtに保存
//---------------------------------------------------------------------
$content = null;
$fp=fopen("php://stdin",'r') or die('File Open Error');
$fpw=fopen("mail.txt",'w');
$fplog=fopen("log.txt",'a');
$fplog2=fopen("log2.txt",'a');

//fputs($fplog, "log open \n");

while( !feof($fp) ){
    $content .= fgets( $fp ,1024);
}
fputs($fpw, $content);

//fputs($fplog, "mail.txt write \n");


//---------------------------------------------------------------------
//メール受信処理
//---------------------------------------------------------------------
require("resize.php");	
ini_set('include_path', '/home/xxx/www/xxx/pear/php');
require_once('ReceiptMailDecoder.class.php');

print "open mail.txt\n";

$fp = fopen("mail.txt","r");
$body = "";
while (!feof($fp)){
	$body .= fgets($fp,1024);
}

$decoder =& new ReceiptMailDecoder($body);
// To:アドレスのみを取得する

$toAddr = $decoder->getToAddr();	print "$toAddr <br>";
// To:ヘッダの値を取得する

$fromAddr = $decoder->getFromAddr();		print "$fromAddr <br>";
// from:ヘッダの値を取得する

$toString = $decoder->getDecodedHeader( 'to' );
// Subject:ヘッダの値を取得する

$subject = $decoder->getDecodedHeader( 'subject' );	print "$subject  <br>";
// text/planなメール本文を取得する

$body = mb_convert_encoding($decoder->body['text'],"eucjp-win","jis"); print "$body  <br>";
// text/htmlなメール本文を取得する

$body = mb_convert_encoding($decoder->body['html'],"eucjp-win","jis"); print "$body  <br>";
// マルチパートのデータを取得する
if ( $decoder->isMultipart() ) {
    $tempFiles = array();
    $num_of_attaches = $decoder->getNumOfAttach();
    for ( $i=0 ; $i < $num_of_attaches ; ++$i ) {
        /*
         * ファイルを一時ディレクトリ _TEMP_ATTACH_FILE_DIR_ に保存する
         * 一時ファイルには tempnam()を使用する
         * この部分は使用に合わせて変更して下せい
         */
//      $fpath = tempnam("./tmp", "todoattach_" );
//    	print "fpath=$fpath <br>\n";
//      $fpath = tempnam( _TEMP_ATTACH_FILE_DIR_, "todoattach_" );
        $mimetype = $decoder->attachments[$i]['mime_type'];
      	$filename = $decoder->attachments[$i]['file_name'];    	
    	$filename2 = "./"."$mimetype"."/"."$filename";
    	$filename3 = "./"."$mimetype"."/resized/"."$filename";
        if ( $decoder->saveAttachFile( $i, $filename2 ) ) {	//パス付きのファイル名
        	$ret = chmod($filename2,0644); // $filename のパーミッション変更
        	$created = date('Y-m-d H:i:s');
			fputs($fplog2, "$created,$fromAddr,$num_of_attaches,$filename,$mimetype,\n");

        	/*mysql insert*/
        	$cn = mysql_connect('mysql2.db.sakura.ne.jp', 'xxxx', 'xxxx');
			if (!$cn) {
    			die('Could not connect: ' . mysql_error());
			}
			mysql_select_db('anakureon');
			$sql = "insert into post_log(created,fromaddress,filename,mime) ";
			$sql = $sql."VALUES('$created','$fromAddr','$filename','$mimetype')";
//			print "sql = $sql \n";
			if (!(mysql_query($sql))) {
//				die('query err:t: ' . mysql_error());
			}
        	$file_path = $filename2;
        	$file_path2= $filename3;
        	resize($file_path,$file_path2);
        	$ret = chmod($file_path2,0644); // $file_path2 のパーミッション変更
        }
    }
}
/**/

$created = date('Y-m-d H:i:s');  
fputs($fplog, "$created,$fromAddr,$num_of_attaches,\n");

?>


保存したファイルをselect文を使用して最新50件表示します。
サムネイルを表示してサムネイルをクリックするとファイル本体を表示します。

select.php

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>mk18 photo</TITLE>
</HEAD>
<BODY>
<P align="center">mk18 photo</P>
<HR>
<DIV>

<?php

$cn = mysql_connect('xxx.db.sakura.ne.jp', 'xxx', 'xxx');
if (!$cn) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('anakureon');

$sql = "SELECT * FROM  `post_log` ORDER BY  `post_log`.`id` DESC LIMIT 0 , 50";
//print "sql = $sql <BR>\n";


if (!($rs = mysql_query($sql))) {
	die('query err:t: ' . mysql_error());
}
//print '照会件数= ' . mysql_num_rows($rs) . '<BR>';

// MySQL レコード参照


//print "mysql_fetch_array <br>\n";
print "<br>\n";
print "<p>\n";
while ($item = mysql_fetch_array($rs)) {
	$filename = $item['filename'];
	$filename2= "./image/jpeg/{$filename}";
	$filename3= "./image/jpeg/resized/{$filename}";
	
	print "<a href='{$filename2}'><img src='${filename3}' alt='{$filename}' title='{$filename}' ></img></a>\n";
}
print "</p>\n";


mysql_close($cn);


//print "<P>正常終了</P>";
?>
</DIV>
<HR>
</BODY>
</HTML>

今回も先人の皆様のおかげでうまく行きました。
ありがとうございます。