<?php //メール送受信&文字コードライブラリー require_once('/opt/lampp/lib/php/Net/POP3.php'); // PEAR Net_POP3(lamppの場合) require_once('/opt/lampp/lib/php/Mail/mimeDecode.php'); // PEAR MimeDecode(lamppの場合) //ダウンロードした場合は、配置した絶対パスにて指定ください。 //------------------------------------------------------------------------------- //変数・定数(メールアカウント) //------------------------------------------------------------------------------- $mail_host = 'smtp.office365.com'; //利用している送信サーバを指定 $port = "995"; //ポート番号(メールサーバの仕様に合わせて設定) $user = 'test@sample.jp'; //認証ユーザアドレス $pass = '*********'; //認証ユーザパスワード $from = 'test@sample.jp'; //送信元メールアドレス $pop = new Net_POP3(); //------------------------------------------------------------------------------- //処理開始 //------------------------------------------------------------------------------- //メールサーバ接続処理 if ($pop->connect($host, $port) !== TRUE) { echo "接続失敗"; exit; }else{ //echo "接続OK
"; } //APOP → POP3においてパスワードの送信を暗号化して安全性を高める方式 if($pop->login($user, $pass,'APOP') !== TRUE) { $pop->disconnect(); //メールサーバ切断 echo 'ログイン失敗。
'; exit; } else { $mail_count = $pop->numMsg(); //総メール件数取得 $mailID_end = $mail_count; //取得する最終件数を指定 } //次に続く
//前からの続き for ($loop = $mailID_start; $loop <= $mailID_end; $loop++) { $messages = (); //メールボックスのメッセージの一覧を取得し、UIDLを取得 $UIDL = $messages['uidl']; //取得したUIDLが読込済UIDLに存在するか確認 if(empty($UIDL)){ $UIDL = $pop->_maildrop; $UIDL = $UIDL['num_msg']; } // データを取得したら削除マーク(実際の削除は $pop->disconnect(); ) //$pop->deleteMsg($i); //受信時にメール削除(本件はしない設定) //Decode(コード変換) $decoder = new Mail_mimeDecode($pop->getMsg($loop)); $params['include_bodies'] = true; //ボディを解析する $params['decode_bodies'] = true; //ボディをコード変換する $params['decode_headers'] = true; //ヘッダをコード変換する $structure = $decoder->decode($params); $parts = $structure->parts; //添付ファイル有無をチェック $file = null; if(!empty($parts)){ $file = '1'; } //ヘッダ情報取得 $header_list = $pop->getParsedHeaders($loop); $mailAddress = mb_decode_mimeheader($header_list['From']); //差出人 $mailTo = mb_decode_mimeheader($header_list['To']); //宛先 $mailCC = mb_decode_mimeheader($header_list['CC']); //CC $mailSubject = mb_decode_mimeheader($header_list['Subject']); //件名 $mailDate = mb_decode_mimeheader($header_list['Date']); //差出日時 $mailDate = str_replace('(GMT+09:00)','',$mailDate); //(GMT+09:00)があると変換されないため削除 $mailDate = date('Y-m-d H:i:s', strtotime($mailDate)); //日時変換 //次に続く
//前からの続き //ヘッダーよりcharset取得 $mailCharset = mb_decode_mimeheader($header_list['Content-Type']); //Content-Type $intPosition = strpos($mailCharset, "charset="); //"charset="の開始位置取得 //'Content-Type'にcharsetが含まれている場合、文字コード取得 if ($intPosition === false) { $mailCharset = null; } else { $getDidit = strlen($mailCharset) - $intPosition - strlen("charset=") - 2; //取得文字列長 $mailCharset = substr($mailCharset, $intPosition + strlen("charset=") + 1 , $getDidit); //charset=以降の文字列で"以外の部分を取得 } //本文データ分解と取り出し $mailCharset = mb_decode_mimeheader($header_list['Content-Type']); //メールのパートごとにContent-Typeをチェックし、text/plainだったらそのまま出力 //Content-Typeがtextもしくはmultipart判定 if ("text" == $structure->ctype_primary) { $body = $structure->body; //Content-Typeがmultipartの場合、さらに各パートの内容を確認 } elseif ("multipart" == $structure->ctype_primary) { foreach ($structure->parts as ) { switch (strtolower($part->ctype_primary)) { case "text": //text時bodyを取得 $mailCharset = $part->ctype_parameters; //charsetの抽出 $mailCharset = $mailCharset['charset']; $body = $part->body; //bodyの抽出 break; case "multipart"; //multipart時、構造のpartを取得 foreach ($part->parts as $part2) { if("text" == $part2->ctype_primary) { //text時bodyを取得 $mailCharset = $part2->ctype_parameters; //charsetの抽出 $mailCharset = $mailCharset['charset']; $body = $part2->body; //bodyの抽出 break; } } break; } } } else { $body = ""; } //charsetが取得できた場合、エンコーディング if (strlen($mailCharset)) { $mailCharset = strtolower($mailCharset); if(preg_match('/2022/',$mailCharset)){ //バグか?「so-2022-j」→「SO-2022-J」に補正 $mailCharset = 'iso-2022-jp'; } if(preg_match('/tf-/',$mailCharset)){ //バグか?「TF-」→ 「utf-8」あり補正 $mailCharset = 'utf-8'; } }else{ $mailCharset = 'iso-2022-jp'; } $body = mb_convert_encoding($body, 'utf-8', $mailCharset); //文字コード変換 $body = str_replace('¥t','', $body); $body = strip_tags($body); } ?> //終わり
$path= "/保存先のパスを記載/"; $n = count($parts); //マルチパート数 for ($i = 0; $i < $n; $i++) { //マルチパート取得ループ $arval = $parts[$i]; if (array_key_exists("content-disposition", $arval->headers)) { $fileName = ["content-disposition"]; //headers["content-disposition"]取得 $file_chk = strpos($fileName, "filename=\""); //filename=があるかで添付ファイル有無判定 if ($file_chk !== false) { $fileName = mb_convert_encoding($fileName, 'utf-8', $mailCharset); //文字コード変換 $fileName = explode("\"",$fileName); //ファイル名のみ取り出し $fileName = $path.'/'.$fileName[1]; //保存先を指定 file_put_contents($fileName, $arval->body); //ファイルを書き出し } } }
//Content-Typeがtextもしくはmultipart判定 if ("text" == $structure->ctype_primary) { //textは添付ファイルなし $body = $structure->body; //Content-Typeがmultipartの場合、さらに各パートの内容を確認 } elseif ("multipart" == $structure->ctype_primary) { foreach ($structure->parts as $part) { switch ($part->ctype_primary) { case "text": //textがあるのでbodyを取得 $body_msg = $part->body; //bodyの抽出 $body_msg = mb_convert_encoding($body_msg, 'utf-8', $mailCharset); //文字コード変換 $body_msg = strip_tags($body_msg); //HTMLタグの除去 break; case "message": //messageがあるのでbodyを取得 foreach ($part->parts as $part2) { $body_msg = $part2->body; //bodyの抽出 $body_msg = mb_convert_encoding($body_msg, 'utf-8', $mailCharset); //文字コード変換 $body_msg = strip_tags($body_msg); //HTMLタグの除去 break; } } } }