本文は、マルチパートや添付ファイルなので、頭を切り替えて考える必要があります。とりあえずいろんなメールアカウントから、さくらインターネットのメールに転送してテストしました。 結果はすべて debug.log へ出力します。 データ取得後の管理の為、UID を取得して付加しています。 ▼ PHP マニュアルより imap_uidUID はユニークな 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 + 通信の最新記事】
- fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信
- PHP の cURL でファイルアップロード
- PHP : WEB でもコマンドラインでも HTTP でファイルをダウンロードする 『fget.php』
- PHP : cURL : Google Photo API の albums.list メソッドを使用して アルバム一覧データを取得する
- PHP + cURL で Google Photo API の アクセストークンを取得する
- PHP : cURL で FTP + SSL ダウンロード
- PHP の imap 関数で( Windows ローカル )、Yahoo メールのメールをさくらインターネットのメールへコピーする
- PHP の imap 関数( Windows のローカル )で、さくらインターネットのメールボックスの情報を取得する
- ファイルを一つアップロード : FORM の target を IFRAME にして、PHP に JavaScript を書き出させて元のページにメッセージを表示させる
- Pear の Net_POP3 で、SSL(995) を使って簡単にメール受信
- PHP をコマンドプロンプトから実行して、WEB 上のデータを取得するいくつかの方法
- FormData を使用して $.ajax で送信すると、ファイルのアップロードとメール送信(ファイル添付)を一度に行えます
- ファイルのアップロードからそれを添付してメールを送るテンプレート(スケルトン)
- PHP : mb_send_mail を使用した自家用メール送信 API
- PHP で Windows標準のオブジェクト(CDO.Message)とGMail を使ってメール送信
- PHP : http 経由でファイルのサイズを取得する file_size 関数と ファイルサイズを付加した get_imagesize 関数
- 連想配列のキー部分がプロパティと一致したらセットする( メール送信用クラス )
- PHP : リモートのファイルサイズを取得する
- ローカルの PHP を使ってコマンドプロンプトより簡単にバイナリファイルをアップロードする
- PHP の cURL で ftp サーバーにファイルをアップロードする(SSLなし)