首頁  >  文章  >  後端開發  >  php中mail()函數用法與SMTP運作原理詳解

php中mail()函數用法與SMTP運作原理詳解

伊谢尔伦
伊谢尔伦原創
2017-06-27 10:31:543392瀏覽

  一個發送E-MAIL的腳本也許是你能夠在Web 站點上找到的最普通的腳本之一了,雖然它很簡單,一個郵件腳本有時會令程序員非常沮喪.PHP中有一個叫做mail ()的函數,它只需要知道接收方的地址和信件主體就可以發送郵件,但是要讓mail()按你的意思運行你還需要解決一些棘手的問題.

  要使mail ()能夠運作,你必須有一個SMTP伺服器以便PHP能夠連接上去.不管這個伺服器對郵件程式多麼重要,大多數人對它如何運轉沒有一星半點的概念.在本教程中,我們將揭示SMTP 的秘密並解決一些使用PHP發送郵件的常見問題.而本文中的另一些主題將包括循環遍歷一個地址列表的方法以及同時以文本和HTML格式向接收者發送一個郵件的方法.

  SMTP 是簡單郵件傳輸協定(Simple Mail TransferProtocol)的縮寫,而一個SMTP伺服器是一台運行這種協定並發出郵件的電腦.運行這種協定實際上指的是運行諸如Sendmail和Qmail的程式--如果你使用的是非Windows電腦的話.在Windows平台上,作為Windows NT ServicePack一部分或是內建於Windows 2000內部的SMTP服務程式就是典型的這種程式.

#我並不是說SMTP軟體包就只有那些,但是它們是最普通的.如果你的Web站點使用了互聯網服務提供者的主機軟體包(Internet ServiceProvider's virtual hostingpackage)的一部分,那麼SMTP服務程序就應該已經在這台電腦上安裝了.如果你是一台位於ISP或是室內的電腦的系統管理員, 那麼你很有可能已經在這台電腦上安裝了某種SMTP軟體,用來處理從Web伺服器發送郵件的過程.

  但是,如果你是一個個人用戶並只有一個開發用的Web服務程式運行在你的個人電腦上,你可能沒有在自己的機器上運行SMTP軟體.下面是一個非常簡單但是準確的拇指定律:如果你是一個Windows用戶而從沒有看見SMTP伺服器這樣的字眼,那麼你就沒有運行這個程式.如果你確實沒有,那麼你有兩種選擇:安裝,配置,和維護一個SMTP服務程序(如果你不知道那是怎麼一回事的話就不推薦你使用這種方法)或者使用一個現存的SMTP伺服器.

  "如果一個伺服器現在沒有運作的話,我又怎麼使用它呢?"你可能要問.如果你的電腦是透過撥號連接(或是DSL或電纜)連到互聯網的話,你可以使用你ISP的外發郵件伺服器. 例如,如果你開發用的電腦是一個Windows98的系統並使用56kbpsmodem透過EarthLink連接到互聯網,那麼你就可以使用mail.earthlink.net作為你的SMTP伺服器.不論你對你的外發郵件伺服器使用什麼樣的郵件客戶端(Eudora, Outlook, NetscapeMail等等),它們都會和你的PHP程式碼使用你的SMTP伺服器的過程一樣.技巧就是讓PHP知道一點點事實.

#在php.ini管理設定檔裡,有幾個條目需要被設定以便mail()函數能夠正常運作.在改變它們以前,搞清楚它們都是做什麼用的.你可以使用phpinfo()函數透過建立一個檔案來顯示系統目前的設定狀況,這個檔案包含:

  儲存這個檔案,將它放置到你的網路服務程式的檔案根目錄,然後透過你的瀏覽器存取它.你應該可以看到一個被優美的格式化了的信息,顯示你的配置情況.你要查看的條目如下:

  SMTP

  sendmail_from

  sendmail_path

  如果你沒有使用windows,那麼sendmail_path指令就是你唯一要擔心的東西.如果你正在使用Windows,你就需要看看最後兩個指令.

  如果你使用的是Linux或是一個Unix變種,sendmail_path看起來應該像這樣:

  sendmail_path = /usr/sbin/sendmail

  或如果你使用Qmail:

  sendmail_path = /var/qmail/bin/sendmail

  在這條指令裡,你還可以設定配置參數來指明隊列緩衝選項或是顯示的設定Return-Path頭,如下所示:

  sendmail_path = /usr/sbin/sendmail -t-fyou@yourdomain.com

  作為一個非Windows用戶,這就是你要做的一切了.如果你使用的是Windows,你有更多的事情要做.你還需要看一看SMTP和sendmail_from的值.不要被sendmail_from指令名字中的sendmail弄迷糊了.雖然你沒有在Windows上使用名叫Sendmail的程式,但那隻是指令的名字.不要被它嚇到了.

  在你的phpinfo()顯示的結果裡,看看SMTP和sendmail_from的缺省值--它們要么是空白,要么包含了胡亂的值.你應該把它們改成有意義的值.

  如果你決心在這台電腦上運行一個SMTP服務程序,你在php.ini文件中的條目就應該如下:

  SMTP = localhost

  但是,如果你要使用你ISP(在這個範例中是EarthLink)的外寄郵件伺服器,那麼php.ini中的郵件看起來應該如下:

  SMTP = mail.earthlink.net

#  你也可以使用IP位址而不是網域名稱,因為電腦不區分這兩種條目.

  第二條設定指令是sendmail_from,它應該被設定成From頭中的電子郵件地址.它可以在腳本裡被修改但是通常作為缺省值使用.下面就是這個配置指令的範例youraddress@yourdomain.com指的是你自己的郵件地址.

  sendmail_from =youraddress@yourdomain.com

在做了這些配置上的改動以後,重啟Web服務程序然後使用phpinfo()函數來驗證這些修改.在這些工作完成以後,你就可以用PHP來發送電子郵件了.

  mail( )函數是非常簡單的:只有五個參數,而其中的兩個是可選的.這些參數是:

  接收方地址

  主題

#  信件內容

  其它檔案資訊頭(可選)

  SMTP服務程式的其它配置選項(可選)

  附加的頭參數控制了諸如CC, BCC, Reply- To之類的郵件功能,或者其它遵循SMTP協議的功能.在這個例子中,我只使用From 和Reply-To信息頭.

  如果你想給我發郵件但你使用的是一個非Windows系統, 程式碼就應該如下: 

   $to= "julie@thickbook.com";
  $subject = "ZDNet Developer article";
  $msg = "I completely understand SMTP servers now!";
  $headers = "From:me@mycompany.comnReply-To:someoneelse@mycompany.com";
  $config = "-fwebmaster@mycompany.com";
  mail("$to", "$subject", "$msg", "$headers", "$config");
  echo "finished!";

  如果你使用的是一個基於Windows的SMTP服務,那麼你有可能不需要使用第五個參數,而且在附加的頭訊息參數中(也就是第四個參數),你需要將它們分開寫--使用rn而不是n.所以,同樣的一個郵件通過基於Windows的SMTP服務發送的代碼如下: 

   $to = "julie@thickbook.com";
  $subject = "ZDNet Developer article";
  $msg = "I completely understand SMTP servers now!";
  $headers = "From:me@mycompany.comrnReply-To:someoneelse@mycompany.com";
  mail("$to", "$subject", "$msg", "$headers");
  echo "finished!";

  腳本中的echo語句使你的網頁瀏覽器在腳本運行完成的時候向你顯示一條訊息.如果不寫echo語句,你就會得到一個"空文件"的對話框,因為沒有任何輸出能夠發送到瀏覽器端.

  只要能夠連接到指定的SMTP伺服器mail()函數就會返回真值.但是這並不意味著郵件成功的到達了接收方那裡. mail()函數不會等待或報告SMTP伺服器發來的成功/錯誤代碼.

  mail() 函數有可能返回假值,然後給你警告"無法連接,在第x行"或是"未知的錯誤,在第x行."如果這兩個訊息中的任何一條出現了,你就應該檢查php.ini 中的SMTP值.引起這些訊息有兩種可能:SMTP伺服器癱瘓了,或者PHP無法連接到它.無論是這兩種情況中的哪一種,你的郵件都無法被發送出去.

#  這個腳本對這些參數使用硬編碼的值.使用一個簡單的 HTML表單,你就可以在這些參數中插入一些值並擁有一個好的回饋表單.

以上是php中mail()函數用法與SMTP運作原理詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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