加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP邮件接收与发送类实现程序解析

发布时间:2022-01-21 01:39:39 所属栏目:PHP教程 来源:互联网
导读:我想使用邮件接收类的朋友可能比较少,但是发送邮件的类使用的朋友比较多啊,下面我来分别给大家介绍PHP邮件接收与发送类实现程序详解,希望对大家所有帮助哦。 主要的改进如下: 1、新增了listMessages方法,用于列表邮件列表,且带有分页功能,更加方便调用: /
  我想使用邮件接收类的朋友可能比较少,但是发送邮件的类使用的朋友比较多啊,下面我来分别给大家介绍PHP邮件接收与发送类实现程序详解,希望对大家所有帮助哦。
 
  主要的改进如下:
 
  1、新增了listMessages方法,用于列表邮件列表,且带有分页功能,更加方便调用:
 
  /**
   * listMessages - 获取邮件列表
   * @param $page - 第几页
   * @param $per_page - 每页显示多少封邮件
   * @param $sort - 邮件排序,如:array('by' => 'date', 'direction' => 'desc')
   * */
  function listMessages($page = 1, $per_page = 25, $sort = null){}
  2、新增了两个编码转换的方法,主要用于对邮件的相关信息进行编码转换,调用方法如下:
 
  include("receivemail.class.php");
  $obj = receiveMail('abc@abc.com','xxxxxx','abc@abc.com','pop.abc.com','pop3','110', false);
  $obj->connect();
  $maillist = $obj->listMessages();
  print_r($maillist);
  运行结果大致如下:
  Array
  (
      [res] => Array
          (
           [0] => stdClass Object
            (
             [subject] => 解决PHP邮件接收类的乱码问题
             [from] => xxx <xxx@phper.org.cn>
             [to] => abc <abc@abc.com>
             [date] => Mon, 28 Jan 2013 14:23:06 +0800 (CST)
             [message_id] => <2afc51061915f95-00004.Richmail.00037000523146269922@xxx.com>
                      [size] => 42259
                      [uid] => 1
                      [msgno] => 1
                      [recent] => 1
                      [flagged] => 0
                      [answered] => 0
                      [deleted] => 0
                      [seen] => 0
                      [draft] => 0
                      [body] => 邮件内容
            )
          )
   [start] => 1
      [limit] => 25
      [sorting] => Array
          (
              [by] =>  
              [direction] =>  
          )
      [total] => 47
      [pages] => 2
  )
  receivemail.class.php类文件,代码如下:
 
  <?php
  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)
    {
     echo "Error: Connecting to mail server";
     exit;
    }
   }
  
   function listMessages($page = 1, $per_page = 25, $sort = null)  
    {
         $limit = ($per_page * $page);
         $start = ($limit - $per_page) + 1;
         $start = ($start < 1) ? 1 : $start;
         $limit = (($limit - $start) != ($per_page-1)) ? ($start + ($per_page-1)) : $limit;
         $info = imap_check($this->marubox);
         $limit = ($info->Nmsgs < $limit) ? $info->Nmsgs : $limit;
  
         if(true === is_array($sort))  
         {
             $sorting = array(
                 'direction' => array( 'asc' => 0, 'desc' => 1),
                 'by'        => array('date' => SORTDATE, 'arrival' => SORTARRIVAL,
                                     'from' => SORTFROM, 'subject' => SORTSUBJECT, 'size' => SORTSIZE));
             $by = (true === is_int($by = $sorting['by'][$sort[0]])) ? $by : $sorting['by']['date'];
             $direction = (true === is_int($direction = $sorting['direction'][$sort[1]])) ? $direction : $sorting['direction']['desc'];
             $sorted = imap_sort($this->marubox, $by, $direction);
             $msgs = array_chunk($sorted, $per_page);
             $msgs = $msgs[$page-1];
         }
         else  
         {
             $msgs = range($start, $limit); //just to keep it consistent
         }
         $result = imap_fetch_overview($this->marubox, implode($msgs, ','), 0);
         if(false === is_array($result)) return false;
  
         foreach ($result as $k => $r)
         {
           $result[$k]->subject = $this->_imap_utf8($r->subject);
           $result[$k]->from = $this->_imap_utf8($r->from);
           $result[$k]->to = $this->_imap_utf8($r->to);
     $result[$k]->body = $this->getBody($r->msgno);
         }
         //sorting!
         if(true === is_array($sorted))  
         {
             $tmp_result = array();
             foreach($result as $r)
             {
               $tmp_result[$r->msgno] = $r;
             }
  
             $result = array();
             foreach($msgs as $msgno)  
             {
      $result[] = $tmp_result[$msgno];
             }
         }
  
         $return = array('res' => $result,
                         'start' => $start,
                         'limit' => $limit,
                         'sorting' => array('by' => $sort[0], 'direction' => $sort[1]),
                         'total' => imap_num_msg($this->marubox));
         $return['pages'] = ceil($return['total'] / $per_page);
         return $return;
     }
  
   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')
    {
     $mail_details=array(
       'from'=>strtolower($sender->mailbox).'@'.$sender->host,
       'fromName'=>$sender->personal,
       'toOth'=>strtolower($sender_replyto->mailbox).'@'.$sender_replyto->host,
       'toNameOth'=>$sender_replyto->personal,
       'subject'=>$mail_header->subject,
       '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) {  
     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);  
      }  
      else if($structure->encoding == 4)  
      {  
       return imap_qprint($text);  
      }  
      else
      {  
       return $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;
    $headers=imap_headers($this->marubox);
    return count($headers);
   }
   function GetAttach($mid,$path) // Get Atteced File from Mail
   {
    if(!$this->marubox)
    {
     return false;
    }
    $struckture = imap_fetchstructure($this->marubox,$mid);
    $ar="";
    if($struckture->parts)
          {
     foreach($struckture->parts as $key => $value)
     {
      $enc=$struckture->parts[$key]->encoding;
      if($struckture->parts[$key]->ifdparameters)
      {
       $name=$struckture->parts[$key]->dparameters[0]->value;
       $message = imap_fetchbody($this->marubox,$mid,$key+1);
       switch ($enc)
       {
        case 0:
         $message = imap_8bit($message);
         break;
        case 1:
         $message = imap_8bit ($message);
         break;
        case 2:
         $message = imap_binary ($message);
         break;
        case 3:
         $message = imap_base64 ($message);  
         break;
        case 4:
         $message = quoted_printable_decode($message);
         break;
        case 5:
         $message = $message;
         break;
       }
       $fp=fopen($path.$name,"w");
       fwrite($fp,$message);
       fclose($fp);
       $ar=$ar.$name.",";
      }
      // Support for embedded attachments starts here
      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=$struckture->parts[$key]->parts[$keyb]->dparameters[0]->value;
         $partnro = ($key+1).".".($keyb+1);
         $message = imap_fetchbody($this->marubox,$mid,$partnro);
         switch ($enc)
         {
          case 0:
             $message = imap_8bit($message);
           break;
          case 1:
             $message = imap_8bit ($message);
           break;
          case 2:
             $message = imap_binary ($message);
           break;
          case 3:
             $message = imap_base64 ($message);
           break;
          case 4:
             $message = quoted_printable_decode($message);
           break;
          case 5:
             $message = $message;
           break;
         }
         $fp=fopen($path.$name,"w");
         fwrite($fp,$message);
         fclose($fp);
         $ar=$ar.$name.",";
        }
       }
      }     
     }
    }
    $ar=substr($ar,0,(strlen($ar)-1));
    return $ar;
   }
  
   function getBody($mid) // 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 "";
    }
    return $this->_iconv_utf8($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 _imap_utf8($text)
   {
    if(preg_match('/=?([a-zA-z0-9-]+)?(.*)?=/i', $text, $match))
    {
     $text = imap_utf8($text);
     if(strtolower(substr($match[1], 0, 2)) == 'gb')
     {
      $text = iconv('gbk', 'utf-8', $text);
     }
     return $text;
    }
    return $this->_iconv_utf8($text);
   }
  
   function _iconv_utf8($text)
   {
    $s1 = iconv('gbk', 'utf-8', $text);
    $s0 = iconv('utf-8', 'gbk', $s1);
    if($s0 == $text)
    {
     return $s1;
    }
    else
    {
     return $text;
    }
   }
  }
  下面是一个php邮件发送的类的一个函数,代码如下:
 
  function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
      {
          $mail_from = $this->get_address($this->strip_comment($from));
          $body = ereg_replace("(^|(rn))(.)", "1.3", $body);
          $header = "MIME-Version:1.0rn";
          if($mailtype=="HTML"){
              $header .= "Content-Type:text/htmlrn";
          }
          $header .= "To: ".$to."rn";
          if ($cc != "") {
              $header .= "Cc: ".$cc."rn";
          }
          $header .= "From: 报名邮件.<".$from.">rn";
          $header .= "Subject: ".$subject."rn";
          $header .= $additional_headers;
          $header .= "Date: ".date("r")."rn";
          $header .= "X-Mailer:By Redhat (PHP/".phpversion().")rn";
    $utfheader=iconv("UTF-8","GB2312",$header);
          list($msec, $sec) = explode(" ", microtime());
          $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">rn";
          $TO = explode(",", $this->strip_comment($to));
          if ($cc != "") {
              $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
          }
          if ($bcc != "") {
              $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
          }
          $sent = TRUE;
          foreach ($TO as $rcpt_to) {
              $rcpt_to = $this->get_address($rcpt_to);
              if (!$this->smtp_sockopen($rcpt_to)) {
                  $this->log_write("Error: Cannot send email to ".$rcpt_to."n");
                  $sent = FALSE;
                  continue;
              }
              if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $utfheader, $body)) {
                  $this->log_write("E-mail has been sent to <".$rcpt_to.">n");
              } else {
                  $this->log_write("Error: Cannot send email to <".$rcpt_to.">n");
                  $sent = FALSE;
              }
              fclose($this->sock);
              $this->log_write("Disconnected from remote hostn");
          }
          return $sent;
      } 

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读