第一种

<?phpnamespace App\Http\Controllers;use App\Http\Requests;
use App\Models\FundGatewayAccount;
use App\Models\FundGatewayOrder;
use Illuminate\Support\Facades\Cache;class EmailController extends Controller
{public function get_email(){$array_values['host'] = "pop.126.com";$array_values['port'] = 110;$array_values['user'] = '';$array_values['password'] = '';$array_values['checkmail'] = 'xxx@xxx.xxx';$this->ganji_get_test_mail($array_values);}function ganji_get_test_mail($array_values){$host = $array_values['host'];$port = $array_values['port'];$user = $array_values['user'];$password = $array_values['password'];$msg = '';$return_msg = '';// ini_set('memory_limit', '80M');if (!($sock = fsockopen(gethostbyname($host), $port, $errno, $errstr))) {exit($errno . ': ' . $errstr);}stream_set_blocking($sock, true);$command = "USER " . $user . "\r\n";fwrite($sock, $command);$msg = fgets($sock);$command = "PASS " . $password . "\r\n";fwrite($sock, $command);$msg = fgets($sock);$command = "stat\r\n";fwrite($sock, $command);$return_msg = fgets($sock);$msg = fgets($sock);$command = "LIST\r\n";fwrite($sock, $command);$all_mails = array();while (true) {$msg = fgets($sock);if (!preg_match('/^\+OK/', $msg) && !preg_match('/^\./', $msg)) {$msg = preg_replace('/\ .*\r\n/', '', $msg);array_push($all_mails, $msg);}if (preg_match('/^\./', $msg))break;}// 获取邮件列表$ganji_mails = array();foreach ($all_mails as $item) {fwrite($sock, "TOP $item 0\r\n");while (true) {$msg = fgets($sock);// echo $msg . "<Br><Br>";if (preg_match('/^\./', $msg)) {array_push($ganji_mails, $item);break;}}continue;}$mail_content = '';$array_ganji_mails = array();//逐行遍历foreach ($ganji_mails as $item) {fwrite($sock, "RETR $item\r\n");while (true) {$msg = fgets($sock);$mail_content .= $msg;if (preg_match('/^\./', $msg)) {array_push($array_ganji_mails, iconv_mime_decode_headers($mail_content, 0, "UTF-8"));$mail_content = '';break;}}}// 直接获取第一封邮件全部信息 9999长度fwrite($sock, "RETR 1\r\n");$mail_contents = fread($sock, 9999); // 直接获取全部echo "<br>";var_dump($mail_contents);exit;echo "<br>";$command = "QUIT\r\n";fwrite($sock, $command);$msg = fgets($sock);return $mail_contents;}
}

第二种

<?phpnamespace App\Http\Controllers;use App\Http\Requests;
use App\Models\FundGatewayAccount;
use App\Models\FundGatewayOrder;
use Illuminate\Support\Facades\Cache;class EmailController extends Controller
{public function get_email(){set_time_limit(0);
// gmail邮箱地址
//(注:也可以是托管在Google APP上的账号,实际也是gmail服务器负责提供邮件功能)$gmail_account = '';
// gmail邮箱密码$gmail_password = '';// gmail imap邮件服务器地址$gmail_imap_host = 'imap.googlemail.com';
// imap服务器端口$gmail_imap_post = 993;
// 根据以上参数,拼凑出imap服务器的完整地址$gmail_imap_server = '{imap.gmail.com:993/imap/ssl}INBOX';$mailbox_inbox = imap_open($gmail_imap_server, $gmail_account, $gmail_password);if ($mailbox_inbox) {$this->scan_mailbox($mailbox_inbox);imap_close($mailbox_inbox);}else{var_dump('登录失败');}}/*===========================示例1:gmail的中文目录编码与解码===========================(Gmail内部使用UTF7-IMAP编码,所以如果直接显示会乱码,需要进行转码才能正确显示)* *//*$imap_code = "&V4NXPpCuTvY-";echo "imap_code: $imap_code\n";$hanzi = mb_convert_encoding($imap_code, "UTF-8", "UTF7-IMAP");echo "中文名称 : $hanzi\n";$encode=  mb_convert_encoding($hanzi, "UTF7-IMAP","UTF-8");echo "encode : $encode\n";*//*===========================// 示例2: 列出所有的邮件Label(相当于邮箱的子目录)===========================**//*if (($mbox = @imap_open($gmail_imap_server, $gmail_account, $gmail_password)) == true) {$folders = imap_list($mbox, $gmail_imap_server, "*");foreach ($folders as $folder) {// Gmail邮箱目录采用的编码为"UTF7-IMAP",因此如果要正确显示中文目录名称,需要针对中文目录名称进行UTF-8转码// (反之,如果给出中文名字,需要访问gmail的目录,需要先执行UTF-8到UTF7-IMAP的逆向转码)$folder = mb_convert_encoding($folder, "UTF-8", "UTF7-IMAP");echo $folder . "\n";}// 关闭imap连接imap_close($mbox);}*//*===========================// 示例3:查看收件夹(INBOX)的所有邮件* *///根据获取到的内容 自行分析public function scan_mailbox($mbox){// 获取邮箱信息$mboxes = imap_mailboxmsginfo($mbox);// 查看是否有新邮件if ($mboxes->Nmsgs != 0) {var_dump('有新邮件');exit;for ($mailno = 1; $mailno <= $mboxes->Nmsgs; $mailno++) {// 获取邮件内容$email = $this->fetchEmail($mbox, $mailno);preg_match("|<s p a n style=\"color:#262626;font-size:22px\">(.*)<\/span>|sU", $email['htmlmsg'], $aFocuser);preg_match("|每天更新(.*)修改此快讯|sU", $email['htmlmsg'], $acontent);//采集图片empty($acontent) && preg_match("|实时更新(.*)修改此快讯|sU", $email['htmlmsg'], $acontent);preg_match_all("|<div>(.*)<\/div>|", $acontent[1], $aDiv);#preg_match_all("|<t d background=\"(.*)\" height=\"100\" width=\"100\"|sU",$acontent[1],$aImage);foreach ($aDiv[1] as $sHtml) {preg_match("|<span style=\"padding:0px 6px 0px 0px\">(.*)<\/span>|sU", $sHtml, $aTitle);preg_match("|href=\"(.*)\"|sU", $aTitle[1], $sTitleUrl);$lastTitleUrl = $sTitleUrl[1];$lastTitleUrl = str_replace('&amp;', '&', $lastTitleUrl);$ss = parse_url($lastTitleUrl);parse_str($ss['query'], $output);$lastTitle = strip_tags($aTitle[1]);preg_match("|<div style=\"padding:2px 0px 8px 0px\">(.*)<t able>|sU", $sHtml, $sTmp);$aCon = explode('</d i v>', $sTmp[1]);foreach ($aCon as &$valCon) {$valCon = strip_tags(str_replace(' ', '', $valCon));}$aCon = array_filter($aCon);$aList['article'][] = array('url' => $output['url'], 'title' => $lastTitle, 'cfrom' => $aCon[0], 'content' => $aCon[1]);}imap_delete($mbox, $mailno);}} else {var_dump('没有新邮件');}}/*** 获取一封邮件的信息* @param resource $imap_stream* @param int $msg_number*/public function fetchEmail($mbox, $mailno){// 获取邮件内容$email = array();// 获取Header信息$head = imap_header($mbox, $mailno);// 获取邮件的发件人地址$email['from_address'] = $head->from[0]->mailbox . '@' . $head->from[0]->host;// 初始化邮件主题变量$subject = null;if (!empty($head->subject)) {// 编码转换$mhead = imap_mime_header_decode($head->subject);foreach ($mhead as $key => $value) {if ($value->charset != 'default') {$subject .= mb_convert_encoding($value->text, 'UTF-8', $value->charset);} else {$subject .= $value->text;}}}$email['subject'] = $subject;global $charset, $htmlmsg, $plainmsg, $attachments;$htmlmsg = $plainmsg = $charset = '';$attachments = array();// BODY$s = imap_fetchstructure($mbox, $mailno);if (!$s->parts) {  // simple$this->getpart($mbox, $mailno, $s, 0);} else {  // multipart: cycle through each partforeach ($s->parts as $partno0 => $p)$this->getpart($mbox, $mailno, $p, $partno0 + 1);}$email['plainmsg'] = $plainmsg;$email['htmlmsg'] = $htmlmsg;$email['attachments'] = $attachments;return $email;}public function getpart($mbox, $mid, $p, $partno){// $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simpleglobal $htmlmsg, $plainmsg, $charset, $attachments;// DECODE DATA$data = ($partno) ? imap_fetchbody($mbox, $mid, $partno) : imap_body($mbox, $mid);  // simple// PARAMETERS// get all parameters, like charset, filenames of attachments, etc.$params = array();if ($p->parameters)foreach ($p->parameters as $x)$params[strtolower($x->attribute)] = $x->value;if (isset($p->dparameters))foreach ($p->dparameters as $x)$params[strtolower($x->attribute)] = $x->value;// ATTACHMENT// Any part with a filename is an attachment,// so an attached text file (type 0) is not mistaken as the message.if (isset($params['filename']) || isset($params['name'])) {$filename = ($params['filename']) ? $params['filename'] : $params['name'];$attachments[$filename] = $data;  // this is a problem if two files have same name}if ($p->type == 0 && !empty($data)) {$charset = $params['charset'];$encoding = $p->encoding;switch ($encoding) {case 0 :$data = mb_convert_encoding($data, "UTF-8", $charset);break;case 1 :$encode_data = imap_8bit($data);$encode_data = imap_qprint($encode_data);$data = mb_convert_encoding($encode_data, "UTF-8", $charset);break;case 3 :$encode_data = imap_base64($data);$data = mb_convert_encoding($encode_data, "UTF-8", $charset);break;case 4 :$encode_data = imap_qprint($data);$data = mb_convert_encoding($encode_data, 'UTF-8', $charset);break;case 2 :case 5 :default:break;}if (strtolower($p->subtype) == 'plain') {$plainmsg .= trim($data);} else {$htmlmsg .= $data;}}if ($p->type == 2 && $data) {$plainmsg .= $data;}if (isset($p->parts)) {foreach ($p->parts as $partno0 => $p2)$this->getpart($mbox, $mid, $p2, $partno . '.' . ($partno0 + 1));  // 1.2, 1.2.1, etc.}}
}

第三种

<?phpnamespace App\Http\Controllers;use App\Http\Requests;
use App\Models\FundGatewayAccount;
use App\Models\FundGatewayOrder;
use Illuminate\Support\Facades\Cache;class EmailController3 extends Controller
{public function get_email(){$host = "pop.126.com";$user = "";$pass = "";$rec = new pop3($host, 110, 2);if (!$rec->open()) die($rec->err_str);//echo "open ";if (!$rec->login($user, $pass)) die($rec->err_str);//echo "login";if (!$rec->stat()) die($rec->err_str);//echo "共有" . $rec->messages . "封信件,共" . $rec->size . "字节大小<br>";if ($rec->messages > 0) {if (!$rec->listmail()) die($rec->err_str);//echo "有以下信件:<br>";for ($i = 1;$i <= count($rec->mail_list);$i++) {//echo "信件" . $rec->mail_list[$i][num] . "大小:" . $rec->mail_list[$i][size] . "<BR>";}$rec->getmail(2);//echo "邮件头的内容:<br>";for ($i = 0; $i < count($rec->head); $i++)//echo htmlspecialchars($rec->head[$i]) . "<br>\n";//echo "邮件正文 :<BR>";$str = '';for ($i = 0; $i < count($rec->body); $i++) {$str .= htmlspecialchars($rec->body[$i]);}$str = base64_decode($str);iconv("UTF-8","GB2312",$str);var_dump($str);}$rec->close();}
}class Pop3
{var $hostname = "pop.126.com";// POP主机名 var $port = 110;// 主机的POP3端口,一般是110号端口 var $timeout = 5;// 连接主机的最大超时时间 var $connection = 0; // 保存与主机的连接 var $state = "DISCONNECTED"; // 保存当前的状态  var $debug = 0;// 做为标识,是否在调试状态,是的话,输出调试信息 var $err_str = '';// 如果出错,这里保存错误信息var $err_no;//如果出错,这里保存错误号码var $resp;// 临时保存服务器的响应信息var $apop;// 指示需要使用加密方式进行密码验证,一般服务器不需要var $messages; // 邮件数 var $size;//各邮件的总大小 var $mail_list; // 一个数组,保存各个邮件的大小及其在邮件服务器上序号var $head = array(); // 邮件头的内容,数组 var $body = array(); // 邮件体的内容,数组; function pop3($server = "192.100.100.1", $port = 110, $time_out = 5){$this->hostname = $server;$this->port = $port;$this->timeout = $time_out;return true;}function Open(){if ($this->hostname == "") {$this->err_str = "无效的主机名!!";return false;}$err_no = '';$err_str = '';if ($this->debug) echo "正在打开 $this->hostname,$this->port,&$err_no, &$err_str, $this->timeout<BR>";if (!$this->connection = fsockopen($this->hostname, $this->port, $err_no, $err_str, $this->timeout)) {$this->err_str = "连接到POP服务器失败,错误信息:" . $err_str . "错误号:" . $err_no;return false;} else {$this->getresp();if ($this->debug)$this->outdebug($this->resp);if (substr($this->resp, 0, 3) != "+OK") {$this->err_str = "服务器返回无效的信息:" . $this->resp . "请检查POP服务器是否正确";return false;}$this->state = "AUTHORIZATION";return true;}}function getresp(){for ($this->resp = ""; ;) {if (feof($this->connection)) return false;$this->resp .= fgets($this->connection, 100);$length = strlen($this->resp);if ($length >= 2 && substr($this->resp, $length - 2, 2) == "\r\n") {$this->resp = strtok($this->resp, "\r\n");return true;}}}//这个方法取得服务器端的返回信息并进行简单的处理:去掉最后的回车换行符,将返回信息保存在resp这个内部变量中。这个方法在后面的多个操作中都将用到。另外,还有个小方法也在后面的多个操作中用到: function outdebug($message){echo htmlspecialchars($message) . "<br>\n";}//它的作用就是把调试信息$message显示出来,并把一些特殊字符进行转换以及在行尾加上<br>标签,这样是为了使其输出的调试信息便于阅读和分析。//建立起与服务器的sock连接之后,就要给服务器发送相关的命令了(请参见上面的与服务器对话的过程)从上面对 POP对话的分析可以看到,每次都是发送一条命令,然后服务器给予一定的回应,如果命令的执行是对的,回应一般是以+OK开头,后面是一些描述信息,所以,我们可以做一个通过发送命令的方法: function command($command, $return_lenth = 1, $return_code = '+'){if ($this->connection == 0) {$this->err_str = "没有连接到任何服务器,请检查网络连接";return false;}if ($this->debug) $this->outdebug(">>> $command");if (!fputs($this->connection, "$command\r\n")) {$this->err_str = "无法发送命令" . $command;return false;} else {$this->getresp();if ($this->debug) $this->outdebug($this->resp);if (substr($this->resp, 0, $return_lenth) != $return_code) {$this->err_str = $command . " 命令服务器返回无效:" . $this->resp;return false;} elsereturn true;}}//这个方法可以接受三个参数: $command--> 发送给服务器的命令; $return_lenth,$return_code ,指定从服务器的返回中取多长的值做为命令返回的标识以及这个标识的正确值是什么。对于一般的pop操作来说,如果服务器的返回第一个字符为"+",则可以认为命令是正确执行了。也可以用前面提到过的三个字符"+OK"做为判断的标识。 //下面介绍的几个方法则可以按照前述收取信件的对话去理解,因为有关的内容已经在前面做了说明,因此下面的方法不做详细的说明,请参考其中的注释: function Login($user, $password) //发送用户名及密码,登录到服务器 {if ($this->state != "AUTHORIZATION") {$this->err_str = "还没有连接到服务器或状态不对";return false;}if (!$this->apop) //服务器是否采用APOP用户认证 {if (!$this->command("USER $user", 3, "+OK")) return false;if (!$this->command("PASS $password", 3, "+OK")) return false;} else {if (!$this->command("APOP $user " . md5($this->greeting . $password), 3, "+OK")) return false;}$this->state = "TRANSACTION"; // 用户认证通过,进入传送模式 return true;}function stat() // 对应着stat命令,取得总的邮件数与总的大小 {if ($this->state != "TRANSACTION") {$this->err_str = "还没有连接到服务器或没有成功登录";return false;}if (!$this->command("STAT", 3, "+OK"))return false;else {$this->resp = strtok($this->resp, " ");$this->messages = strtok(" "); // 取得邮件总数 $this->size = strtok(" "); //取得总的字节大小 return true;}}function listmail($mess = null, $uni_id = null) //对应的是LIST命令,取得每个邮件的大小及序号。一般来说用到的是List命令,如果指定了$uni_id ,则使用UIDL命令,返回的是每个邮件的标识符,事实上,这个标识符一般是没有什么用的。取得的各个邮件的大小返回到类的内部变量mail_list这个二维数组里。 {if ($this->state != "TRANSACTION") {$this->err_str = "还没有连接到服务器或没有成功登录";return false;}if ($uni_id)$command = "UIDL ";else$command = "LIST ";if ($mess) $command .= $mess;if (!$this->command($command, 3, "+OK")) {return false;} else {$i = 0;$this->mail_list = array();$this->getresp();while ($this->resp != ".") {$i++;if ($this->debug) {$this->outdebug($this->resp);}if ($uni_id) {$this->mail_list[$i][num] = strtok($this->resp, " ");$this->mail_list[$i][size] = strtok(" ");} else {$this->mail_list[$i]["num"] = intval(strtok($this->resp, " "));$this->mail_list[$i]["size"] = intval(strtok(" "));}$this->getresp();}return true;}}function getmail($num = 1, $line = -1) // 取得邮件的内容,$num是邮件的序号,$line是指定共取得正文的多少行。有些时候,如邮件比较大而我们只想先查看邮件的主题时是必须指定行数的。默认值$line=-1,即取回所有的邮件内容,取得的内容存放到内部变量$head,$body两个数组里,数组里的每一个元素对应的是邮件源代码的一行。 {if ($this->state != "TRANSACTION") {$this->err_str = "不能收取信件,还没有连接到服务器或没有成功登录";return false;}if ($line < 0)$command = "RETR $num";else$command = "TOP $num $line";if (!$this->command("$command", 3, "+OK"))return false;else {$this->getresp();$is_head = true;while ($this->resp != ".") // . 号是邮件结束的标识 {if ($this->debug)$this->outdebug($this->resp);if (substr($this->resp, 0, 1) == ".")$this->resp = substr($this->resp, 1, strlen($this->resp) - 1);if (trim($this->resp) == "") // 邮件头与正文部分的是一个空行 $is_head = false;if ($is_head)$this->head[] = $this->resp;else$this->body[] = $this->resp;$this->getresp();}return true;}} // end function function dele($num) // 删除指定序号的邮件,$num 是服务器上的邮件序号 {if ($this->state != "TRANSACTION") {$this->err_str = "不能删除远程信件,还没有连接到服务器或没有成功登录";return false;}if (!$num) {$this->err_str = "删除的参数不对";return false;}if ($this->command("DELE $num ", 3, "+OK"))return true;elsereturn false;}//通过以上几个方法,我们已经可以实现邮件的查看、收取、删除的操作,不过别忘了最后要退出,并关闭与服务器的连接,调用下面的这个方法: function Close(){if ($this->connection != 0) {if ($this->state == "TRANSACTION")$this->command("QUIT", 3, "+OK");fclose($this->connection);$this->connection = 0;$this->state = "DISCONNECTED";}}}

读取邮箱邮件(PHP)三种相关推荐

  1. zabbix邮箱告警的三种方式

    zabbix邮箱告警的三种方式 1.在web界面配置邮箱告警 2.在本地邮箱配置邮箱告警+脚本 3.在第三方邮箱配置邮箱告警+脚本 1.在web界面配置邮箱告警 添加媒介 我们以126邮箱为示例 先打 ...

  2. php读取文件内容不全,php读取文件内容的三种方法

    //**************第一种读取方式***************************** 代码如下: header("content-type:text/html;chars ...

  3. python一次性读取整个文件-python逐行读取文件内容的三种方法

    一.使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. 二.需要导入import os 三.下面是逐行读取文件内容的三种方法: ...

  4. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  5. php远程读取几行文件,PHP读取远程文件的三种方法

    PHP读取远程文件的三种方法 (2008-08-01 14:29:55) 标签: php 下载远程文件 it HP读取远程文件的几种方法,做采集的第一步就是读取远程文件- 1.file_get_con ...

  6. TensorFlow中读取图像数据的三种方式(转)

    附加一个链接关于DatasetAPI:https://zhuanlan.zhihu.com/p/30751039 本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和 ...

  7. HTML读取xml文件的三种办法

    刚开始学这里的时候有点懵,以前没学过.但是学安卓动画(Animation)的时候接触过xml文件,总体来说不难. 一般来说xml文件用来储存数据,然后html读取它,主要介绍三种读取方式 利用CSS读 ...

  8. 读取风云二号文件三种方式(主要用于学习IDL读取图像)

    1.将文件读入data变量,运行此时,查看变量器会有data变量 FILE=DIALOG_PICKFILE(PATH='E:\Trainning2013\chapter05\data') OPENR, ...

  9. python正确读取文件路径的三种解决方法

    目录 一.问题需求 二.问题原因 三.解决办法 四.小思 一.问题需求 日常用程序读取文件数据等时,常常会显示一些诸如文件路径不存在等错误信息. 二.问题原因 这类问题,在python中,主要是由于 ...

最新文章

  1. 立足高校矢志创新,鲲鹏计算生态长沙在行动
  2. .net 面试题系列文章三(附答案)
  3. MATLAB实现图像平移的源代码
  4. 【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )
  5. vim中Mapping already in use: LocalLeaderis, mode n错误解决的方法解释
  6. OpenCASCADE:使用扩展数据交换 XDE之颜色和图层
  7. GMQ集团推出全球创新型金融衍生品交易平台
  8. 使用不同版本的UI5库文件本地测试UI5应用
  9. 接触Jenkins(Hudson)API,第1部分
  10. NIS服务的基本配置----视频下载
  11. unix编程实训教程之 more(觉醒篇一 Begin)
  12. Java爬虫开发总结
  13. (金税盘版)开票软件,登录提示密钥容器不存在,怎么处理?
  14. 大学一年级计算机科学与技术教材,计算机科学与技术系授课计划及课程表一年级.PDF...
  15. 计算机组成原理74138译码器连接,74138(74138译码器工作原理)
  16. 火狐浏览器书签无法删除解决方案
  17. 蓝桥杯 ALGO-7 逆序对
  18. iOS城市选择器-包含搜索功能
  19. 2021年京东最新炸年兽活动用脚本会怎样?JD炸年兽活动参与教程
  20. 解决浏览器导出Excel文件名乱码问题

热门文章

  1. 给1万帧视频做目标分割,显存占用还不到1.4GB,代码已开源 | ECCV 2022
  2. 计算机蓝屏代码0x000000ED,蓝屏代码0x000000ed,小编教你电脑蓝屏代码0x000000ed怎么解决...
  3. 修复剑灵新装系统后不能玩的问题
  4. 统计学习笔记—手撕“感知机”
  5. 计算机辅助教学文献,计算机辅助教学论文
  6. int main()与void main()区别?
  7. 从零开始学习嵌入式开发(ubuntu)
  8. 两台电脑直连传输文件的方法-飞秋
  9. 老年大学计算机培训教材微博,山东86岁老人编电脑教材 帮助200位老人学习电脑...
  10. 如何在字符串中加入回车换行,tab字符 关于字符串处理