PHP邮件接收与发送类实现程序详解
发布:smiling 来源: PHP粉丝网 添加日期:2014-01-25 23:16:08 浏览: 评论:0
我想使用邮件接收类的朋友可能比较少,但是发送邮件的类使用的朋友比较多啊,下面我来分别给大家介绍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为文本邮件
在这里需要一个smtp服务器,我们可以注册一个126的邮箱, 在上面的代码中,修改成你自己注册的邮箱地址和用户名、密码即可。
Tags: PHP 邮件 接收 发送 实现程序
相关文章
- ·PHP中通过Web 执行C/C++应用程序(2013-11-13)
- ·用PHP实现Ftp用户的在线管理(2013-11-13)
- ·用PHP自动把纯文本转换成Web页面(2013-11-13)
- ·用实例分析PHP5异常处理(2013-11-13)
- ·php5的simplexml解析错误(2013-11-13)
- ·PHP后门的隐藏技巧测试报告(2013-11-13)
- ·PHP缓存技术详谈(2013-11-27)
- ·利用PHP自定义错误处理器处理出错信息(2013-11-27)
- ·PHP作wap开发时遇到的问题(2013-11-27)
- ·php编写大型网站问题集(2013-11-27)
- ·php测试性能代码(2013-11-28)
- ·php 安全register globals设置为TRUE的危害(2013-11-28)
- ·XSLTProcessor 中 registerPHPFunctions 后无法调用 php 函数(2013-11-30)
- ·PHP中常用三种缓存技术(2013-11-30)
- ·新浪微博PHP版SDK的导致20007错误(2013-12-03)
- ·linux中phpMyAdmin错误提示Wrong permissions on configuration file, should no(2013-12-04)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)