我想使用郵件接收類的朋友可能比較少,但是發送郵件的類使用的朋友比較多啊,下面我來分別給大家介紹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;
 - }
 
我們如何調用這個類呢?示例代碼如下:
- include("sendmail.php");//發送郵件類
 - ####################--發郵件--####################
 - $smtpserver = "smtp.126.com";//SMTP服務器
 - $smtpserverport = 25;//SMTP服務器端口
 - $smtpusermail = "test@126.com";//SMTP服務器的用戶郵箱
 - $smtpuser = "test";//SMTP服務器的用戶帳號
 - $smtppass = "123456";//SMTP服務器的用戶密碼
 - $smtpemailto = "dianzhong@126.com";//發送給誰
 - $mailsubject = $username.'報名!';//郵件主題
 - $mailtime = date("Y-m-d H:i:s");
 - $mailbody = $content;//郵件內容
 - $utfmailbody = iconv("UTF-8","GB2312",$mailbody);//轉換郵件編碼
 - $mailtype = "HTML";//郵件格式(HTML/TXT),TXT為文本郵件
 
新聞熱點
疑難解答