- A+
所属分类: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、新增了两个编码转换的方法,主要用于对邮件的相关信息进行编码转换。
调用方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
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 ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 |
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; } } } |
function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")面是一个php邮件发送的类的一个函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
{ $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");//发送邮件类我们如何调用这个类呢?
再看示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
####################--发邮件--#################### $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的邮箱。 在上面的代码中,修改成你自己注册的邮箱地址和用户名、密码即可。