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将会员数据导入到ucenter的代码
Jul 18 PHP
优化php效率,提高php性能的一些方法
Mar 24 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
Aug 06 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
php支付宝接口用法分析
Jan 04 PHP
PHP下载远程图片并保存到本地方法总结
Jan 22 PHP
Zend Framework教程之Zend_Config_Ini用法分析
Mar 23 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
PDO::getAvailableDrivers讲解
Jan 28 PHP
PHP explode()函数用法讲解
Feb 15 PHP
PHP7新特性
Mar 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+Html+缓存
2006/12/20 PHP
php学习笔记之 函数声明
2011/06/09 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
Python关于反射的实例代码分享
2020/02/20 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
电子商务自荐书范文
2014/01/04 职场文书
幼教简历自我评价
2014/01/28 职场文书
2014年中班元旦活动方案
2014/02/14 职场文书
应急管理工作总结2015
2015/05/04 职场文书
生活小常识广播稿
2015/08/19 职场文书