SQLの窓

2018年10月17日


PHP : IMAP 関数 でまずメールのヘッダ部分を整理してログに出力する / ※ JSON 出力を追加

本文は、マルチパートや添付ファイルなので、頭を切り替えて考える必要があります。とりあえずいろんなメールアカウントから、さくらインターネットのメールに転送してテストしました。

結果はすべて debug.log へ出力します。

データ取得後の管理の為、UID を取得して付加しています。

▼ PHP マニュアルより imap_uid
UID はユニークな ID であり時間が経過しても変わりません
<?php
error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT );
session_cache_limiter('nocache');
session_start();
header( "Content-Type: text/html; charset=utf-8" );

# デバッグログの初期化
file_put_contents("debug.log", "開始\n" );

mb_internal_encoding("UTF-8");

xlog("ログの出力");

# ***************************
# IMAP 接続
# ***************************
$con = @imap_open("{サーバ:993/imap/ssl}INBOX", "ユーザ", "パスワード");
if ( $con === FALSE ) {
	print imap_last_error();
	xlog(imap_last_error());
	exit();
}

// 現在のメールボックスに関する情報を得る
$mbox_info = imap_mailboxmsginfo( $con );
xlog("\n■■■ \$mbox_info 現在のメールボックスに関する情報 -------");
xlog( print_r( $mbox_info ,true ));

if( $mbox_info->Nmsgs == 0 ) {
	xlog( "メールメッセージがありません" );
	exit();
}

// ***************************
// メッセージ件数
// ***************************
$max = $mbox_info->Nmsgs;
xlog("【メッセージ件数:{$max}】" );

if ( $max > 100 ) {
	$max = 100;
}

// メールの主要データの集約
$mail = array();

// ***************************
// $max 〜 1
// 最新から表示
// ***************************
for( $i = $max; $i >= 1; $i-- ) {

	// ***************************
	// 全ヘッダーデータ
	// ***************************
	$mail_head = imap_header($con, $i);
	// アドレス

	xlog( "▼▼▼ \$mail_head このメールのヘッダデータ ({$i}番目) ▼▼▼" );
	// 【UID】を取得して、$mail_head に追加
	$mail["head"][$i]["UID"] = imap_uid( $con, $i );
	$mail["head"][$i]["Msgno"] = $mail_head->Msgno;

	xlog( print_r( $mail_head ,true ) );

	// ***************************
	// from : テキストと メールアドレス( アドレスのみの場合もある )
	// ***************************
	xlog("■■■ fromaddress (decode 前) -------");
	xlog( $mail_head->fromaddress );

	// ***************************
	// ASCII と それ以外で分解
	// ***************************
	$fromaddress = imap_mime_header_decode( $mail_head->fromaddress );
	xlog("■■■ fromaddress (decode 後) -------");
	xlog( print_r( $fromaddress, true ) );

	$mail["head"][$i]["fromaddress"] = "";
	foreach( $fromaddress as $key => $value ) {
		if( $value->charset != 'default' ) {
			$mail["head"][$i]['fromaddress'] .= mb_convert_encoding($value->text,'UTF-8',$value->charset);
		}
		else{
			$mail["head"][$i]['fromaddress'] .= $value->text;
		}
	}
	xlog("■■■ fromaddress (編集後) -------");
	xlog( $mail["head"][$i]['fromaddress'] );
	xlog("");

	// ***************************
	// subject : 件名
	// ***************************
	xlog("■■■ subject (decode 前) -------");
	xlog( $mail_head->subject );

	// ***************************
	// ASCII と それ以外で分解
	// ***************************
	$subject = imap_mime_header_decode( $mail_head->subject );
	xlog("■■■ subject (decode 後) -------");
	xlog( print_r( $subject, true ) );

	$mail["head"][$i]["subject"] = "";
	foreach( $subject as $key => $value ) {
		if( $value->charset != 'default' ) {
			$mail["head"][$i]['subject'] .= mb_convert_encoding($value->text,'UTF-8',$value->charset);
		}
		else{
			$mail["head"][$i]['subject'] .= $value->text;
		}
	}
	xlog("■■■ subject (編集後) -------");
	xlog( $mail["head"][$i]['subject'] );
	xlog("");

	// ***************************
	// 受信日時
	// ***************************
	$data = $mail["head"][$i]['date'] = $mail_head->date;
	$data = $mail["head"][$i]['date_normal'] = date('Y-m-d H:i:s', strtotime($data));

	// ***************************
	// サイズ
	// ***************************
	$data = $mail["head"][$i]['size'] = $mail_head->Size;

	$mail["head"][$i]["mail_head"] = $mail_head;

}

xlog("■■■ 編集後データの一覧 -------");
xlog( print_r( $mail["head"], true ) );


// ***************************
// IMAP 接続解除
// ***************************
imap_close($con);

// ***************************
// ログ出力
// ***************************
function xlog($message) {
	file_put_contents("debug.log", "{$message}\n" , FILE_APPEND );
}
?>
OK



json 文字列を出力して Ajax で使用できるように変更
<?php
error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT );
session_cache_limiter('nocache');
session_start();

header( "Access-Control-Allow-Origin: *" );
header( "Content-Type: application/json; charset=utf-8" );

# デバッグログの初期化
file_put_contents("debug.log", "開始\n" );

mb_internal_encoding("UTF-8");

xlog("ログの出力");

# ***************************
# IMAP 接続
# ***************************
$con = @imap_open("{さくらユーザ.sakura.ne.jp:993/imap/ssl}INBOX", "ユーザ@さくらユーザ.sakura.ne.jp", "パスワード");
if ( $con === FALSE ) {
	print imap_last_error();
	xlog(imap_last_error());
	exit();
}

// 現在のメールボックスに関する情報を得る
$mbox_info = imap_mailboxmsginfo( $con );
xlog("\n■■■ \$mbox_info 現在のメールボックスに関する情報 -------");
xlog( print_r( $mbox_info ,true ));

if( $mbox_info->Nmsgs == 0 ) {
	xlog( "メールメッセージがありません" );
	exit();
}

// ***************************
// メッセージ件数
// ***************************
$max = $mbox_info->Nmsgs;
xlog("【メッセージ件数:{$max}】" );

if ( $max > 100 ) {
	$max = 100;
}

// メールの主要データの集約
$mail = array();

$json = array();

// ***************************
// $max 〜 1
// 最新から表示
// ***************************
for( $i = $max; $i >= 1; $i-- ) {

	$obj = new stdClass();

	// ***************************
	// 全ヘッダーデータ
	// ***************************
	$mail_head = imap_header($con, $i);
	// アドレス

	xlog( "▼▼▼ \$mail_head このメールのヘッダデータ ({$i}番目) ▼▼▼" );
	// 【UID】を取得して、$mail_head に追加
	$mail["head"][$i]["UID"] = imap_uid( $con, $i );
	$mail["head"][$i]["Msgno"] = $mail_head->Msgno;

	xlog( print_r( $mail_head ,true ) );

	// ***************************
	// from : テキストと メールアドレス( アドレスのみの場合もある )
	// ***************************
	xlog("■■■ fromaddress (decode 前) -------");
	xlog( $mail_head->fromaddress );

	// ***************************
	// ASCII と それ以外で分解
	// ***************************
	$fromaddress = imap_mime_header_decode( $mail_head->fromaddress );
	xlog("■■■ fromaddress (decode 後) -------");
	xlog( print_r( $fromaddress, true ) );

	$mail["head"][$i]["fromaddress"] = "";
	foreach( $fromaddress as $key => $value ) {
		if( $value->charset != 'default' ) {
			$mail["head"][$i]['fromaddress'] .= mb_convert_encoding($value->text,'UTF-8',$value->charset);
		}
		else{
			$mail["head"][$i]['fromaddress'] .= $value->text;
		}
	}
	xlog("■■■ fromaddress (編集後) -------");
	xlog( $mail["head"][$i]['fromaddress'] );
	xlog("");

	$obj->fromaddress = $mail["head"][$i]['fromaddress'];


	// ***************************
	// subject : 件名
	// ***************************
	xlog("■■■ subject (decode 前) -------");
	xlog( $mail_head->subject );

	// ***************************
	// ASCII と それ以外で分解
	// ***************************
	$subject = imap_mime_header_decode( $mail_head->subject );
	xlog("■■■ subject (decode 後) -------");
	xlog( print_r( $subject, true ) );

	$mail["head"][$i]["subject"] = "";
	foreach( $subject as $key => $value ) {
		if( $value->charset != 'default' ) {
			$mail["head"][$i]['subject'] .= mb_convert_encoding($value->text,'UTF-8',$value->charset);
		}
		else{
			$mail["head"][$i]['subject'] .= $value->text;
		}
	}
	xlog("■■■ subject (編集後) -------");
	xlog( $mail["head"][$i]['subject'] );
	xlog("");

	$obj->subject = $mail["head"][$i]['subject'];


	// ***************************
	// 受信日時
	// ***************************
	$data = $mail["head"][$i]['date'] = $mail_head->date;
	$data = $mail["head"][$i]['date_normal'] = date('Y-m-d H:i:s', strtotime($data));

	// ***************************
	// サイズ
	// ***************************
	$data = $mail["head"][$i]['size'] = $mail_head->Size;

	$mail["head"][$i]["mail_head"] = $mail_head;

	$json[] = $obj;

}

xlog("■■■ 編集後データの一覧 -------");
xlog( print_r( $mail["head"], true ) );


// ***************************
// IMAP 接続解除
// ***************************
imap_close($con);

print json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );

// ***************************
// ログ出力
// ***************************
function xlog($message) {
	file_put_contents("debug.log", "{$message}\n" , FILE_APPEND );
}
?>




【PHP + 通信の最新記事】
posted by lightbox at 2018-10-17 10:17 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり