【Zend Framework】Zend_Mail_Storage_POP3を試してみた

ちょっと会社のグループウェアの関係で

Zend Framework 1.10 で、Zend_Mail_Storage_POP3を試してみた。

実際は、んなことしなくても既存モジュールの局所修正で済んだからどうでもいいんだけど、
個人的にZend Frameworkの使い方を覚えておきたいので、備忘録ってことで。

すんげー試しまくったコードだから汚すぎる・・・。

<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=euc-jp" />
</head>
<body>
<?php
/*
Zend_Mimeのなかに以下の定義がある。MIMEヘッダの状態を見るのに使える
    const TYPE_OCTETSTREAM = 'application/octet-stream';
    const TYPE_TEXT = 'text/plain';
    const TYPE_HTML = 'text/html';
    const ENCODING_7BIT = '7bit';
    const ENCODING_8BIT = '8bit';
    const ENCODING_QUOTEDPRINTABLE = 'quoted-printable';
    const ENCODING_BASE64 = 'base64';
    const DISPOSITION_ATTACHMENT = 'attachment';
    const DISPOSITION_INLINE = 'inline';
    const LINELENGTH = 72;
    const LINEEND = "\n";
    const MULTIPART_ALTERNATIVE = 'multipart/alternative';
    const MULTIPART_MIXED = 'multipart/mixed';
    const MULTIPART_RELATED = 'multipart/related';
*/
	
$path = $_SERVER['DOCUMENT_ROOT'] . '/mailtest/lib';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

include 'Zend/Mail/Transport/Smtp.php';
include 'Zend/Mail.php';
include 'Zend/Mail/Storage/Pop3.php';

ini_set('date.timezone', 'Asia/Tokyo');
//ini_set('SMTP', 'bi.wakwak.com');
//ini_set('smtp_port', 587);

//例のごとく接続情報
$param = array('host' => 'popサーバ名',
               'user' => 'ユーザー名',
               'password' => 'パスワード',
				"port" => 110,
				"ssl" => "");			//"ssl" => "SSL" or "TLS" or blank

//接続します
$mail = new Zend_Mail_Storage_Pop3($param);
echo "mail count:" . $mail->countMessages() . "<br /><br />";

ini_set("mbstring.internal_encoding", "EUC-JP");
foreach($mail->getUniqueId() as $mailId){
	echo "<h1>start!</h1>";
    //echo $mailId . '<br />';
    
	$hogeMessage = $mail->getMessage($mail->getNumberByUniqueId($mailId));
	//件名出してます
	$subject = mb_decode_mimeheader($hogeMessage->subject);
	echo 'subject:' . $subject . '<br />';	//件名 mbstring.internal_encodingに依存する
	echo 'contentType:' . $hogeMessage->contentType . '<br />';	//コンテントタイプ isMultipart関数でマルチパートかどうか判断できる
	echo 'receive date:' . $hogeMessage->received . '<br />';		//メールサーバや受信日時
	//echo $hogeMessage->message-id . '<br />';	//メールサーバで管理している固有のID
	echo 'send date:' . $hogeMessage->date . '<br />';			//送信日時
	echo 'from:' . htmlspecialchars(mb_decode_mimeheader($hogeMessage->from)) . '<br />';			//送信元
	echo 'to:' . $hogeMessage->to . '<br />';			//送信先
	try {
		echo 'reply-to:' . htmlspecialchars(mb_decode_mimeheader($hogeMessage->replyTo)) . '<br />';	//返信先
	} catch (Zend_Mail_Exception $e) {
		echo 'reply-to:' . htmlspecialchars(mb_decode_mimeheader($hogeMessage->from)) . '<br />';
	}
	
	//echo 'content:' . mb_convert_encoding($hogeMessage->getContent(), "EUC-JP", "ISO-2022-JP") . '<br />';	//本文
	
	echo "===================================================<br />";
	
	/*
	本来、添付ファイルかどうかはMIMEヘッダの
	Content-Disposition: attachment;
	が存在するかどうかで判断する!っぽい
	*/
	//シングルパートの場合
	if (! $hogeMessage->isMultiPart()) {
		//content-typeを配列化
		$content_type = Zend_Mime_Decode::splitHeaderField($hogeMessage->contentType);
		echo "non part:<br />";
		print_r($content_type);
		
		//content-typeがtext/plainの場合
		if (strtok($hogeMessage->contentType, ';') == 'text/plain') {
			//本文
			if (array_key_exists("charset", $content_type)) {
				echo mb_convert_encoding($hogeMessage->getContent(), "EUC-JP", $content_type['charset']) . "<br /><br />";
			}
		}
		
	//マルチパートの場合
	} else {
		// マルチパートの個数取得
		$countParts = $hogeMessage->countParts();
		
		// マルチパート分処理
		for( $i = 1 ; $i <= $countParts ; $i++ ){
			echo "part" . $i . ":<br />";
			$part = $hogeMessage->getPart($i);
			echo $part->contentType;
			
			//content-typeを配列化
			$content_type = Zend_Mime_Decode::splitHeaderField($part->contentType);
			print_r($content_type);
			
			//textの場合
			if (strtok($part->contentType, ';') == 'text/plain') {
				//本文の場合
				if (array_key_exists("charset", $content_type)) {
					echo mb_convert_encoding($part->getContent(), "EUC-JP", $content_type['charset']) . "<br /><br />";
				}
				
				//添付ファイルのファイル名の場合(text/plainの場合だけこれが必要になる)
				if (array_key_exists("name", $content_type)) {
					echo mb_decode_mimeheader($content_type["name"]) . "<br /><br />";
					if ($part->getHeader("Content-Transfer-Encoding") == "base64") {
						//こうなった添付ファイルの中身をバイナリ書き込みで一時ファイルとしてどっかにファイル書き込みする
						echo "<pre>" . htmlspecialchars(base64_decode($part->getContent())) . "</pre>";
					}
					/*
					$file = "sample.csv";
	   				$file_length = filesize($file);
	   				header("Content-Disposition: attachment; filename=$file");
	   				header("Content-Length:$file_length");
	   				header("Content-Type: application/octet-stream");
	   				*/
				}
			}
			
			//bmpの場合
			if (strtok($part->contentType, ';') == 'image/bmp') {
				//添付ファイルのファイル名
				if (array_key_exists("name", $content_type)) {
					echo mb_decode_mimeheader($content_type["name"]) . "<br /><br />";
					if ($part->getHeader("Content-Transfer-Encoding") == "base64") {
						//こうなった添付ファイルの中身をバイナリ書き込みで一時ファイルとしてどっかにファイル書き込みする
						$filename = $_SERVER['DOCUMENT_ROOT'] . "/mailtest/test.bmp";
						$con = fopen($filename, "wb");
						fwrite($con, base64_decode($part->getContent()));
						fclose($con);
						echo "<img src=\"http://www.xxxxx.co.jp/mailtest/test.bmp\" />";
					}
				}
			}
			
			//zipの場合
			if (strtok($part->contentType, ';') == 'application/x-zip-compressed') {
				//添付ファイルのファイル名
				if (array_key_exists("name", $content_type)) {
					echo mb_decode_mimeheader($content_type["name"]) . "<br /><br />";
					if ($part->getHeader("Content-Transfer-Encoding") == "base64") {
						//こうなった添付ファイルの中身をバイナリ書き込みで一時ファイルとしてどっかにファイル書き込みする
						$filename = $_SERVER['DOCUMENT_ROOT'] . "/mailtest/test.zip";
						$con = fopen($filename, "wb");
						fwrite($con, base64_decode($part->getContent()));
						fclose($con);
						echo "<a href=\"http://www.xxxxx.co.jp/mailtest/test.zip\" />test.zip</a>";
					}
				}
			}
			
			//htmlの場合
			if (strtok($part->contentType, ';') == 'text/html') {
				//text/htmlの添付ファイル
				if (array_key_exists("name", $content_type)) {
					echo mb_decode_mimeheader($content_type["name"]) . "<br /><br />";
					if ($part->getHeader("Content-Transfer-Encoding") == "base64") {
						//こうなった添付ファイルの中身をバイナリ書き込みで一時ファイルとしてどっかにファイル書き込みする
						$filename = $_SERVER['DOCUMENT_ROOT'] . "/mailtest/test.php";
						$con = fopen($filename, "wb");
						fwrite($con, base64_decode($part->getContent()));
						fclose($con);
						echo "<a href=\"http://www.xxxxx.co.jp/mailtest/test.php\" />test.php</a>";
					}
					
				//HTMLメールの場合
				} elseif (array_key_exists("charset", $content_type)) {
					echo mb_convert_encoding($part->getContent(), "EUC-JP", $content_type['charset']) . "<br /><br />";
				}
			}
			
			echo "<br /><br />";
		}
	}
	echo '<br /><br />';
}
?>
</body>
</html>
<?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です