この記事では、PHP で IMAP を使用してメールの送受信、メールの削除、添付ファイルのダウンロードを行う例を紹介します。
PHP の Imap インスタンスの完全なコードは次のとおりです。 コードをコピー コード例:* @version $$Id: Email.php 175 2011-03-26 09:52:16Z chen.qiao $$ * @copyright Copyright (c) 2011 jbxue Inc. China (http://bbs.it-home.org) */ /***メールクラス
*
* メール総数の取得、メール一覧の取得、メール内容の取得、メール添付ファイルの取得
*
※例として、指定したメールリストを取得したい場合。
* /*** クラスの __construct*/ パブリック関数 __construct() { $this->_contentType = array( 'ez' => 'application/andrew-inset','hqx' => 'application/mac-binhex40', 'cpt' => 'application/mac-compactpro','doc' => 'application/msword', 'bin' => 'アプリケーション/オクテットストリーム','dms' => 'アプリケーション/オクテットストリーム', 'lha' => 'アプリケーション/オクテットストリーム','lzh' => 'アプリケーション/オクテットストリーム', 'exe' => 'アプリケーション/オクテットストリーム','クラス' => 'アプリケーション/オクテットストリーム', 'so' => 'アプリケーション/オクテットストリーム','dll' => 'アプリケーション/オクテットストリーム', 'oda' => 'アプリケーション/oda','pdf' => 'アプリケーション/pdf', 'ai' => 'アプリケーション/ポストスクリプト','eps' => 'アプリケーション/ポストスクリプト', 'ps' => 'アプリケーション/ポストスクリプト'、'smi' => 'アプリケーション/smil'、 'smil' => 'アプリケーション/smil','mif' => 'アプリケーション/vnd.mif', 'xls' => 'application/vnd.ms-excel','ppt' => 'application/vnd.ms-powerpoint', 'wbxml' => 'アプリケーション/vnd.wap.wbxml','wmlc' => 'アプリケーション/vnd.wap.wmlc', 'wmlsc' => 'アプリケーション/vnd.wap.wmlscriptc','bcpio' => 'アプリケーション/x-bcpio', 'vcd' => 'application/x-cdlink','pgn' => 'application/x-chess-pgn', 'cpio' => 'アプリケーション/x-cpio','csh' => 'アプリケーション/x-csh', 'dcr' => 'アプリケーション/x-director','dir' => 'アプリケーション/x-director', 'dxr' => 'アプリケーション/x-director','dvi' => 'アプリケーション/x-dvi', 'spl' => 'application/x-futuresplash','gtar' => 'application/x-gtar', 'hdf' => 'application/x-hdf','js' => 'application/x-javascript', 'skp' => 'アプリケーション/x-koan','skd' => 'アプリケーション/x-koan', 'skt' => 'アプリケーション/x-koan','skm' => 'アプリケーション/x-koan', 'latex' => 'application/x-latex','nc' => 'application/x-netcdf', 'cdf' => 'application/x-netcdf','sh' => 'application/x-sh', 'shar' => 'アプリケーション/x-shar','swf' => 'アプリケーション/x-shockwave-flash', 'sit' => 'application/x-stuffit','sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'アプリケーション/x-sv4crc','tar' => 'アプリケーション/x-tar', 'tcl' => 'アプリケーション/x-tcl','tex' => 'アプリケーション/x-tex', 'texinfo' => 'アプリケーション/x-texinfo','texi' => 'アプリケーション/x-texinfo', 't' => 'アプリケーション/x-troff','tr' => 'アプリケーション/x-troff', 'roff' => 'application/x-troff','man' => 'application/x-troff-man', 'me' => 'application/x-troff-me','ms' => 'application/x-troff-ms', 'ustar' => 'application/x-ustar','src' => 'application/x-wais-source', 'xhtml' => 'アプリケーション/xhtml+xml','xht' => 'アプリケーション/xhtml+xml', 'zip' => 'アプリケーション/zip','au' => 'オーディオ/ベーシック','snd' => 'オーディオ/ベーシック', 'mid' => 'オーディオ/MIDI','midi' => 'オーディオ/MIDI','kar' => 'オーディオ/MIDI', 'mpga' => 'オーディオ/mpeg'、'mp2' => 'オーディオ/mpeg'、'mp3' => 'オーディオ/mpeg'、 'aif' => 'audio/x-aiff','aiff' => 'audio/x-aiff','aifc' => 'audio/x-aiff', 'm3u' => 'audio/x-mpegurl','ram' => 'audio/x-pn-realaudio','rm' => 'audio/x-pn-realaudio', 'rpm' => 'audio/x-pn-realaudio-plugin','ra' => 'audio/x-realaudio', 'wav' => 'audio/x-wav','pdb' => 'chemical/x-pdb','xyz' => 'chemical/x-xyz', 'bmp' => 'image/bmp','gif' => 'image/gif','ief' => 'image/ief', 'jpeg' => '画像/jpeg','jpg' => '画像/jpeg','jpe' => '画像/jpeg', 'png' => '画像/png','tiff' => '画像/tiff','tif' => '画像/tiff', 'djvu' => 'image/vnd.djvu','djv' => 'image/vnd.djvu','wbmp' => 'image/vnd.wap.wbmp', 'ras' => 'image/x-cmu-raster','pnm' => 'image/x-portable-anymap', 'pbm' => 'image/x-portable-bitmap','pgm' => 'image/x-portable-graymap', 'ppm' => 'image/x-portable-pixmap','rgb' => 'image/x-rgb','xbm' => 'image/x-xbitmap', 'xpm' => 'image/x-xpixmap','xwd' => 'image/x-xwindowdump','igs' => 'model/iges', 'iges' => 'モデル/iges','msh' => 'モデル/メッシュ','メッシュ' => 'モデル/メッシュ', 'サイロ' => 'モデル/メッシュ','wrl' => 'モデル/vrml','vrml' => 'モデル/vrml', 'css' => 'text/css','html' => 'text/html','htm' => 'text/html', 'asc' => 'テキスト/プレーン','txt' => 'テキスト/プレーン','rtx' => 'テキスト/リッチテキスト', 'rtf' => 'text/rtf','sgml' => 'text/sgml','sgm' => 'text/sgml', 'tsv' => 'テキスト/タブ区切り値','wml' => 'テキスト/vnd.wap.wml', 'wmls' => 'text/vnd.wap.wmlscript','etx' => 'text/x-setext', 'xsl' => 'text/xml','xml' => 'text/xml','mpeg' => 'video/mpeg', 'mpg' => 'ビデオ/mpeg','mpe' => 'ビデオ/mpeg','qt' => 'ビデオ/クイックタイム', 'mov' => 'video/quicktime'、'mxu' => 'video/vnd.mpegurl'、'avi' => 'video/x-msvideo'、 'movie' => 'video/x-sgi-movie','ice' => 'x-conference/x-cooltalk', 'rar' => 'application/x-rar-compressed','zip' => 'application/x-zip-compressed', '*'=> 'アプリケーション/オクテットストリーム','docx' => 'アプリケーション/msword' ); }/*** メールボックスへの IMAP ストリームを開きます * * @パラメータ文字列 $host * @param 文字列 $port * @param 文字列 $user * @param 文字列 $pass * @param string $folder * @パラメータ文字列$ssl * @param string $pop * @return resource|bool*/ public function mailConnect($host,$port,$user,$pass,$folder="INBOX",$ssl,$pop=false) { if($pop){ $ssl = $pop.'/'.$ssl.'/novalidate-cert/notls'; } $this->_connect = imap_open("{"."$host:$port/$ssl"."}$folder",$user,$pass); if(!$this->_connect) { jbxue_Application::getSession()->addError('接続できません: ' . imap_last_error()); false を返します。 } $this->_connect を返す; } /*** 現在のメールボックスに関する情報を取得します * * @return オブジェクト|ブール*/ パブリック関数 mailInfo(){ $this->_mailInfo = imap_mailboxmsginfo($this->_connection); if(!$this->_mailInfo) { echo "メール情報の取得に失敗しました: " 。 imap_last_error(); false を返します。 } $this->_mailInfo を返します; } /*** 指定されたメッセージのヘッダーにある情報の概要を読みます * * @パラメータ文字列$msgRange * @return 配列*/ パブリック関数 mailList($msgRange='') { if ($msgRange) { $range=$msgRange; } それ以外 { $this->mailTotalCount(); $range = "1:".$this->_totalCount; } $overview = imap_fetch_overview($this->_connect,$range); foreach ($overview as $val) { $mailList[$val->msgno]=(配列)$val; } $mailList を返します。 } /*** 現在のメールボックスの合計数を取得します * * @return int*/ パブリック関数 mailTotalCount(){ $check = imap_check($this->_connect); $this->_totalCount = $check->Nmsgs; $this->_totalCount を返します。 } /*** メッセージのヘッダーを読んでください * * @パラメータ文字列 $msgCount * @return 配列*/ パブリック関数 mailHeader($msgCount) { $mailHeader = array(); $header=imap_header($this->_connect,$msgCount); $sender=$header->from[0]; $replyTo=$header->reply_to[0]; if(strto lower($sender->mailbox)!='mailer-daemon' && strto lower($sender->mailbox)!='postmaster') { $subject = $this->subjectDecode($header->subject); $mailHeader = 配列( 'from'=>strto lower($sender->mailbox).'@'.$sender->host, 'fromName'=>$sender->個人、 'toOther'=>strto lower($replyTo->mailbox).'@'.$replyTo->host, 'toOtherName'=>$replyTo->個人、 '件名'=>$件名、 'to'=>strto lower($header->toaddress), '日付'=>$header->日付、 'id'=>$header->Msgno、 'seen'=>$header->Unseen ); } $mailHeader を返します。 } /*** 中国語の件名をデコードします * * @param string $subject * @return スティング*/ パブリック関数 subjectDecode($subject) { $beginStr = substr($subject, 0, 5); if($beginStr == '=?ISO') { $separator = '=?ISO-2022-JP'; $toEncoding = 'ISO-2022-JP'; } それ以外 { $separator = '=?GB2312'; $toEncoding = 'GB2312'; } $encode = strstr($subject, $separator); if ($encode) { $explodeArr =explode($separator, $subject); $length = count($explodeArr); $subjectArr = 配列(); for($i = 0; $i 0) { if ($begin > 0) { $beginStr = substr($subSubject, 0, $begin); } if ((strlen($subSubject) - $end) > 2) { $endStr = substr($subSubject, $end + 2, strlen($subSubject) - $end - 2); } $str = substr($subSubject, 0, $end - strlen($subSubject)); $pos = strrpos($str, "?"); $str = substr($str, $pos + 1, strlen($str) - $pos); $subSubject = $beginStr 。 imap_base64($str) 。 $endStr; $subSubjectArr[] = iconv ( $toEncoding, 'utf-8', $subSubject ); // mb_convert_encoding($subSubject, 'utf-8' ,'gb2312,ISO-2022-JP'); } } $subject = implode('', $subjectArr); } $subject を返します。 } /*** 現在のメールボックスから削除するメッセージをマークします * * @パラメータ文字列 $msgCount*/ パブリック関数 mailDelete($msgCount) { imap_delete($this->_connect,$msgCount); } /*** メッセージの添付ファイルを取得する * * @パラメータ文字列 $msgCount * @param 文字列 $path * @return 配列*/ パブリック関数 getAttach($msgCount,$path) { $struckture = imap_fetchstructure($this->_connect,$msgCount); $attach = 配列(); if($構造->部品) { foreach($structure->parts as $key => $value) { $encoding=$構造->部品[$key]->エンコーディング; if($structure->parts[$key]->ifdparameters) { $name=$構造->部品[$key]->dパラメータ[0]->値; $message = imap_fetchbody($this->_connect,$msgCount,$key+1); if ($encoding == 0) { $message = imap_8bit($message); }else if ($encoding == 1){ $message = imap_8bit ($message); } else if ($encoding == 2) { $message = imap_binary ($message); } else if ($encoding == 3) { $message = imap_base64 ($message); } else if ($encoding == 4) { $message = quote_printable_decode($message); } $this->downAttach($path,$name,$message);; $attach[] = $name; } if($構造->部品[$キー]->部品) { foreach($struckture->parts[$key]->$keyb としてのパーツ => $valueb) { $encoding=$構造->部品[$key]->部品[$keyb]->エンコーディング; if($struckture->parts[$key]->parts[$keyb]->ifdparameters){ $name=$構造->部品[$key]->部品[$keyb]->dparameters[0]->値; $partnro = ($key+1).".".($keyb+1); $message = imap_fetchbody($this->_connect,$msgCount,$partnro); if ($encoding == 0) { $message = imap_8bit($message); } else if ($encoding == 1) { $message = imap_8bit ($message); } else if ($encoding == 2) { $message = imap_binary ($message); } else if ($encoding == 3) { $message = imap_base64 ($message); } else if ($encoding == 4) { $message = quote_printable_decode($message); } $this->downAttach($path,$name,$message); $attach[] = $name; } } } } } $attach を返す; } /*** メールの添付ファイルをローカルホストにダウンロード * * @param string $filePath * @param string $message * @param 文字列 $name*/ public function downAttach($filePath,$name,$message) { if(is_dir($filePath)) { $fileOpen = fopen($filePath.$name,"w"); } それ以外 { mkdir($filePath); } fwrite($fileOpen,$message); fclose($fileOpen); } /*** 添付リンクをクリックして添付ファイルをダウンロードします * * @パラメータ文字列$id*/ パブリック関数 getAttachData($id,$filePath,$fileName) { $nameArr =explode('.',$fileName); $length = count($nameArr); $contentType = $this->_contentType[$nameArr[$length-1]]; if(!$contentType) { $contentType = $this->_contentType['*']; } $filePath = チョップ($filePath); if($filePath != ''){ if(substr($filePath,strlen($filePath)-1,strlen($filePath)) != '/') { $filePath .= '/'; } $filePath .= $fileName; } それ以外 { $ファイルパス = $ファイル名; } if(!file_exists($filePath)){ echo 'ファイルは存在しません'; false を返します。 } $fileSize = ファイルサイズ($filePath); header("コンテンツタイプ: ".$contentType); header("Accept-Range : byte "); header("Accept-Length: $fileSize"); header("Content-Disposition:attachment; filename=".$fileName); $fileOpen= fopen($filePath,"r"); $bufferSize = 1024; $curPos = 0; while(!feof($fileOpen)&&$fileSize-$curPos>$bufferSize) { $buffer = fread($fileOpen,$bufferSize); エコー$バッファ; $curPos += $bufferSize; } $buffer = fread($fileOpen,$fileSize-$curPos); エコー$バッファ; fclose($fileOpen); true を返します。 } /*** メッセージの本文を取得します * * @パラメータ文字列 $msgCount * @戻り文字列*/ パブリック関数 getBody($msgCount) { $body = $this->getPart($msgCount, "TEXT/HTML"); if ($body == '') { $body = $this->getPart($msgCount, "TEXT/PLAIN"); } if ($body == '') { 戻る ''; } $body を返します。 } /*** 特定のメッセージの構造を読み取り、特定のメッセージを取得します * メッセージ本文のセクション * * @パラメータ文字列 $msgCount * @param 文字列 $mimeType * @param オブジェクト $struct * @param string $partNumber * @return 文字列|ブール*/ プライベート関数 getPart($msgCount, $mimeType, $structural = false, $partNumber = false) { if(!$構造) { $struct = imap_fetchstruct($this->_connect, $msgCount); } if($構造) { if($mimeType == $this->getMimeType($structural)) { if(!$partNumber) { $partNumber = "1"; } $fromEncoding = $構造->パラメータ[0]->値; $text = imap_fetchbody($this->_connect, $msgCount, $partNumber); if($構造->エンコーディング == 3) { $text = imap_base64($text); } else if($structural->encoding == 4) { $text = imap_qprint($text); } $text = mb_convert_encoding($text,'utf-8',$fromEncoding); $text を返します。 } if($構造->タイプ == 1) { while(list($index, $subStructure) = each($ Structure->parts)) { if($partNumber) { $prefix = $partNumber 。 「。」; } $data = $this->getPart($msgCount, $mimeType, $subStructure, $prefix . ($index + 1)); if($data){ $data を返します。 } } } } false を返します。 } /*** メッセージ構造のサブタイプとタイプを取得します * * @param オブジェクト $struct*/ プライベート関数 getMimeType($struction) { $mimeType = array("テキスト", "マルチパート", "メッセージ", "アプリケーション", "音声", "画像", "ビデオ", "その他"); if($構造->サブタイプ) { $mimeType[(int) $ Structure->type] を返します。 '/' 。 $構造->サブタイプ; } "テキスト/プレーン" を返します。 } /*** メッセージを未読から既読に変更します * * @パラメータ文字列 $msgCount * @return bool*/ パブリック関数 mailRead($msgCount) { $status = imap_setflag_full($this->_connect, $msgCount , "//Seen"); $statusを返します。 } /*** IMAP ストリームを閉じる*/ パブリック関数 closeMail() { imap_close($this->_connect,CL_EXPUNGE); } } ?> 2、调用例及び说説明 1)、入手アイテム一覧表 リーリー2)、获得邮件正文 リーリー3)、添付ファイルをダウンロード りー |