• 售前

  • 售后

热门帖子
入门百科

PHP receiveMail实现收邮件功能

[复制链接]
幸福341 显示全部楼层 发表于 2021-10-25 20:24:54 |阅读模式 打印 上一主题 下一主题
用PHP来发邮件,信赖各人都不陌生,但读取收件箱的话,接触就少了,这次总结下本身的履历,渴望可以资助各人.
留意:
1.PHP读取收件箱重要是利用imap扩展,以是在利用以下方法前,必须开启imap扩展模块的支持.
2.此方法支持中文,不会乱码,须要保持全部文件的编码的一致性
1.文件结构

2.邮件类 ./mailreceived/receiveMail.class.php
./mailreceived/receiveMail.class.php 文件内容如下:
  1. <?php
  2. // Main ReciveMail Class File - Version 1.0 (03-06-2015)
  3. /*
  4. * File: recivemail.class.php
  5. * Description: Reciving mail With Attechment
  6. * Version: 1.1
  7. * Created: 03-06-2015
  8. * Author: Sara Zhou
  9. */
  10. class receiveMail
  11. {
  12.   var $server='';
  13.   var $username='';
  14.   var $password='';
  15.    
  16.   var $marubox='';           
  17.    
  18.   var $email='';   
  19.    
  20.   function receiveMail($username,$password,$EmailAddress,$mailserver='localhost',$servertype='pop',$port='110',$ssl = false) //Constructure
  21.   {
  22.     if($servertype=='imap')
  23.     {
  24.       if($port=='') $port='143';  
  25.       $strConnect='{'.$mailserver.':'.$port. '}INBOX';  
  26.     }
  27.     else
  28.     {
  29.       $strConnect='{'.$mailserver.':'.$port. '/pop3'.($ssl ? "/ssl" : "").'}INBOX';  
  30.     }
  31.     $this->server      =  $strConnect;
  32.     $this->username     =  $username;
  33.     $this->password     =  $password;
  34.     $this->email     =  $EmailAddress;
  35.   }
  36.   function connect() //Connect To the Mail Box
  37.   {
  38.     $this->marubox=@imap_open($this->server,$this->username,$this->password);
  39.      
  40.     if(!$this->marubox)
  41.     {
  42.       return false;
  43. //     echo "Error: Connecting to mail server";
  44. //     exit;
  45.     }
  46.     return true;
  47.   }
  48.    
  49.    
  50.   function getHeaders($mid) // Get Header info
  51.   {
  52.     if(!$this->marubox)
  53.       return false;
  54.     $mail_header=imap_header($this->marubox,$mid);
  55.     $sender=$mail_header->from[0];
  56.     $sender_replyto=$mail_header->reply_to[0];
  57.     if(strtolower($sender->mailbox)!='mailer-daemon' && strtolower($sender->mailbox)!='postmaster')
  58.     {
  59.       $subject=$this->decode_mime($mail_header->subject);
  60.       $ccList=array();
  61.       foreach ($mail_header->cc as $k => $v)
  62.       {
  63.         $ccList[]=$v->mailbox.'@'.$v->host;
  64.       }
  65.       $toList=array();
  66.       foreach ($mail_header->to as $k => $v)
  67.       {
  68.         $toList[]=$v->mailbox.'@'.$v->host;
  69.       }
  70.       $ccList=implode(",", $ccList);
  71.       $toList=implode(",", $toList);
  72.       $mail_details=array(
  73.           'fromBy'=>strtolower($sender->mailbox).'@'.$sender->host,
  74.           'fromName'=>$this->decode_mime($sender->personal),
  75.           'ccList'=>$ccList,//strtolower($sender_replyto->mailbox).'@'.$sender_replyto->host,
  76.           'toNameOth'=>$this->decode_mime($sender_replyto->personal),
  77.           'subject'=>$subject,
  78.           'mailDate'=>date("Y-m-d H:i:s",$mail_header->udate),
  79.           'udate'=>$mail_header->udate,
  80.           'toList'=>$toList//strtolower($mail_header->to[0]->mailbox).'@'.$mail_header->to[0]->host
  81. //         'to'=>strtolower($mail_header->toaddress)
  82.         );
  83.     }
  84.     return $mail_details;
  85.   }
  86.   function get_mime_type(&$structure) //Get Mime type Internal Private Use
  87.   {  
  88.     $primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER");  
  89.      
  90.     if($structure->subtype && $structure->subtype!="PNG") {  
  91.       return $primary_mime_type[(int) $structure->type] . '/' . $structure->subtype;  
  92.     }  
  93.     return "TEXT/PLAIN";  
  94.   }  
  95.   function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) //Get Part Of Message Internal Private Use
  96.   {  
  97.      
  98.     if(!$structure) {  
  99.       $structure = imap_fetchstructure($stream, $msg_number);  
  100.     }  
  101.     if($structure) {  
  102.       if($mime_type == $this->get_mime_type($structure))
  103.       {  
  104.         if(!$part_number)  
  105.         {  
  106.           $part_number = "1";  
  107.         }  
  108.         $text = imap_fetchbody($stream, $msg_number, $part_number);
  109.          
  110.         if($structure->encoding == 3)
  111.         {
  112.           return imap_base64($text);
  113. //         if ($structure->parameters[0]->value!="utf-8")
  114. //         {
  115. //           return imap_base64($text);
  116. //         }
  117. //         else
  118. //         {
  119. //           return imap_base64($text);
  120. //         }
  121.         }
  122.         else if($structure->encoding == 4)
  123.         {
  124.           return iconv('gb2312','utf8',imap_qprint($text));
  125.         }
  126.         else
  127.         {
  128.           return iconv('gb2312','utf8',$text);
  129.         }
  130.       }  
  131.       if($structure->type == 1) /* multipart */  
  132.       {  
  133.         while(list($index, $sub_structure) = each($structure->parts))
  134.         {  
  135.           if($part_number)
  136.           {  
  137.             $prefix = $part_number . '.';  
  138.           }  
  139.           $data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1));  
  140.           if($data)
  141.           {  
  142.             return $data;  
  143.           }  
  144.         }  
  145.       }  
  146.     }
  147.     return false;  
  148.   }  
  149.   function getTotalMails() //Get Total Number off Unread Email In Mailbox
  150.   {
  151.     if(!$this->marubox)
  152.       return false;
  153. //   return imap_headers($this->marubox);
  154.     return imap_num_recent($this->marubox);
  155.   }
  156.    
  157.   function GetAttach($mid,$path) // Get Atteced File from Mail
  158.   {
  159.     if(!$this->marubox)
  160.       return false;
  161.     $struckture = imap_fetchstructure($this->marubox,$mid);
  162.      
  163.     $files=array();
  164.     if($struckture->parts)
  165.     {
  166.       foreach($struckture->parts as $key => $value)
  167.       {
  168.         $enc=$struckture->parts[$key]->encoding;
  169.          
  170.         //取邮件附件
  171.         if($struckture->parts[$key]->ifdparameters)
  172.         {
  173.           //命名附件,转码
  174.           $name=$this->decode_mime($struckture->parts[$key]->dparameters[0]->value);         
  175.           $extend =explode("." , $name);
  176.           $file['extension'] = $extend[count($extend)-1];
  177.           $file['pathname'] = $this->setPathName($key, $file['extension']);
  178.           $file['title']   = !empty($name) ? htmlspecialchars($name) : str_replace('.' . $file['extension'], '', $name);
  179.           $file['size']   = $struckture->parts[$key]->dparameters[1]->value;
  180. //         $file['tmpname']  = $struckture->parts[$key]->dparameters[0]->value;
  181.           if(@$struckture->parts[$key]->disposition=="ATTACHMENT")
  182.           {
  183.             $file['type']   = 1;   
  184.           }
  185.           else
  186.           {
  187.             $file['type']   = 0;
  188.           }      
  189.           $files[] = $file;           
  190.            
  191.           $message = imap_fetchbody($this->marubox,$mid,$key+1);
  192.           if ($enc == 0)
  193.             $message = imap_8bit($message);
  194.           if ($enc == 1)
  195.             $message = imap_8bit ($message);
  196.           if ($enc == 2)
  197.             $message = imap_binary ($message);
  198.           if ($enc == 3)//图片
  199.             $message = imap_base64 ($message);  
  200.           if ($enc == 4)
  201.             $message = quoted_printable_decode($message);
  202.           if ($enc == 5)
  203.             $message = $message;
  204.           $fp=fopen($path.$file['pathname'],"w");
  205.           fwrite($fp,$message);
  206.           fclose($fp);
  207.            
  208.         }
  209.         // 处理内容中包含图片的部分
  210.         if($struckture->parts[$key]->parts)
  211.         {
  212.           foreach($struckture->parts[$key]->parts as $keyb => $valueb)
  213.           {
  214.             $enc=$struckture->parts[$key]->parts[$keyb]->encoding;
  215.             if($struckture->parts[$key]->parts[$keyb]->ifdparameters)
  216.             {
  217.               //命名图片
  218.               $name=$this->decode_mime($struckture->parts[$key]->parts[$keyb]->dparameters[0]->value);
  219.               $extend =explode("." , $name);
  220.               $file['extension'] = $extend[count($extend)-1];
  221.               $file['pathname'] = $this->setPathName($key, $file['extension']);
  222.               $file['title']   = !empty($name) ? htmlspecialchars($name) : str_replace('.' . $file['extension'], '', $name);
  223.               $file['size']   = $struckture->parts[$key]->parts[$keyb]->dparameters[1]->value;
  224. //             $file['tmpname']  = $struckture->parts[$key]->dparameters[0]->value;
  225.               $file['type']   = 0;
  226.               $files[] = $file;
  227.                
  228.               $partnro = ($key+1).".".($keyb+1);
  229.                
  230.               $message = imap_fetchbody($this->marubox,$mid,$partnro);
  231.               if ($enc == 0)
  232.                   $message = imap_8bit($message);
  233.               if ($enc == 1)
  234.                   $message = imap_8bit ($message);
  235.               if ($enc == 2)
  236.                   $message = imap_binary ($message);
  237.               if ($enc == 3)
  238.                   $message = imap_base64 ($message);
  239.               if ($enc == 4)
  240.                   $message = quoted_printable_decode($message);
  241.               if ($enc == 5)
  242.                   $message = $message;
  243.               $fp=fopen($path.$file['pathname'],"w");
  244.               fwrite($fp,$message);
  245.               fclose($fp);
  246.             }
  247.           }
  248.         }         
  249.       }
  250.     }
  251.     //move mail to taskMailBox
  252.     $this->move_mails($mid, $this->marubox);   
  253.     return $files;
  254.   }
  255.    
  256.   function getBody($mid,&$path,$imageList) // Get Message Body
  257.   {
  258.     if(!$this->marubox)
  259.       return false;
  260.     $body = $this->get_part($this->marubox, $mid, "TEXT/HTML");
  261.     if ($body == "")
  262.       $body = $this->get_part($this->marubox, $mid, "TEXT/PLAIN");
  263.     if ($body == "") {  
  264.       return "";
  265.     }
  266.     //处理图片
  267.     $body=$this->embed_images($body,$path,$imageList);
  268.     return $body;
  269.   }
  270.    
  271.   function embed_images(&$body,&$path,$imageList)
  272.   {
  273.     // get all img tags
  274.     preg_match_all('/<img.*?>/', $body, $matches);
  275.     if (!isset($matches[0])) return;
  276.      
  277.     foreach ($matches[0] as $img)
  278.     {
  279.       // replace image web path with local path
  280.       preg_match('/src="(.*?)"/', $img, $m);
  281.       if (!isset($m[1])) continue;
  282.       $arr = parse_url($m[1]);
  283.       if (!isset($arr['scheme']) || !isset($arr['path']))continue;
  284.       
  285. //     if (!isset($arr['host']) || !isset($arr['path']))continue;
  286.       if ($arr['scheme']!="http")
  287.       {
  288.         $filename=explode("@", $arr['path']);
  289.         $body = str_replace($img, '<img alt="" src="'.$path.$imageList[$filename[0]].'" style="border: none;" />', $body);
  290.       }
  291.     }
  292.     return $body;
  293.   }
  294.    
  295.   function deleteMails($mid) // Delete That Mail
  296.   {
  297.     if(!$this->marubox)
  298.       return false;
  299.      
  300.     imap_delete($this->marubox,$mid);
  301.   }
  302.   function close_mailbox() //Close Mail Box
  303.   {
  304.     if(!$this->marubox)
  305.       return false;
  306.     imap_close($this->marubox,CL_EXPUNGE);
  307.   }
  308.    
  309.   //移动邮件到指定分组
  310.   function move_mails($msglist,$mailbox)
  311.   {
  312.     if(!$this->marubox)
  313.       return false;
  314.    
  315.     imap_mail_move($this->marubox, $msglist, $mailbox);
  316.   }
  317.    
  318.   function creat_mailbox($mailbox)
  319.   {
  320.     if(!$this->marubox)
  321.       return false;
  322.      
  323.     //imap_renamemailbox($imap_stream, $old_mbox, $new_mbox);
  324.     imap_create($this->marubox, $mailbox);
  325.   }
  326.    
  327.   /*
  328.    * decode_mime()转换邮件标题的字符编码,处理乱码
  329.    */
  330.   function decode_mime($str){
  331.     $str=imap_mime_header_decode($str);
  332.     return $str[0]->text;
  333.     echo "str";print_r($str);
  334.     if ($str[0]->charset!="default")
  335.     {echo "==".$str[0]->text;
  336.       return iconv($str[0]->charset,'utf8',$str[0]->text);
  337.     }
  338.     else
  339.     {
  340.       return $str[0]->text;
  341.     }
  342.   }
  343.    
  344.   /**
  345.    * Set path name of the uploaded file to be saved.
  346.    *
  347.    * @param int  $fileID
  348.    * @param string $extension
  349.    * @access public
  350.    * @return string
  351.    */
  352.   public function setPathName($fileID, $extension)
  353.   {
  354.     return date('Ym/dHis', time()) . $fileID . mt_rand(0, 10000) . '.' . $extension;
  355.   }
  356.    
  357. }
  358. ?>
复制代码
3.控制层./mailreceived/mailControl.php
./mailreceived/mailControl.php 内容如下:
  1. <?
  2. /*
  3. * File: mailControl.php
  4. * Description: Received Mail Example
  5. * Created: 03-06-2015
  6. * Author: Sara Zhou
  7. */
  8. @header('Content-type: text/html;charset=UTF-8');
  9. error_reporting(0);
  10. ignore_user_abort(); // run script in background
  11. set_time_limit(0); // run script forever
  12. date_default_timezone_set('Asia/Shanghai');
  13. include("receivemail.class.php");
  14. class mailControl
  15. {
  16.   //定义系统常量
  17.   //用户名
  18.   public $mailAccount = "123456@qq.com";
  19.   public $mailPasswd = "12345";
  20.   public $mailAddress = "123456@qq.com";
  21.   public $mailServer = "pop.qq.com";
  22.   public $serverType = "pop3";
  23.   public $port = "110";
  24.   public $now    = 0;
  25.   public $savePath = '';
  26.   public $webPath  = "../upload/";
  27.    
  28.   public function __construct()
  29.   {
  30.     $this->now = date("Y-m-d H:i:s",time());
  31.      
  32.     $this->setSavePath();
  33.   }
  34.    
  35.   /**
  36.    * mail Received()读取收件箱邮件
  37.    *
  38.    * @param
  39.    * @access public
  40.    * @return result
  41.    */
  42.   public function mailReceived()
  43.   {
  44.     // Creating a object of reciveMail Class
  45.     $obj= new receivemail($this->mailAccount,$this->mailPasswd,$this->mailAddress,$this->mailServer,$this->serverType,$this->port,false);
  46.       
  47.     //Connect to the Mail Box
  48.     $res=$obj->connect();     //If connection fails give error message and exit
  49.     if (!$res)
  50.     {
  51.       return array("msg"=>"Error: Connecting to mail server");
  52.     }
  53.     // Get Total Number of Unread Email in mail box
  54.     $tot=$obj->getTotalMails(); //Total Mails in Inbox Return integer value
  55.     if($tot < 1) { //如果信件数为0,显示信息
  56.       return array("msg"=>"No Message for ".$this->mailAccount);
  57.     }
  58.     else
  59.     {
  60.       $res=array("msg"=>"Total Mails:: $tot<br>");
  61.    
  62.       for($i=$tot;$i>0;$i--)
  63.       {
  64.         $head=$obj->getHeaders($i); // Get Header Info Return Array Of Headers **Array Keys are (subject,to,toOth,toNameOth,from,fromName)
  65.      
  66.         //处理邮件附件
  67.         $files=$obj->GetAttach($i,$this->savePath); // 获取邮件附件,返回的邮件附件信息数组
  68.          
  69.         $imageList=array();
  70.         foreach($files as $k => $file)
  71.         {      
  72.           //type=1为附件,0为邮件内容图片
  73.           if($file['type'] == 0)
  74.           {
  75.             $imageList[$file['title']]=$file['pathname'];
  76.           }
  77.         }
  78.         $body = $obj->getBody($i,$this->webPath,$imageList);
  79.          
  80.         $res['mail'][]=array('head'=>$head,'body'=>$body,"attachList"=>$files);        
  81. //       $obj->deleteMails($i); // Delete Mail from Mail box
  82. //       $obj->move_mails($i,"taskMail");
  83.       }
  84.       $obj->close_mailbox();  //Close Mail Box
  85.       return $res;
  86.     }
  87.   }
  88.    
  89.   /**
  90.   * creatBox
  91.   *
  92.   * @access public
  93.   * @return void
  94.   */
  95.   public function creatBox($boxName)
  96.   {
  97.     // Creating a object of reciveMail Class
  98.     $obj= new receivemail($this->mailAccount,$this->mailPasswd,$this->mailAddress,$this->mailServer,$this->serverType,$this->port,false);
  99.     $obj->creat_mailbox($boxName);
  100.   }
  101.    
  102.   /**
  103.    * Set save path.
  104.    *
  105.    * @access public
  106.    * @return void
  107.    */
  108.   public function setSavePath()
  109.   {
  110.     $savePath = "../upload/" . date('Ym/', $this->now);
  111.     if(!file_exists($savePath))
  112.     {
  113.       @mkdir($savePath, 0777, true);
  114.       touch($savePath . 'index.html');
  115.     }
  116.     $this->savePath = dirname($savePath) . '/';
  117.   }
  118.    
  119. }
  120.   $obj=new mailControl();
  121.   //收取邮件
  122.   $res=$obj->mailReceived();
  123.   echo "<pre>";print_r($res);
  124.    
  125.   //创建邮箱
  126. // $obj->creatBox("readyBox");
  127. ?>
复制代码
4.访问所在:http://localhost/test.cn/mailreceived/mailControl.php 即可
以上就是本文的全部内容,渴望对各人的学习有所资助,也渴望各人多多支持脚本之家。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作