4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

新着Gmailの受信ボックスを表示する

Posted at

今回はimapを使っています。
詳しくは下記参照。
http://qiita.com/ming/items/ce7b8f394cc9b12a2b49

新着メールのみを表示するために
ヘッダー情報を取得した後に
未読フラグが立っているかどうかの処理を加えることで
既読メールを表示しない方法でやっています。
フラグ情報のURL:http://php.net/manual/ja/function.imap-search.php

また、未読メールを取得してきても
メール番号は元の番号なので
表示するためにforで何回、回せばいいのか分からなかったりしたので
ソースの途中でcnt変数を入れることで
何通未読メールがあるか数えています。

なので、たとえば
メール番号40:未読
メール番号39:既読
メール番号38:未読
だと確実にエラーが起きます。

MailBox2.php

<?php
header('Content-Type: text/html; charset=UTF-8');

// 言語
mb_language('Japanese');
// 文字コード
mb_internal_encoding('utf-8');

// 必要な定数を設定
define('GMAIL_HOST','imap.googlemail.com');
define('GMAIL_PORT',993);
define('GMAIL_ACCOUNT','hogehoge@gmail.com');
define('GMAIL_PASSWORD','hogehoge');
define('SERVER','{'.GMAIL_HOST.':'.GMAIL_PORT.'/novalidate-cert/imap/ssl}');

//$seconds = 90; //スリープさせる秒数
//$url = "http://localhost/GmailTest/src/mailbox.php";
set_time_limit(60); //タイムアウトまでの秒数

// メールボックスへの IMAP ストリームをオープン
if (($mbox = @imap_open(SERVER."INBOX", GMAIL_ACCOUNT, GMAIL_PASSWORD)) == false) {
	// 失敗処理を記述...
}
// メールボックスの情報を取得
$mboxes=imap_mailboxmsginfo($mbox);


// メッセージ数の有無
if( $mboxes->Unread != 0 ) {
	// 情報を格納する変数を初期化
	$mail=null;
	for( $mailno=1; $mailno<=$mboxes->Nmsgs; $mailno++ ) {
		// ヘッダー情報の取得
		$head=imap_header($mbox, $mailno);

		//追加 参考http://blog.ahh.jp/?p=7907
		if(@$head -> Unseen == 'U'){

		// アドレスの取得
		$mail[$mailno]['差出人']=$head->from[0]->mailbox.'@'.$head->from[0]->host;
		// タイトルの有無
		if( !empty($head->subject) ) {
			// タイトルをデコード
			$mhead=imap_mime_header_decode($head->subject);
			foreach( $mhead as $key=>$value) {
				if( $value->charset != 'default' ) {
					$mail[$mailno]['件名']=mb_convert_encoding($value->text,'UTF-8',$value->charset);
				}else{
					$mail[$mailno]['件名']=$value->text;
				}
			}
		}else{
			// タイトルがない場合の処理を記述...
			echo "no title";
		}
		// 格納用変数の初期化
		$charset=null;
		$encoding=null;
		$attached_data=null;
		$parameters=null;
		// メール構造を取得
		$info=imap_fetchstructure($mbox, $mailno);
		if( !empty($info->parts) ) {
			//
			$parts_cnt=count($info->parts);
			for( $p=0; $p<$parts_cnt; $p++ ) {
				// タイプにより処理を分ける
				// [参考] http://www.php.net/manual/ja/function.imap-fetchstructure.php
				if( $info->parts[$p]->type == 0 ) {
					if( empty( $charset ) ) {
						$charset=$info->parts[$p]->parameters[0]->value;
					}
					if( empty( $encoding ) ) {
						$encoding=$info->parts[$p]->encoding;
					}
				}elseif(!empty($info->parts[$p]->parts) && $info->parts[$p]->parts[$p]->type == 0){
					$parameters=$info->parts[$p]->parameters[0]->value;
					if( empty( $charset ) ) {
						$charset=$info->parts[$p]->parts[$p]->parameters[0]->value;
					}
					if( empty( $encoding ) ) {
						$encoding=$info->parts[$p]->parts[$p]->encoding;
					}
				}elseif($info->parts[$p]->type == 5){
					$files=imap_mime_header_decode($info->parts[$p]->dparameters[0]->value);
					if(!empty($files) && is_array($files) ) {
						$attached_data[$p]['file_name']=null;
						foreach($files as $key => $file) {
							if( $file->charset != 'default') {
								$attached_data[$p]['file_name'].=mb_convert_encoding($file->text, 'UTF-8', $file->charset);
							}else{
								$attached_data[$p]['file_name'].=$file->text;
							}
						}
					}
					$attached_data[$p]['content_type'] = $info->parts[$p]->subtype;
				}
			}
		}else{
			$charset=$info->parameters[0]->value;
			$encoding=$info->encoding;
		}
		if( empty($charset) ) {
			// エラー処理を記述...
		}
		// 本文を取得
		$body=imap_fetchbody($mbox, $mailno, 1, FT_INTERNAL);
		$body=trim($body);
		if( !empty($body) ) {
			// タイプによってエンコード変更
			switch( $encoding ) {
				case 0 :
					$mail[$mailno]['本文']=mb_convert_encoding($body, "UTF-8", $charset);
					break;
				case 1 :
					$encode_body=imap_8bit($body);
					$encode_body=imap_qprint($encode_body);
					$mail[$mailno]['本文']=mb_convert_encoding($encode_body, "UTF-8", $charset);
					break;
				case 3 :
					$encode_body=imap_base64($body);
					$mail[$mailno]['本文']=mb_convert_encoding($encode_body, "UTF-8", $charset);
					break;
				case 4 :
					$encode_body=imap_qprint($body);
					$mail[$mailno]['本文']=mb_convert_encoding($encode_body, 'UTF-8', $charset);
					break;
				case 2 :
				case 5 :
				default:
					// エラー処理を記述...
					break;
			}
		}else{
			// エラー処理を記述...
		}
	}//if文の分

	}

//-----------------------------------------------------------------------------
//新着メールのみの受信ボックスを表示する

	//どこからが新着メールが把握させる。
	$new = $mboxes->Unread;

	$ans = $mailno - $new;
	$mailno = $mailno-1;

	//新着メール数を表示
	echo"全メール件数".$mailno."件<br>";
	echo"新着メール".$new."件<br><br>";

	//返信用に変数のバックアップ
	$n = $ans;


	//最新メールが下になっている。
	//受信ボックスの中身を表示する
	echo "<table border=1>";
	echo"<tr> <th>MailNo.</th><th>差出人</th><th>件名</th><th>本文</th> </tr>";

	for($ans; $ans<=$mailno; $ans++){
		echo"<tr> <td>".$ans."</td><td>".$mail[$ans]['差出人']."</td><td>".$mail[$ans]['件名']."</td><td>".$mail[$ans]['本文']."</td> </tr>";
	}

	echo "</table><br><br>";

}
else{
	echo "新着メールはありません。";
}
?>

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?