网站首页 文章专栏 php 获取QQ邮箱最新32条邮件
该方法需要安装php imap 扩展
根据自己的需要,改成自己想要的程序
public function showemail(){ error_reporting(0); //屏蔽掉腾讯返回的一些注意事项 @header('Content-type: text/html;charset=UTF-8'); ignore_user_abort(); set_time_limit(0); $fileSavePaht = '附件存储地址'; $obj = new Receivemail('QQ号', '邮箱密码不是QQ密码', QQ邮箱地址', 'imap.qq.com', 'imap', '993', false); $obj->connect(); $tot = $obj->getTotalMails(); //总邮件数量,目前只返回32条数据 for ($i = $tot; $i > 0; $i--) { $data=[]; $head = $obj->getHeaders($i); // 建议打印下这个,自己选择自己需要的 $data['title']=iconv_mime_decode($head['subject']); //标题 $data['From']=iconv_mime_decode($head['toNameOth']); //发件人 $data['FromName']=iconv_mime_decode($head['FromName']); $data['date']=date('Y-m-d H:i:s',($head['udate'])); //时间 $str = $obj->GetAttach($i, $fileSavePaht); $ar = explode(",", $str); $attach=[]; foreach ($ar as $key => $value) $attach[]=($value == "") ? "" : "Atteched File :: " . $value; $data['content']=$obj->getBody($i); //内容 $data['attach']=$attach; //附件信息 $obj->removeEamil($i); $arr[]=$data; } $obj->close_mailbox(); return $arr; }
附注:
Receivemail类:
<?php class Receivemail { private $server = ''; private $username = ''; private $password = ''; private $marubox = ''; private $email = ''; public function __construct($username, $password, $EmailAddress, $mailserver = 'localhost', $servertype = 'pop', $port = '110', $ssl = false) { if ($servertype == 'imap') { if ($port == '') $port = '143'; $strConnect = '{' . $mailserver . ':' . $port . '/imap/ssl}INBOX'; } else { $strConnect = '{' . $mailserver . ':' . $port . '/pop3' . ($ssl ? "/ssl" : "") . '}INBOX'; } $this->server = $strConnect; $this->username = $username; $this->password = $password; $this->email = $EmailAddress; } public function connect() { $this->marubox = @imap_open($this->server, $this->username, $this->password); if (!$this->marubox) { echo "Error: Connecting to mail server"; exit; } } public function listMessages($page = 1, $per_page = 25, $sort = null) { $limit = ($per_page * $page); $start = ($limit - $per_page) + 1; $start = ($start < 1) ? 1 : $start; $limit = (($limit - $start) != ($per_page - 1)) ? ($start + ($per_page - 1)) : $limit; $info = imap_check($this->marubox); $limit = ($info->Nmsgs < $limit) ? $info->Nmsgs : $limit; if (true === is_array($sort)) { $sorting = array( 'direction' => array('asc' => 0, 'desc' => 1), 'by' => array('date' => SORTDATE, 'arrival' => SORTARRIVAL, 'from' => SORTFROM, 'subject' => SORTSUBJECT, 'size' => SORTSIZE)); $by = (true === is_int($by = $sorting['by'][$sort[0]])) ? $by : $sorting['by']['date']; $direction = (true === is_int($direction = $sorting['direction'][$sort[1]])) ? $direction : $sorting['direction']['desc']; $sorted = imap_sort($this->marubox, $by, $direction); $msgs = array_chunk($sorted, $per_page); $msgs = $msgs[$page - 1]; } else { $msgs = range($start, $limit); //just to keep it consistent } $result = imap_fetch_overview($this->marubox, implode($msgs, ','), 0); if (false === is_array($result)) return false; foreach ($result as $k => $r) { $result[$k]->subject = $this->_imap_utf8($r->subject); $result[$k]->from = $this->_imap_utf8($r->from); $result[$k]->to = $this->_imap_utf8($r->to); $result[$k]->body = $this->getBody($r->msgno); } if (true === is_array($sorted)) { $tmp_result = array(); foreach ($result as $r) { $tmp_result[$r->msgno] = $r; } $result = array(); foreach ($msgs as $msgno) { $result[] = $tmp_result[$msgno]; } } $return = array('res' => $result, 'start' => $start, 'limit' => $limit, 'sorting' => array('by' => $sort[0], 'direction' => $sort[1]), 'total' => imap_num_msg($this->marubox)); $return['pages'] = ceil($return['total'] / $per_page); return $return; } public function getHeaders($mid) { if (!$this->marubox) return false; $mail_header = imap_header($this->marubox, $mid); $sender = $mail_header->from[0]; $sender_replyto = $mail_header->reply_to[0]; $sender_replyto = $mail_header->reply_to[0]; if (strtolower($sender->mailbox) != 'mailer-daemon' && strtolower($sender->mailbox) != 'postmaster') { $mail_details = array( 'from' => strtolower($sender->mailbox) . '@' . $sender->host, 'fromName' => $sender->personal, 'toOth' => strtolower($sender_replyto->mailbox) . '@' . $sender_replyto->host, 'toNameOth' => $sender_replyto->personal, 'subject' => $mail_header->subject, 'to' => strtolower($mail_header->toaddress), 'udate' => strtolower($mail_header->udate) ); } return $mail_details; } public function get_mime_type(&$structure) { //Get Mime type Internal Private Use $primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"); if ($structure->subtype) { return $primary_mime_type[(int) $structure->type] . '/' . $structure->subtype; } return "TEXT/PLAIN"; } public function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) { //Get Part Of Message Internal Private Use if (!$structure) { $structure = imap_fetchstructure($stream, $msg_number); } if ($structure) { if ($mime_type == $this->get_mime_type($structure)) { if (!$part_number) { $part_number = "1"; } $text = imap_fetchbody($stream, $msg_number, $part_number); if ($structure->encoding == 3) { return imap_base64($text); } else if ($structure->encoding == 4) { return imap_qprint($text); } else { return $text; } } if ($structure->type == 1) /* multipart */ { foreach ($structure->parts as $index =>$sub_structure){ $prefix = ''; if ($part_number) { $prefix = $part_number . '.'; } $data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1)); if ($data) { return $data; } } } } return false; } public function getTotalMails() { if (!$this->marubox) return false; $headers = imap_headers($this->marubox); return count($headers); } public function GetAttach($mid, $path) { // Get Atteced File from Mail if (!$this->marubox) { return false; } $struckture = imap_fetchstructure($this->marubox, $mid); $ar = ""; if ($struckture->parts) { foreach ($struckture->parts as $key => $value) { $enc = $struckture->parts[$key]->encoding; if ($struckture->parts[$key]->subtype == 'OCTET-STREAM') { $name = base64_decode($struckture->parts[$key]->parameters[1]->value); $name = iconv("gbk", 'utf-8', $name); $name = substr($name, 7); // 未知原因 base64解密以后字符串前边多了三个 乱码字符 截取7以后的字符串 $message = imap_fetchbody($this->marubox, $mid, $key + 1); switch ($enc) { case 0: $message = imap_8bit($message); break; case 1: $message = imap_8bit($message); break; case 2: $message = imap_binary($message); break; case 3: $message = imap_base64($message); break; case 4: $message = quoted_printable_decode($message); break; case 5: $message = $message; break; } // 文件名转换 $name = explode('.', $name); $firs_name = urlencode($name[0]); $filename = $firs_name . '.' . $name[1]; $fp = fopen($path . $filename, "w"); //fopen 中文文件名 fwrite($fp, $message); fclose($fp); $ar = $ar . $filename . ","; } } } $ar = substr($ar, 0, (strlen($ar) - 1)); return $ar; } public function removeEamil($mid) { if (!$this->marubox) return false; imap_mail_move($this->marubox, $mid, '&UXZO1mWHTvZZOQ-/beifen'); } public function getBody($mid) { // Get Message Body if (!$this->marubox) { return false; } $body = $this->get_part($this->marubox, $mid, "TEXT/HTML"); if ($body == "") { $body = $this->get_part($this->marubox, $mid, "TEXT/PLAIN"); } if ($body == "") { return ""; } return $this->_iconv_utf8($body); } public function deleteMails($mid) { // Delete That Mail if (!$this->marubox) return false; imap_delete($this->marubox, $mid); } public function close_mailbox() { //Close Mail Box if (!$this->marubox) return false; imap_close($this->marubox, CL_EXPUNGE); } public function _imap_utf8($text) { if (preg_match('/=\?([a-zA-z0-9\-]+)\?(.*)\?=/i', $text, $match)) { $text = imap_utf8($text); if (strtolower(substr($match[1], 0, 2)) == 'gb') { $text = iconv('gbk', 'utf-8', $text); } return $text; } return $this->_iconv_utf8($text); } public function _iconv_utf8($text) { $text=preg_replace('#<!--[^\!\[]*?(?<!\/\/)-->#' , '' , $text); @ $s1 = iconv('gbk', 'utf-8', $text); $s0 = iconv('utf-8', 'gbk', $s1); if ($s0 == $text) { return $s1; } else { return $text; } } }
转载请注明出处