php中使用smtp類輕松的發(fā)送電子郵件示例
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-01-18 02:37:00 閱讀次數(shù):3602次
smtp發(fā)送郵箱個(gè)人覺(jué)得比php mail函數(shù)要實(shí)用的多了,mail函數(shù)不是隨便可以發(fā)郵箱的需要進(jìn)行相關(guān)配置哦,下面我們來(lái)看一個(gè)關(guān)于smtp類發(fā)送郵箱與問(wèn)題解決方法。
當(dāng)你還在糾結(jié)php內(nèi)置的mail()函數(shù)不能發(fā)送郵件時(shí),那么你現(xiàn)在很幸運(yùn),此時(shí)的這篇文章可以幫助到你!
php利用smtp類來(lái)發(fā)郵件真是屢試不爽,我用過(guò)很久了,基本上沒(méi)出過(guò)問(wèn)題。本博客后臺(tái),當(dāng)博主回復(fù)留言時(shí)候,會(huì)自動(dòng)給網(wǎng)友發(fā)一封有新回復(fù)提示的郵件也是用的本文這個(gè)方法實(shí)現(xiàn)的。
smtp類發(fā)送郵件的方法其實(shí)很簡(jiǎn)單,也很穩(wěn)定,類是別人已經(jīng)寫(xiě)好的了,你只需要調(diào)用就行了。幾行簡(jiǎn)單的配置就能發(fā)郵件,是不是很期待的試一試呢!
email.class.php文件,代碼如下:
- <?php
- class smtp
-
- {
-
-
-
- var $smtp_port;
-
- var $time_out;
-
- var $host_name;
-
- var $log_file;
-
- var $relay_host;
-
- var $debug;
-
- var $auth;
-
- var $user;
-
- var $pass;
-
-
- var $sock;
-
-
-
- function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
-
- {
-
- $this->debug = FALSE;
-
- $this->smtp_port = $smtp_port;
-
- $this->relay_host = $relay_host;
-
- $this->time_out = 30;
- #
-
- $this->auth = $auth;
-
- $this->user = $user;
-
- $this->pass = $pass;
-
- #
-
- $this->host_name = "localhost";
- $this->log_file = "";
-
- $this->sock = FALSE;
-
- }
-
-
-
- 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<".$from.">rn";
-
- $header .= "Subject: ".$subject."rn";
-
- $header .= $additional_headers;
-
- $header .= "Date: ".date("r")."rn";
-
- $header .= "X-Mailer:By Redhat (PHP/".phpversion().")rn";
-
- 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, $header, $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;
-
- }
-
-
-
- function smtp_send($helo, $from, $to, $header, $body = "")
-
- {
-
- if (!$this->smtp_putcmd("HELO", $helo)) {
-
- return $this->smtp_error("sending HELO command");
-
- }
-
- #auth
-
- if($this->auth){
-
- if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
-
- return $this->smtp_error("sending HELO command");
-
- }
-
- if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
-
- return $this->smtp_error("sending HELO command");
-
- }
-
- }
-
- #
-
- if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {
-
- return $this->smtp_error("sending MAIL FROM command");
-
- }
-
- if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {
-
- return $this->smtp_error("sending RCPT TO command");
-
- }
-
- if (!$this->smtp_putcmd("DATA")) {
-
- return $this->smtp_error("sending DATA command");
-
- }
-
- if (!$this->smtp_message($header, $body)) {
-
- return $this->smtp_error("sending message");
-
- }
-
- if (!$this->smtp_eom()) {
-
- return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
-
- }
-
- if (!$this->smtp_putcmd("QUIT")) {
-
- return $this->smtp_error("sending QUIT command");
-
- }
-
- return TRUE;
-
- }
-
- function smtp_sockopen($address)
-
- {
-
- if ($this->relay_host == "") {
-
- return $this->smtp_sockopen_mx($address);
-
- } else {
-
- return $this->smtp_sockopen_relay();
-
- }
-
- }
-
- function smtp_sockopen_relay()
-
- {
-
- $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."n");
-
- $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
-
- if (!($this->sock && $this->smtp_ok())) {
-
- $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."n");
-
- $this->log_write("Error: ".$errstr." (".$errno.")n");
-
- return FALSE;
-
- }
-
- $this->log_write("Connected to relay host ".$this->relay_host."n");
-
- return TRUE;;
-
- }
-
- function smtp_sockopen_mx($address)
-
- {
-
- $domain = ereg_replace("^.+@([^@]+)$", "1", $address);
-
- if (!@getmxrr($domain, $MXHOSTS)) {
-
- $this->log_write("Error: Cannot resolve MX "".$domain.""n");
-
- return FALSE;
-
- }
-
-
- foreach ($MXHOSTS as $host) {
-
- $this->log_write("Trying to ".$host.":".$this->smtp_port."n");
-
- $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
-
- if (!($this->sock && $this->smtp_ok())) {
-
- $this->log_write("Warning: Cannot connect to mx host ".$host."n");
-
- $this->log_write("Error: ".$errstr." (".$errno.")n");
-
- continue;
-
- }
-
- $this->log_write("Connected to mx host ".$host."n");
-
- return TRUE;
-
- }
-
- $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")n");
-
- return FALSE;
-
- }
-
- function smtp_message($header, $body)
-
- {
-
- fputs($this->sock, $header."rn".$body);
-
- $this->smtp_debug("> ".str_replace("rn", "n"."> ", $header."n> ".$body."n> "));
-
- return TRUE;
-
- }
-
- function smtp_eom()
-
- {
-
- fputs($this->sock, "rn.rn");
-
- $this->smtp_debug(". [EOM]n");
-
- return $this->smtp_ok();
-
- }
-
- function smtp_ok()
-
- {
-
- $response = str_replace("rn", "", fgets($this->sock, 512));
-
- $this->smtp_debug($response."n");
-
- if (!ereg("^[23]", $response)) {
-
- fputs($this->sock, "QUITrn");
-
- fgets($this->sock, 512);
-
- $this->log_write("Error: Remote host returned "".$response.""n");
-
- return FALSE;
-
- }
-
- return TRUE;
-
- }
-
- function smtp_putcmd($cmd, $arg = "")
-
- {
-
- if ($arg != "") {
-
- if($cmd=="") $cmd = $arg;
-
- else $cmd = $cmd." ".$arg;
-
- }
-
- fputs($this->sock, $cmd."rn");
-
- $this->smtp_debug("> ".$cmd."n");
-
- return $this->smtp_ok();
-
- }
-
- function smtp_error($string)
-
- {
-
- $this->log_write("Error: Error occurred while ".$string.".n");
-
- return FALSE;
-
- }
-
- function log_write($message)
-
- {
-
- $this->smtp_debug($message);
-
- if ($this->log_file == "") {
-
- return TRUE;
-
- }
-
- $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
-
- if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
-
- $this->smtp_debug("Warning: Cannot open log file "".$this->log_file.""n");
-
- return FALSE;;
-
- }
-
- flock($fp, LOCK_EX);
-
- fputs($fp, $message);
-
- fclose($fp);
-
-
- return TRUE;
-
- }
-
-
- function strip_comment($address)
-
- {
-
- $comment = "([^()]*)";
-
- while (ereg($comment, $address)) {
-
- $address = ereg_replace($comment, "", $address);
-
- }
-
-
- return $address;
-
- }
-
-
- function get_address($address)
-
- {
-
- $address = ereg_replace("([ trn])+", "", $address);
-
- $address = ereg_replace("^.*<(.+)>.*$", "1", $address);
-
- return $address;
-
- }
-
- function smtp_debug($message)
-
- {
-
- if ($this->debug) {
-
- echo $message;
-
- }
-
- }
-
- }
-
- ?>
發(fā)送郵箱的php文件,代碼如下:
- <?php
-
- require_once "email.class.php";
-
-
-
- $smtpserver = "smtp.126.com";
-
- $smtpserverport =25;
-
- $smtpusermail = "new2008oh@126.com";
-
- $smtpemailto = $_POST['toemail'];
-
- $smtpuser = "new2008oh";
-
- $smtppass = "您的郵箱密碼";
-
- $mailtitle = $_POST['title'];
-
- $mailcontent = "<h1>".$_POST['content']."</h1>";
-
- $mailtype = "HTML";
-
-
-
- $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);
-
- $smtp->debug = false;
-
- $state = $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);
-
-
- echo "<div style='width:300px; margin:36px auto;'>";
-
- if($state==""){
-
- echo "對(duì)不起,郵件發(fā)送失敗!請(qǐng)檢查郵箱填寫(xiě)是否有誤。";
-
- echo "<a href='index.html'>點(diǎn)此返回</a>";
-
- exit();
-
- }
- echo "恭喜!郵件發(fā)送成功!!";
- echo "<a href='index.html'>點(diǎn)此返回</a>";
- echo "</div>";
- ?>
smtp類無(wú)法發(fā)送郵件解決方法,偶然發(fā)現(xiàn)我網(wǎng)站后臺(tái)自動(dòng)發(fā)送郵件功能不能用了,報(bào)這個(gè)錯(cuò)誤:
Trying to smtp.126.com:25 Error: Cannot connenct to relay host smtp.126.com Error: () Error: Cannot send email to web@daixiaorui.com state
大概意思是:無(wú)法connenct中繼主機(jī)smtp.126.com 錯(cuò)誤:()錯(cuò)誤:無(wú)法發(fā)送電子郵件給web@daixiaorui.com
上網(wǎng)找了n多資料后終于找到了解決方案,不是smtp類的問(wèn)題,而就是linux配置的問(wèn)題。原來(lái)是服務(wù)器的php.ini 禁用了fsockopen函數(shù)。
打開(kāi)空間下的php.ini文件,linux空間一般都可以自定義php.ini,所以根目錄下面一般會(huì)有這個(gè)文件。
有兩個(gè)地方可能禁用此函數(shù):
1. allow_url_fopen = On 查看等于后面是否為 ON,如果為OFF時(shí)函數(shù)將被禁用
2. disable_functions = fsockopen pfsockopen (我的就是這樣)這里應(yīng)該去掉前面的“fsockopen”。使之變成:disable_functions = pfsockopen
改過(guò)之后,保存,再重新刷新頁(yè)面,就發(fā)現(xiàn)在linux下能成功利用smtp類發(fā)送電子郵件了。感謝網(wǎng)友分享的方法,問(wèn)題終于得到了解決。
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)