WordPress・WEB系の開発(プログラム)関係や技術情報ほか、技術情報全般を掲載

  • このエントリーをはてなブックマークに追加

PHP POPで画像添付ファイル付きメールの受信方法

POPでメールサーバに接続し、画像添付ファイルが付いている
メールの画像データを保存したいと思い調べていたところ「てきとぅー日記」さんの
下記エントリーを見つけて試してみました。

※てきとぅー日記:PHP POPで画像添付ファイル付きのメール受信

下記、99.9%転載ですが、画面出力の際に文字化けが起きてしまいましたので、文字コードのHTTPヘッダを送信する一行を追加しました。

<?php
/*********************
* サーバー設定
*/
$path = '/var/www/html/np/tmp/'; //画像の保存先
$pop3user = "ユーザー"; //pop3ユーザー
$pop3pass = "パスワード"; //パスワード
$pop3server = "サーバー"; //pop3サーバー

/*********************
* 動作設定
*/
$chare_print = "UTF-8"; //画面表示の文字コード
header("Content-Type: text/html; charset=UTF-8"); //文字コードのヘッダを送信

$mail_dell = "1"; //受信したメールをサーバーから削除するか 「0」しない、「1」する

// 接続開始
$sock	 = fsockopen($pop3server,110, $err, $errno, 10) or die("メールサーバーに接続できません");
$buf	 = fgets($sock, 512);

if(substr($buf, 0, 3) != '+OK') die($buf);

$buf = _sendcmd("USER $pop3user");
$buf = _sendcmd("PASS $pop3pass");
$data = _sendcmd("STAT");
sscanf($data, '+OK %d %d', $num, $size);

// 件数が 0 件の場合は disconnection
if($num == 0){
	$buf = _sendcmd('QUIT');
	fclose($sock);
	echo 'メールの件数が0件です';
	exit;
}

// メール取得
for($i=1;$i<=$num;$i++){
	$line = _sendcmd("RETR $i");
	while (!ereg("^\.\r\n",$line)) {
		$line = fgets($sock,512);
		$dat[$i].= $line;
	}

	//受信したメールの削除
	if($mail_dell){
		$data = _sendcmd("DELE $i");
	}
}
$buf = _sendcmd("QUIT");
fclose($sock);

/******************:
* 受信メール処理
*/
for($j=1;$j<=$num;$j++){
	list($head, $body) = mime_split($dat[$j]);

	// 日付取得
	eregi("Date:[ \t]*([^\r\n]+)", $head, $date);
	$file = date("Ymd.His",strtotime($date[1]));

	// サブジェクト取得
	eregi("Subject:[ \t]*([^\r\n]+)", $head, $subject);
	while (eregi("(.*)=\?iso-2022-jp\?B\?([^\?]+)\?=(.*)",$subject[1],$regs)) {	// MIME Bデコード
		$subject = $regs[1].base64_decode($regs[2]).$regs[3];
	}

	//添付ファイル付きのメールだったら
	if (eregi("Content-type:.*multipart/",$head)) {
		eregi('boundary="([^"]+)"', $head, $boureg);
		$body = str_replace($boureg[1], urlencode($boureg[1]), $body);
		$part = split("\r\n--".urlencode($boureg[1])."-?-?",$body);

		print '【タイトル】'.mb_convert_encoding($subject, $chare_print, "JIS").'
	';

	foreach ($part as $multi){
		list($m_head, $m_body) = mime_split($multi);

		$m_body = ereg_replace("\r\n\.\r\n$", "", $m_body);
		if (!eregi("Content-type: *([^;\n]+)", $m_head, $type)) continue;
		list($main, $sub) = explode("/", $type[1]);

		// 本文をデコード
		if (strtolower($main) == "text") {
			$tmp = split("\r\n",mb_convert_encoding($m_body, $chare_print,"JIS"));
			print '【本文】'; print_r($tmp); print '';

			//本文をテキストに保存する
			//$fp = fopen("{$path}/{$file}.txt", "w") or die( "書き込み出来ません" );
			//fputs($fp,$tmp[0]."\n".date("Y/m/d H:i:s",strtotime($date[1])));
			//fclose($fp);
		}

		// 添付データをデコードして保存
		if (eregi("Content-Transfer-Encoding:.*base64", $m_head)) {
			$tmp = base64_decode($m_body);
			$fp = fopen("{$path}/{$file}.jpg", "wb") or die( "画像の書き込みが出来ません" );
			fputs($fp, $tmp);
			fclose($fp);

			print '【画像】<img src="/np/tmp/'.$file.'.jpg"><br />';
		}
	}

	//添付無しの場合
	}else{

		print '【タイトル】'.mb_convert_encoding($subject, $chare_print, "JIS");
		print '
		【本文】'.str_replace("\n","
		",mb_convert_encoding($m_body, $chare_print, "JIS"));

	}

}

//////////////////////////////
// コマンド送信
function _sendcmd($cmd) {
	global $sock;
	fputs($sock, $cmd."\r\n");
	$buf = fgets($sock, 512);

	if(substr($buf, 0, 3) == '+OK') {
		return $buf;
	} else {
		die($buf);
	}
	return false;
}

// MIME分割
function mime_split($data) {
	$part = split("\r\n\r\n", $data, 2);
	$part[1] = ereg_replace("\r\n[\t ]+", " ", $part[1]);

	return $part;
}
?>

– – –

【PR】平塚の整体。自己流で、同じ部位をグイグイと強くもんでいませんか? そのようなマッサージは最悪の結果「リバウンド現象」を引き起こすので、お気をつけ下さい。

関連記事

コメントは利用できません。

アーカイブ