PHP邮件接收与发送类实现程序详解
我想使用邮件接收类的朋友可能比较少,但是发送邮件的类使用的朋友比较多啊,下面我来分别给大家介绍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的邮箱, 在上面的代码中,修改成你自己注册的邮箱地址和用户名、密码即可。
查看更多关于PHP邮件接收与发送类实现程序详解 - php高级应用的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did29902