PHP发送电子邮件
1、导入文件,如本案例把Stmp.class.php放到Common\Common目录下,代码很多,直接复制就行!
1 <?php 2 namespace Common\Common; 3 4 class Smtp 5 { 6 /* Public Variables */ 7 var $smtp_port; 8 var $time_out; 9 var $host_name; 10 var $log_file; 11 var $relay_host; 12 var $debug; 13 var $auth; 14 var $user; 15 var $pass; 16 17 /* Private Variables */ 18 var $sock; 19 20 /* Constractor */ 21 22 function __construct($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass) 23 { 24 $this->debug = FALSE; 25 $this->smtp_port = $smtp_port; 26 $this->relay_host = $relay_host; 27 $this->time_out = 30; //is used in fsockopen() 28 29 # 30 31 $this->auth = $auth;//auth 32 $this->user = $user; 33 $this->pass = $pass; 34 35 # 36 37 $this->host_name = "localhost"; //is used in HELO command 38 $this->log_file = ""; 39 $this->sock = FALSE; 40 } 41 /* Main Function */ 42 43 function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") 44 { 45 $mail_from = $this->get_address($this->strip_comment($from)); 46 $body = ereg_replace("(^|(\r\n))(\.)", "\1.\3", $body); 47 $header = "MIME-Version:1.0\r\n"; 48 49 if($mailtype=="HTML"){ 50 $header .= "Content-Type:text/html\r\n"; 51 } 52 53 $header .= "To: ".$to."\r\n"; 54 55 if ($cc != "") { 56 $header .= "Cc: ".$cc."\r\n"; 57 } 58 59 $header .= "From: 在线图书系统<".$from.">\r\n"; 60 $header .= "Subject: ".$subject."\r\n"; 61 $header .= $additional_headers; 62 $header .= "Date: ".date("r")."\r\n"; 63 $header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r\n"; 64 $utfheader=iconv("UTF-8","GB2312",$header); 65 list($msec, $sec) = explode(" ", microtime()); 66 67 $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r\n"; 68 69 $TO = explode(",", $this->strip_comment($to)); 70 71 if ($cc != "") { 72 $TO = array_merge($TO, explode(",", $this->strip_comment($cc))); 73 } 74 75 76 if ($bcc != "") { 77 $TO = array_merge($TO, explode(",", $this->strip_comment($bcc))); 78 } 79 80 $sent = TRUE; 81 82 foreach ($TO as $rcpt_to) { 83 $rcpt_to = $this->get_address($rcpt_to); 84 85 if (!$this->smtp_sockopen($rcpt_to)) { 86 $this->log_write("Error: Cannot send email to ".$rcpt_to."\n"); 87 $sent = FALSE; 88 continue; 89 } 90 91 if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $utfheader, $body)) { 92 $this->log_write("E-mail has been sent to <".$rcpt_to.">\n"); 93 } else { 94 $this->log_write("Error: Cannot send email to <".$rcpt_to.">\n"); 95 $sent = FALSE; 96 } 97 98 fclose($this->sock); 99 100 $this->log_write("Disconnected from remote host\n"); 101 } 102 return $sent; 103 } 104 /* Private Functions */ 105 function smtp_send($helo, $from, $to, $header, $body = "") 106 { 107 if (!$this->smtp_putcmd("HELO", $helo)) { 108 109 return $this->smtp_error("sending HELO command"); 110 } 111 112 #auth 113 114 if($this->auth){ 115 if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) { 116 return $this->smtp_error("sending HELO command"); 117 } 118 119 if (!$this->smtp_putcmd("", base64_encode($this->pass))) { 120 return $this->smtp_error("sending HELO command"); 121 } 122 } 123 124 # 125 126 if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) { 127 return $this->smtp_error("sending MAIL FROM command"); 128 } 129 130 if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) { 131 return $this->smtp_error("sending RCPT TO command"); 132 } 133 134 if (!$this->smtp_putcmd("DATA")) { 135 return $this->smtp_error("sending DATA command"); 136 } 137 if (!$this->smtp_message($header, $body)) { 138 return $this->smtp_error("sending message"); 139 } 140 if (!$this->smtp_eom()) { 141 return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]"); 142 } 143 if (!$this->smtp_putcmd("QUIT")) { 144 return $this->smtp_error("sending QUIT command"); 145 } 146 return TRUE; 147 } 148 149 function smtp_sockopen($address) 150 { 151 if ($this->relay_host == "") { 152 return $this->smtp_sockopen_mx($address); 153 } else { 154 return $this->smtp_sockopen_relay(); 155 } 156 } 157 function smtp_sockopen_relay() 158 { 159 $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."\n"); 160 $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out); 161 if (!($this->sock && $this->smtp_ok())) { 162 $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."\n"); 163 $this->log_write("Error: ".$errstr." (".$errno.")\n"); 164 return FALSE; 165 } 166 $this->log_write("Connected to relay host ".$this->relay_host."\n"); 167 return TRUE; 168 } 169 170 function smtp_sockopen_mx($address) 171 { 172 $domain = ereg_replace("^.+@([^@]+)$", "\1", $address); 173 if (!@getmxrr($domain, $MXHOSTS)) { 174 $this->log_write("Error: Cannot resolve MX \"".$domain."\"\n"); 175 return FALSE; 176 } 177 foreach ($MXHOSTS as $host) { 178 $this->log_write("Trying to ".$host.":".$this->smtp_port."\n"); 179 $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out); 180 if (!($this->sock && $this->smtp_ok())) { 181 $this->log_write("Warning: Cannot connect to mx host ".$host."\n"); 182 $this->log_write("Error: ".$errstr." (".$errno.")\n"); 183 continue; 184 } 185 $this->log_write("Connected to mx host ".$host."\n"); 186 return TRUE; 187 } 188 $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")\n"); 189 return FALSE; 190 } 191 192 function smtp_message($header, $body) 193 { 194 fputs($this->sock, $header."\r\n".$body); 195 $this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> ")); 196 return TRUE; 197 } 198 199 function smtp_eom() 200 { 201 fputs($this->sock, "\r\n.\r\n"); 202 $this->smtp_debug(". [EOM]\n"); 203 return $this->smtp_ok(); 204 } 205 206 function smtp_ok() 207 { 208 $response = str_replace("\r\n", "", fgets($this->sock, 512)); 209 $this->smtp_debug($response."\n"); 210 if (!ereg("^[23]", $response)) { 211 fputs($this->sock, "QUIT\r\n"); 212 fgets($this->sock, 512); 213 $this->log_write("Error: Remote host returned \"".$response."\"\n"); 214 return FALSE; 215 } 216 return TRUE; 217 } 218 219 function smtp_putcmd($cmd, $arg = "") 220 { 221 if ($arg != "") { 222 if($cmd=="") $cmd = $arg; 223 else $cmd = $cmd." ".$arg; 224 } 225 fputs($this->sock, $cmd."\r\n"); 226 $this->smtp_debug("> ".$cmd."\n"); 227 return $this->smtp_ok(); 228 } 229 230 function smtp_error($string) 231 { 232 $this->log_write("Error: Error occurred while ".$string.".\n"); 233 return FALSE; 234 } 235 236 function log_write($message) 237 { 238 $this->smtp_debug($message); 239 if ($this->log_file == "") { 240 return TRUE; 241 } 242 $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message; 243 if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) { 244 $this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"\n"); 245 return FALSE;; 246 } 247 flock($fp, LOCK_EX); 248 fputs($fp, $message); 249 fclose($fp); 250 return TRUE; 251 } 252 253 function strip_comment($address) 254 { 255 $comment = "\([^()]*\)"; 256 while (ereg($comment, $address)) { 257 $address = ereg_replace($comment, "", $address); 258 } 259 return $address; 260 } 261 262 function get_address($address) 263 { 264 $address = ereg_replace("([ \t\r\n])+", "", $address); 265 $address = ereg_replace("^.*<(.+)>.*$", "\1", $address); 266 return $address; 267 } 268 function smtp_debug($message) 269 { 270 if ($this->debug) { 271 echo $message; 272 } 273 } 274 } 275 ?>
2、设置配置文件 Commom\Conf 目录下的 config.php
1 // 配置邮件发送服务器 2 'THINK_EMAIL' => array( 3 'SMTP_HOST' => 'smtp.163.com', //SMTP服务器 4 'SMTP_PORT' => '25', //SMTP服务器端口 5 'SMTP_USER' => '*******@163.com', //SMTP服务器用户名,你的邮箱名 6 'SMTP_PASS' => '*******', //SMTP服务器密码,邮箱密码 7 'FROM_EMAIL' => '********@163.com', //发件人EMAIL 8 'FROM_NAME' => '********', //发件人名称 9 'REPLY_EMAIL' => '', //回复EMAIL(留空则为发件人EMAIL) 10 'REPLY_NAME' => '', //回复名称(留空则为发件人名称) 11 ),
3、具体使用
/* * 【执行发送邮箱验证码】 * * @access private * @param string $smtpemailto 收件人邮箱 * @param string $mailsubject 邮件主题 * @param string $mailbody 邮件内容 * @param string $mailtype 邮件格式 * @return boolean * **/ private function executeSendEmailCode($smtpemailto, $mailsubject, $mailbody, $mailtype = "HTML"){ $config_mail = C('THINK_EMAIL');//获取配置信息 $smtpserver = $config_mail['SMTP_HOST'];//SMTP服务器 $smtpserverport = $config_mail['SMTP_PORT'];//SMTP服务器端口 $smtpusermail = $config_mail['FROM_EMAIL'];//SMTP服务器的用户邮箱 $smtpuser = $config_mail['SMTP_USER'];//SMTP服务器的用户帐号 $smtppass = $config_mail['SMTP_PASS'];//SMTP服务器的用户密码 $mailtime = date("Y-m-d H:i:s"); $utfmailbody = iconv("UTF-8","GB2312",$mailbody);//转换邮件编码 // $mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件 $smtp = new Smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证. $smtp->debug = FALSE;//是否显示发送的调试信息 FALSE or TRUE $ret = $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $utfmailbody, $mailtype); return $ret; }
2016-09-28
生命不息,学习不止