首頁 >後端開發 >php教程 >兩種PHP郵件發送的方式

兩種PHP郵件發送的方式

小云云
小云云原創
2018-05-14 16:19:5434999瀏覽

有不少程式設計師在用PHP發送郵件的時候會遇到幾個問題,那麼遇到問題就要有解決問題的思路,本文就是根據php實現郵件發送的思路,整理下來的一篇文章,在遇到不同問題時給予的不同解決方法,有興趣的夥伴可以參考一下。

一、使用PHP內建的mail()函數

<?php 
$to = "test@163.com"; //收件人 
$subject = "Test"; //主题 
$message = "This is a test mail!"; //正文 
mail($to,$subject,$message);

結果就直接報錯,如下:

Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() inD:/www/Zend/email/email.php on line 10

分析原因:本機需要有SMTP伺服器,又改了下程式碼:

<?php 
$to = "test@163.com";//收件人 
$subject = "Test";//邮件主题 
$message = "This is a test mail!";//邮件正文 
ini_set(&#39;SMTP&#39;,&#39;smtp.163.com&#39;);//发件SMTP服务器 
ini_set(&#39;smtp_port&#39;,25);//发件SMTP服务器端口 
ini_set(&#39;sendmail_from&#39;,"admin@163.com");//发件人邮箱 
mail($to,$subject,$message);

  結果還是錯誤:

Warning: mail() [function.mail]: SMTP server response: 553 authentication is required,smtp2,DNGowKD7v5BTDo9NnplVBA--.1171S2 1301220947 inD:/www/Zend/email/email.php on line 9

分析原因:需要驗證訊息,怎麼寫驗證訊息呢?在哪裡配置呢?帶著這些問題參考一些技術文章後得出結論,使用mail()函數發送郵件就必須要有一台無需SMTP驗證就可以發信的郵件伺服器。但現在的SMTP郵件伺服器基本上都是需要驗證的,所以要使用它寄郵件就只能自己在本地搭一個不需要驗證的SMTP伺服器。搭建方法:用windows自備的IIS就可以,或是從網路下載其他的SMTP伺服器軟體。

結論:使用mail()函數傳送郵件,就必須要有一台不需要驗證的SMTP伺服器。這樣的話配置工作會多一點,但是使用的時候就比較省事了,幾行程式碼就可以。

二、使用封裝SMTP協定的郵件類別

這種方法就比較常見了,尤其對於廣大自己沒有伺服器,從網路上購買虛擬主機的同學,第一種方法不現實,所以還是自己使用SMTP協定來傳送郵件吧。

不過要完成這項工作的話,就需要你對SMTP協議有一定的了解,喜歡事必躬親的同學可以自己動手寫一個,喜歡拿來主義的同學就可以從網上下載了,有很多。

不過我比較建議使用PEAR擴充功能中的Mail類,功能強大:可以支援純文字、HTML格式的郵件;各欄位都可設定編碼,正確設定不會出現中文亂碼狀況;可以支援附件等等。

在伺服器可以使用pear install Mail 指令快速安裝,沒有足夠伺服器權限的同學也可以直接下載類別的PHP原始碼包含進來就可以了。

附註:Mail類別依賴  Net/SMTP.php  和 Mail/mime.php ,要一塊下載,使用時一塊包含進來。

下面我舉例說明一下在Mail類別中傳送郵件的方法吧,網路上其他SMTP郵件類別使用方法一塊也類似,可以參考:  

<?php 
// Pear Mail 扩展 
require_once(&#39;Mail.php&#39;); 
require_once(&#39;Mail/mime.php&#39;); 
require_once(&#39;Net/SMTP.php&#39;); 
   
$smtpinfo = array(); 
$smtpinfo["host"] = "smtp.163.com";//SMTP服务器 
$smtpinfo["port"] = "25"; //SMTP服务器端口 
$smtpinfo["username"] = "username@163.com"; //发件人邮箱 
$smtpinfo["password"] = "password";//发件人邮箱密码 
$smtpinfo["timeout"] = 10;//网络超时时间,秒 
$smtpinfo["auth"] = true;//登录验证 
//$smtpinfo["debug"] = true;//调试模式 
// 收件人列表 
$mailAddr = array(&#39;receiver@163.com&#39;); 
// 发件人显示信息 
$from = "Name <username@163.com>"; 
// 收件人显示信息 
$to = implode(&#39;,&#39;,$mailAddr); 
// 邮件标题 
$subject = "这是一封测试邮件"; 
// 邮件正文 
$content = "<h3>随便写点什么</h3>"; 
// 邮件正文类型,格式和编码 
$contentType = "text/html; charset=utf-8"; 
//换行符号 Linux: \n Windows: \r\n 
$crlf = "\n"; 
$mime = new Mail_mime($crlf); 
$mime->setHTMLBody($content); 
$param[&#39;text_charset&#39;] = &#39;utf-8&#39;; 
$param[&#39;html_charset&#39;] = &#39;utf-8&#39;; 
$param[&#39;head_charset&#39;] = &#39;utf-8&#39;; 
$body = $mime->get($param);  
$headers = array(); 
$headers["From"] = $from; 
$headers["To"] = $to; 
$headers["Subject"] = $subject; 
$headers["Content-Type"] = $contentType; 
$headers = $mime->headers($headers);  
$smtp =& Mail::factory("smtp", $smtpinfo); 
$mail = $smtp->send($mailAddr, $headers, $body); 
$smtp->disconnect(); 
if (PEAR::isError($mail)) { 
  //发送失败 
  echo &#39;Email sending failed: &#39; . $mail->getMessage()."\n"; 
} 
else{ 
  //发送成功 
  echo "success!\n"; 
}

如果從網路找的SMTP類別都是高度封裝的,所以使用起來比上面會更簡單,但使用方法都是比較相似的。

結論:這種方式發送郵件無需裝任何軟體,只需要包含進來一個PHP類,然後多寫幾行配置代碼,就可以了。而且網路上有很多範例的程式碼,很多時候只要複製過來然後修改個別的幾個參數就可以用了,所以會很方便,推薦使用此方法。

不管遇到哪種問題,方法千種萬種,最重要的是要有解決問題的思路,希望這篇文章能為大家帶來啟發。

相關推薦:

功能強大的PHP發送郵件類別

PHP發送郵件的簡單類別

PHP發送郵件問題

#

以上是兩種PHP郵件發送的方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn