<?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;
}
}
}
}