PHP receiveMail实现收邮件功能

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

注意:

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

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

1.文件结构

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 即可

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

您可能感兴趣的文章:

  • PHPMailer使用教程(PHPMailer发送邮件实例分析)
  • php邮件发送的两种方式
  • 功能齐全的PHP发送邮件类代码附详细说明
  • php中通过smtp发邮件的类,测试通过
  • php邮件发送,php发送邮件的类
  • PHPMailer邮件类利用smtp.163.com发送邮件方法
  • phpmailer在服务器上不能正常发送邮件的解决办法
  • phpmailer简单发送邮件的方法(附phpmailer源码下载)
  • php中mail函数发送邮件失败的解决方法
  • php下使用SMTP发邮件的代码
(0)

相关推荐

  • PHPMailer邮件类利用smtp.163.com发送邮件方法

    第一步:需要下载PHPMailer文件包phpmailer-1.73.tar.gz 来自开源社区: http://phpmailer.sourceforge.net/ 第二步:确认你的服务器系统已经支持socket 如下图,通过phpinfo();查看是否支持sockets 如果没有这一项就请注意: socket 是属于PHP扩展部分,编译时必须给定一个用于./configure --enable-sockets 的配置选项. 第三步:把文件解压到你的web服务器目录下,调用类就可以了,说明:首

  • PHPMailer使用教程(PHPMailer发送邮件实例分析)

    php虽然提供了mail()函数,但并不好用,而PHPMailer是一个不错的邮件发送工具,使用起来也是非常简单! 使用PHPMailer发送邮件: 复制代码 代码如下: <?php header("content-type:text/html;charset=utf-8"); ini_set("magic_quotes_runtime",0); require 'class.phpmailer.php'; try { $mail = new PHPMaile

  • php中通过smtp发邮件的类,测试通过

    smtp.php 复制代码 代码如下: <?php class smtp {     /* Public Variables */     var $smtp_port;     var $time_out;     var $host_name;     var $log_file;     var $relay_host;     var $debug;     var $auth;     var $user;     var $pass; /* Private Variables */ 

  • php邮件发送的两种方式

    这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法: 一.使用PHP内置的mail()函数 <?php $to = "test@163.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文 mail($to,$subject,$message); 结果就直接报错,如下: Warning: mail() [function.m

  • php中mail函数发送邮件失败的解决方法

    本文实例讲述了php中mail函数发送邮件失败的解决方法.分享给大家供大家参考.具体分析如下: php中mail函数是一个自带的发邮件的函数,但是如果你真的要使用mail函数来发邮件那必须是要给你系统安装sendmail组件才可以,下面我就碰到mail发送不了邮件的问题,下面一起来看看解决办法吧. 之前的那台服务器转移过来后,发现网站用mail()发送邮件发不了,但是发现sendmail明明已经安装,如果没有安装sendmail可以执行,代码如下: 复制代码 代码如下: yum install

  • php邮件发送,php发送邮件的类

    smtp.class.php 这个是类把他做保存到一个文件中. 复制代码 代码如下: <?php class smtp { /* Public Variables */ var $smtp_port; var $time_out; var $host_name; var $log_file; var $relay_host; var $debug; var $auth; var $user; var $pass; /* Private Variables */ var $sock; /* Con

  • phpmailer简单发送邮件的方法(附phpmailer源码下载)

    本文实例讲述了phpmailer简单发送邮件的方法.分享给大家供大家参考,具体如下: 首先,点击此处本站下载相应的php文件. 解压后有2个php文件(2个类)  1个html文件(API) 将2个php文件放到php项目中 简述:我这里是用一个163的邮箱发消息给126的邮箱 关键代码如下: <?php require 'class.phpmailer.php'; $mail = new PHPMailer(true); //建立邮件发送类 $mail->CharSet = "UT

  • php下使用SMTP发邮件的代码

    最近一个项目需要用到SMTP发送邮件,之前的库类不存在了,又不喜欢安装pear或者使用pear的net/smtp类,感觉太复杂了.就直接从discuz中抽取出核心稍微修改了下.    从协议分析网上,查找到SMTP协议的命令和应答,SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的.常用的命令如下:    HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令    MAIL FROM:<

  • 功能齐全的PHP发送邮件类代码附详细说明

    <?php  class Email {  //---设置全局变量  var $mailTo = ""; // 收件人  var $mailCC = ""; // 抄送  var $mailBCC = ""; // 秘密抄送  var $mailFrom = ""; // 发件人  var $mailSubject = ""; // 主题  var $mailText = ""; 

  • phpmailer在服务器上不能正常发送邮件的解决办法

    phpmailer本身是一个很不错的开源邮件类,也非常的易用简单,就是偶尔会出现程序上传到服务器上不能发送邮件的情况,在之前也有同学问过我这个问题,当时的时候总是不以为然,今天终于让我碰上了,用phpmailer 在本地测试正常,上传到服务器上就不行了,当然了是用的SMTP方式,最终确定是fsockopen 函数惹的祸,因为安全原因fsockopen 和pfsockopen 经常被服务器端关闭.解决方法如下: 而代之的应该是 stream_socket_client()函数,不过他的参数有一点不

随机推荐