前回は PHPでドコモメールへSMTP接続してメール送信する 方法について解説しました。
今回はドコモメールへIMAP接続してメールを受信する方法について解説します。
// ドコモメール受信サーバー接続・認証 function imapauth($imaphost,$docomoid,$password,$port,&$msg){ $msg = "connection error"; $ip = gethostbyname($imaphost); if(@$sock=fsockopen("ssl://{$ip}",$port,$errno,$msg)){ $msg = fgets($sock); if(strpos($msg,"OK")===false){ fclose($sock); return false; } fputs($sock,"? login {$docomoid} {$password}\r\n"); $msg = fgets($sock); if(strpos($msg,"OK")===false){ fclose($sock); return false; } return $sock; }else{ return false; } }
pear の mimeDecode を利用します。下記リンクよりダウンロードしてサーバーへ設置してください。
Mail_MimeDecode
※MimeDecode はメールデータをヘッダやボディ、件名や送信者や受信者などの情報に分解するのに便利です。
下記の文字列を必要に応じて変更してください。
// ドコモメール受信サーバー接続・認証 if(!$sock=imapauth("imap.spmode.ne.jp","docomoid@docomo.ne.jp","password",993,$msg)){ mb_send_mail("returnpath@systemexpress.co.jp","imapauthfailed",$msg); } // メールボックスの選択 fputs($sock,"? select inbox\r\n"); while($msg=fgets($sock)){ if(strpos($msg,"? OK")!==false) break; } // 未読を検索 $list = array(); fputs($sock,"? search unseen\r\n"); while($msg=fgets($sock)){ if(stripos($msg,"search")!==false) $list = explode(" ",trim($msg)); if(strpos($msg,"? OK")!==false) break; } // 未読がなければ終了 if(!count($list)) exit; // pear mimeDecode の呼び出し include_once("pear/mimeDecode.php"); // 未読のメールを全て分析&処理 foreach($list as $val){ if(!is_numeric($val)) continue; // 受信日取得 fputs($sock,"? fetch {$val} internaldate\r\n"); $internaldate = ""; while($msg=fgets($sock)){ if(strpos($msg,"? OK")!==false) break; $internaldate .= $msg; } $recieveddate = preg_match("/\"(.*?)\"/s",$internaldate,$match) ? date("Y-m-d H:i:s",strtotime($match[1])) : date("Y-m-d H:i:s") ; // メールデータ取得 fputs($sock,"? fetch {$val} body[]\r\n"); $data = ""; while($msg=fgets($sock)){ if(strpos($msg,"FETCH (")!==false) continue; if(strpos($msg,"FLAGS (")!==false) continue; if(strpos($msg,"? OK")!==false) break; $data .= $msg; } // pear mimeDecode を使ってメールの構造を取得 $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['input'] = $data; $params['crlf'] = "\r\n"; $structure = Mail_mimeDecode::decode($params); // 送信元アドレスを取得 $from = $structure->headers['from']; $from = mb_convert_encoding($from,"utf-8",mb_detect_encoding($from)); $from = addslashes($from); $from = str_replace('"','',$from); preg_match('/[0-9a-zA-Z_\.\-]+@[0-9a-zA-Z_\.\-]+/',$from,$str); $from = $str[0]; // 送信先アドレスの取得 $to = $structure->headers['to']; $to = mb_convert_encoding($to,"utf-8",mb_detect_encoding($to)); $to = addslashes($to); $to = str_replace('"','',$to); preg_match('/[0-9a-zA-Z_\.\-]+@[0-9a-zA-Z_\.\-]+/',$to,$str); $to = $str[0]; // メール件名の取得 $subject = $structure->headers['subject']; $subject = mb_convert_encoding($subject,"utf-8",mb_detect_encoding($subject)); // メール本文と添付ファイルの取得 $attachment = array(); $i = 1; switch(strtolower($structure->ctype_primary)){ // シングルパート(本文のみ) case "text": $text = $structure->body; break; // マルチパート case "multipart": foreach($structure->parts as $part){ $ctype_primary = strtolower($part->ctype_primary); $ctype_secondary = strtolower($part->ctype_secondary); // 本文 if($ctype_primary=="text"){ $text = $part->body; // 画像またはPDF }elseif($ctype_primary=="image" or ($ctype_primary=="application" and $ctype_secondary=="pdf")){ $attachment[$i]['mimetype'] = "{$ctype_primary}/{$ctype_secondary}"; $attachment[$i]['filename'] = mb_convert_encoding($part->ctype_parameters['name'],"utf-8",mb_detect_encoding($part->ctype_parameters['name'])); $attachment[$i]['binary'] = $part->body; $i++; } } break; default: $text = ""; } $text = mb_convert_encoding($text,"utf-8",mb_detect_encoding($text)); $text = trim($text); // メールを既読にする fputs($sock,"? store {$val} flags (\seen)\r\n"); $msg = fgets($sock); /* これらの情報をDBに記録するなどの処理を記述してください。 受信日:$reciveddate 送信元:$from 送信先:$to 件名:$subject 本文:$text 添付ファイル形式:$attachment[$i]['mimetype'] 添付ファイル名:$attachment[$i]['filename'] 添付ファイルデータ:$attachment[$i]['binary'] */ } fputs($sock,"? logout\r\n"); $msg = fgets($sock);
Copyright(C) systemexpress.co.jp All Rights Reserved. Author Takayuki Yukawa