PHP receiveMail实现收邮件功能


Posted in PHP onApril 25, 2018

用PHP来发邮件,相信大家都不陌生,但读取收件箱的话,接触就少了,这次总结下自己的经验,希望可以帮助大家.

注意:

1.PHP读取收件箱主要是利用imap扩展,所以在使用以下方法前,必须开启imap扩展模块的支持.

2.此方法支持中文,不会乱码,需要保持所有文件的编码的一致性

1.文件结构

PHP receiveMail实现收邮件功能

2.邮件类 ./mailreceived/receiveMail.class.php

./mailreceived/receiveMail.class.php 文件内容如下:

<?php 
// Main ReciveMail Class File - Version 1.0 (03-06-2015) 
/* 
 * File: recivemail.class.php 
 * Description: Reciving mail With Attechment 
 * Version: 1.1 
 * Created: 03-06-2015 
 * Author: Sara Zhou 
 */ 
class receiveMail 
{ 
  var $server=''; 
  var $username=''; 
  var $password=''; 
   
  var $marubox='';           
   
  var $email='';    
   
  function receiveMail($username,$password,$EmailAddress,$mailserver='localhost',$servertype='pop',$port='110',$ssl = false) //Constructure 
  { 
    if($servertype=='imap') 
    { 
      if($port=='') $port='143';  
      $strConnect='{'.$mailserver.':'.$port. '}INBOX';  
    } 
    else 
    { 
      $strConnect='{'.$mailserver.':'.$port. '/pop3'.($ssl ? "/ssl" : "").'}INBOX';  
    } 
    $this->server      =  $strConnect; 
    $this->username     =  $username; 
    $this->password     =  $password; 
    $this->email     =  $EmailAddress; 
  } 
  function connect() //Connect To the Mail Box 
  { 
    $this->marubox=@imap_open($this->server,$this->username,$this->password); 
     
    if(!$this->marubox) 
    { 
      return false; 
//     echo "Error: Connecting to mail server"; 
//     exit; 
    } 
    return true; 
  } 
   
   
  function getHeaders($mid) // Get Header info 
  { 
    if(!$this->marubox) 
      return false; 
 
    $mail_header=imap_header($this->marubox,$mid); 
    $sender=$mail_header->from[0]; 
    $sender_replyto=$mail_header->reply_to[0]; 
    if(strtolower($sender->mailbox)!='mailer-daemon' && strtolower($sender->mailbox)!='postmaster') 
    { 
      $subject=$this->decode_mime($mail_header->subject); 
 
      $ccList=array(); 
      foreach ($mail_header->cc as $k => $v) 
      { 
        $ccList[]=$v->mailbox.'@'.$v->host; 
      } 
      $toList=array(); 
      foreach ($mail_header->to as $k => $v) 
      { 
        $toList[]=$v->mailbox.'@'.$v->host; 
      } 
      $ccList=implode(",", $ccList); 
      $toList=implode(",", $toList); 
      $mail_details=array( 
          'fromBy'=>strtolower($sender->mailbox).'@'.$sender->host, 
          'fromName'=>$this->decode_mime($sender->personal), 
          'ccList'=>$ccList,//strtolower($sender_replyto->mailbox).'@'.$sender_replyto->host, 
          'toNameOth'=>$this->decode_mime($sender_replyto->personal), 
          'subject'=>$subject, 
          'mailDate'=>date("Y-m-d H:i:s",$mail_header->udate), 
          'udate'=>$mail_header->udate, 
          'toList'=>$toList//strtolower($mail_header->to[0]->mailbox).'@'.$mail_header->to[0]->host 
//         'to'=>strtolower($mail_header->toaddress) 
        ); 
    } 
    return $mail_details; 
  } 
  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 && $structure->subtype!="PNG") {  
      return $primary_mime_type[(int) $structure->type] . '/' . $structure->subtype;  
    }  
    return "TEXT/PLAIN";  
  }  
  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); 
//         if ($structure->parameters[0]->value!="utf-8") 
//         { 
//           return imap_base64($text); 
//         } 
//         else 
//         { 
//           return imap_base64($text); 
//         } 
        } 
        else if($structure->encoding == 4) 
        { 
          return iconv('gb2312','utf8',imap_qprint($text)); 
        } 
        else 
        { 
          return iconv('gb2312','utf8',$text); 
        } 
      }  
      if($structure->type == 1) /* multipart */  
      {  
        while(list($index, $sub_structure) = each($structure->parts)) 
        {  
          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;  
  }  
  function getTotalMails() //Get Total Number off Unread Email In Mailbox 
  { 
    if(!$this->marubox) 
      return false; 
 
//   return imap_headers($this->marubox); 
    return imap_num_recent($this->marubox); 
  } 
   
  function GetAttach($mid,$path) // Get Atteced File from Mail 
  { 
    if(!$this->marubox) 
      return false; 
 
    $struckture = imap_fetchstructure($this->marubox,$mid); 
     
    $files=array(); 
    if($struckture->parts) 
    { 
      foreach($struckture->parts as $key => $value) 
      { 
        $enc=$struckture->parts[$key]->encoding; 
         
        //取邮件附件 
        if($struckture->parts[$key]->ifdparameters) 
        { 
          //命名附件,转码 
          $name=$this->decode_mime($struckture->parts[$key]->dparameters[0]->value);          
          $extend =explode("." , $name); 
          $file['extension'] = $extend[count($extend)-1]; 
          $file['pathname'] = $this->setPathName($key, $file['extension']); 
          $file['title']   = !empty($name) ? htmlspecialchars($name) : str_replace('.' . $file['extension'], '', $name); 
          $file['size']   = $struckture->parts[$key]->dparameters[1]->value; 
//         $file['tmpname']  = $struckture->parts[$key]->dparameters[0]->value; 
          if(@$struckture->parts[$key]->disposition=="ATTACHMENT") 
          { 
            $file['type']   = 1;    
          } 
          else 
          { 
            $file['type']   = 0; 
          }       
          $files[] = $file;           
           
          $message = imap_fetchbody($this->marubox,$mid,$key+1); 
          if ($enc == 0) 
            $message = imap_8bit($message); 
          if ($enc == 1) 
            $message = imap_8bit ($message); 
          if ($enc == 2) 
            $message = imap_binary ($message); 
          if ($enc == 3)//图片 
            $message = imap_base64 ($message);  
          if ($enc == 4) 
            $message = quoted_printable_decode($message); 
          if ($enc == 5) 
            $message = $message; 
          $fp=fopen($path.$file['pathname'],"w"); 
          fwrite($fp,$message); 
          fclose($fp); 
           
        } 
        // 处理内容中包含图片的部分 
        if($struckture->parts[$key]->parts) 
        { 
          foreach($struckture->parts[$key]->parts as $keyb => $valueb) 
          { 
            $enc=$struckture->parts[$key]->parts[$keyb]->encoding; 
            if($struckture->parts[$key]->parts[$keyb]->ifdparameters) 
            { 
              //命名图片 
              $name=$this->decode_mime($struckture->parts[$key]->parts[$keyb]->dparameters[0]->value); 
              $extend =explode("." , $name); 
              $file['extension'] = $extend[count($extend)-1]; 
              $file['pathname'] = $this->setPathName($key, $file['extension']); 
              $file['title']   = !empty($name) ? htmlspecialchars($name) : str_replace('.' . $file['extension'], '', $name); 
              $file['size']   = $struckture->parts[$key]->parts[$keyb]->dparameters[1]->value; 
//             $file['tmpname']  = $struckture->parts[$key]->dparameters[0]->value; 
              $file['type']   = 0; 
              $files[] = $file; 
               
              $partnro = ($key+1).".".($keyb+1); 
               
              $message = imap_fetchbody($this->marubox,$mid,$partnro); 
              if ($enc == 0) 
                  $message = imap_8bit($message); 
              if ($enc == 1) 
                  $message = imap_8bit ($message); 
              if ($enc == 2) 
                  $message = imap_binary ($message); 
              if ($enc == 3) 
                  $message = imap_base64 ($message); 
              if ($enc == 4) 
                  $message = quoted_printable_decode($message); 
              if ($enc == 5) 
                  $message = $message; 
              $fp=fopen($path.$file['pathname'],"w"); 
              fwrite($fp,$message); 
              fclose($fp); 
            } 
          } 
        }         
      } 
    } 
    //move mail to taskMailBox 
    $this->move_mails($mid, $this->marubox);    
 
    return $files; 
  } 
   
  function getBody($mid,&$path,$imageList) // 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 ""; 
    } 
    //处理图片 
    $body=$this->embed_images($body,$path,$imageList); 
    return $body; 
  } 
   
  function embed_images(&$body,&$path,$imageList) 
  { 
    // get all img tags 
    preg_match_all('/<img.*?>/', $body, $matches); 
    if (!isset($matches[0])) return; 
     
    foreach ($matches[0] as $img) 
    { 
      // replace image web path with local path 
      preg_match('/src="(.*?)"/', $img, $m); 
      if (!isset($m[1])) continue; 
      $arr = parse_url($m[1]); 
      if (!isset($arr['scheme']) || !isset($arr['path']))continue; 
       
//     if (!isset($arr['host']) || !isset($arr['path']))continue; 
      if ($arr['scheme']!="http") 
      { 
        $filename=explode("@", $arr['path']); 
        $body = str_replace($img, '<img alt="" src="'.$path.$imageList[$filename[0]].'" style="border: none;" />', $body); 
      } 
    } 
    return $body; 
  } 
   
  function deleteMails($mid) // Delete That Mail 
  { 
    if(!$this->marubox) 
      return false; 
     
    imap_delete($this->marubox,$mid); 
  } 
  function close_mailbox() //Close Mail Box 
  { 
    if(!$this->marubox) 
      return false; 
 
    imap_close($this->marubox,CL_EXPUNGE); 
  } 
   
  //移动邮件到指定分组 
  function move_mails($msglist,$mailbox) 
  { 
    if(!$this->marubox) 
      return false; 
   
    imap_mail_move($this->marubox, $msglist, $mailbox); 
  } 
   
  function creat_mailbox($mailbox) 
  { 
    if(!$this->marubox) 
      return false; 
     
    //imap_renamemailbox($imap_stream, $old_mbox, $new_mbox); 
    imap_create($this->marubox, $mailbox); 
  } 
   
  /* 
   * decode_mime()转换邮件标题的字符编码,处理乱码 
   */ 
  function decode_mime($str){ 
    $str=imap_mime_header_decode($str); 
    return $str[0]->text; 
    echo "str";print_r($str); 
    if ($str[0]->charset!="default") 
    {echo "==".$str[0]->text; 
      return iconv($str[0]->charset,'utf8',$str[0]->text); 
    } 
    else 
    { 
      return $str[0]->text; 
    } 
  } 
   
  /** 
   * Set path name of the uploaded file to be saved. 
   * 
   * @param int  $fileID 
   * @param string $extension 
   * @access public 
   * @return string 
   */ 
  public function setPathName($fileID, $extension) 
  { 
    return date('Ym/dHis', time()) . $fileID . mt_rand(0, 10000) . '.' . $extension; 
  } 
   
} 
?>

3.控制层./mailreceived/mailControl.php

 ./mailreceived/mailControl.php 内容如下:

<? 
/* 
 * File: mailControl.php 
 * Description: Received Mail Example 
 * Created: 03-06-2015 
 * Author: Sara Zhou 
 */ 
@header('Content-type: text/html;charset=UTF-8'); 
error_reporting(0); 
ignore_user_abort(); // run script in background 
set_time_limit(0); // run script forever 
date_default_timezone_set('Asia/Shanghai'); 
include("receivemail.class.php"); 
class mailControl 
{ 
  //定义系统常量 
  //用户名 
  public $mailAccount = "123456@qq.com"; 
  public $mailPasswd = "12345"; 
  public $mailAddress = "123456@qq.com"; 
  public $mailServer = "pop.qq.com"; 
  public $serverType = "pop3"; 
  public $port = "110"; 
  public $now    = 0; 
  public $savePath = ''; 
  public $webPath  = "../upload/"; 
   
  public function __construct() 
  { 
    $this->now = date("Y-m-d H:i:s",time()); 
     
    $this->setSavePath(); 
  } 
   
  /** 
   * mail Received()读取收件箱邮件 
   * 
   * @param 
   * @access public 
   * @return result 
   */ 
  public function mailReceived() 
  { 
    // Creating a object of reciveMail Class 
    $obj= new receivemail($this->mailAccount,$this->mailPasswd,$this->mailAddress,$this->mailServer,$this->serverType,$this->port,false); 
      
    //Connect to the Mail Box 
    $res=$obj->connect();     //If connection fails give error message and exit 
    if (!$res) 
    { 
      return array("msg"=>"Error: Connecting to mail server"); 
    } 
    // Get Total Number of Unread Email in mail box 
    $tot=$obj->getTotalMails(); //Total Mails in Inbox Return integer value 
    if($tot < 1) { //如果信件数为0,显示信息 
      return array("msg"=>"No Message for ".$this->mailAccount); 
    } 
    else 
    { 
      $res=array("msg"=>"Total Mails:: $tot<br>"); 
   
      for($i=$tot;$i>0;$i--) 
      { 
        $head=$obj->getHeaders($i); // Get Header Info Return Array Of Headers **Array Keys are (subject,to,toOth,toNameOth,from,fromName) 
     
        //处理邮件附件 
        $files=$obj->GetAttach($i,$this->savePath); // 获取邮件附件,返回的邮件附件信息数组 
         
        $imageList=array(); 
        foreach($files as $k => $file) 
        {       
          //type=1为附件,0为邮件内容图片 
          if($file['type'] == 0) 
          { 
            $imageList[$file['title']]=$file['pathname']; 
          } 
        } 
        $body = $obj->getBody($i,$this->webPath,$imageList); 
         
        $res['mail'][]=array('head'=>$head,'body'=>$body,"attachList"=>$files);        
//       $obj->deleteMails($i); // Delete Mail from Mail box 
//       $obj->move_mails($i,"taskMail"); 
      } 
      $obj->close_mailbox();  //Close Mail Box 
      return $res; 
    } 
  } 
    
  /** 
  * creatBox 
  * 
  * @access public 
  * @return void 
  */ 
  public function creatBox($boxName) 
  { 
    // Creating a object of reciveMail Class 
    $obj= new receivemail($this->mailAccount,$this->mailPasswd,$this->mailAddress,$this->mailServer,$this->serverType,$this->port,false); 
    $obj->creat_mailbox($boxName); 
  } 
   
  /** 
   * Set save path. 
   * 
   * @access public 
   * @return void 
   */ 
  public function setSavePath() 
  { 
    $savePath = "../upload/" . date('Ym/', $this->now); 
    if(!file_exists($savePath)) 
    { 
      @mkdir($savePath, 0777, true); 
      touch($savePath . 'index.html'); 
    } 
    $this->savePath = dirname($savePath) . '/'; 
  } 
    
} 
  $obj=new mailControl(); 
  //收取邮件 
  $res=$obj->mailReceived(); 
  echo "<pre>";print_r($res); 
   
  //创建邮箱 
// $obj->creatBox("readyBox"); 
?>

4.访问地址:http://localhost/test.cn/mailreceived/mailControl.php 即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php抓即时股票信息
Oct 09 PHP
PHP编程之高级技巧——利用Mysql函数
Oct 09 PHP
php 3行代码的分页算法(求起始页和结束页)
Oct 21 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
PHP实现获取图片颜色值的方法
Jul 11 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
Jul 19 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
yii2局部关闭(开启)csrf的验证的实例代码
Jul 10 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
php校验公钥是否可用的实例方法
Sep 17 PHP
如何通过PHP实现Des加密算法代码实例
May 09 PHP
laravel中短信发送验证码的实现方法
Apr 25 #PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 #PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 #PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 #PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 #PHP
原生php实现excel文件读写的方法分析
Apr 25 #PHP
PHP操作Redis常用技巧总结
Apr 24 #PHP
You might like
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
浅析Javascript使用include/require
2013/11/13 Javascript
js快速排序的实现代码
2013/12/08 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
浅谈javascript的调试
2015/01/28 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Python functools模块学习总结
2015/05/09 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
不要用强制方法杀掉python线程
2017/02/26 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
视光学毕业生自荐书范文
2014/02/13 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
公证处委托书
2015/01/28 职场文书
高考1977观后感
2015/06/04 职场文书
运动会观后感
2015/06/09 职场文书
2016年元旦致辞
2015/08/01 职场文书
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis