一個發送E-MAIL的腳本也許是你能夠在Web 站點上找到的最普通的腳本之一了,雖然它很簡單,一個郵件腳本有時會令程序員非常沮喪.PHP中有一個叫做mail()的函數,它只需要知道接收方的地址和信件主體就可以發送郵件,但是要讓mail()按你的意思運行你還需要解決一些棘手的問題.
要使mail()能夠運行,你必須有一個SMTP服務器以便PHP能夠連接上去.不管這個服務器對郵件程序多么重要,大多數人對它如何運轉沒有一星半點的概念.在本教程中,我們將揭示SMTP的秘密并解決一些使用PHP發送郵件的常見問題.而本文中的另一些主題將包括循環遍歷一個地址列表的方法以及同時以文本和HTML格式向接收者發送一個郵件的方法.
SMTP是簡單郵件傳輸協議(Simple Mail Transfer Protocol)的縮寫,而一個SMTP服務器是一臺運行這種協議并發出郵件的計算機.運行這種協議實際上指的是運行諸如Sendmail和Qmail的程序--如果你使用的是一臺非Windows計算機的話.在Windows平臺上,作為Windows NT Service Pack一部分或是內建于Windows 2000內部的SMTP服務程序就是典型的這種程序.
我并不是說SMTP軟件包就只有那些,但是它們是最普通的.如果你的Web站點使用了互聯網服務提供者的主機軟件包(Internet Service Provider's virtual hosting package)的一部分,那么SMTP服務程序就應該已經在這臺計算機上安裝了.如果你是一臺位于ISP或是室內的計算機的系統管理員,那么你很有可能已經在這臺計算機上安裝了某種SMTP軟件,用來處理從Web服務器發送郵件的過程.
但是,如果你是一個個人用戶并只有一個開發用的Web服務程序運行在你的個人電腦上,你可能沒有在自己的機器上運行SMTP軟件.下面是一個非常簡單但是準確的拇指定律:如果你是一個Windows用戶而從沒有看見SMTP服務器這樣的字眼,那么你就沒有運行這個程序.如果你確實沒有,那么你有兩種選擇:安裝,配置,和維護一個SMTP服務程序(如果你不知道那是怎么一回事的話就不推薦你使用這種方法)或是使用一個現存的SMTP服務器.
"如果一個服務器現在沒有運行的話,我又怎么使用它呢?"你可能要問.如果你的計算機是通過撥號連接(或是DSL或電纜)連到互聯網的話,你可以使用你ISP的外發郵件服務器.例如,如果你開發用的 計算機是一個Windows98的系統并使用56kbps modem通過EarthLink連接到互聯網,那么你就可以使用mail.earthlink.net作為你的SMTP服務器.不論你對你的外發郵件服務器使用什么樣的郵件客戶端(Eudora, Outlook, Netscape Mail等等),它們都將和你的PHP代碼使用你的SMTP服務器的過程一樣.技巧就是使PHP知道一點點事實.
mail()函數是非常簡單的:只有五個參數,而其中的兩個是可選的.這些參數是:
接收方地址,主題,信件內容,其它文件信息頭(可選)
SMTP服務程序的其它配置選項(可選)
附加的頭參數控制了諸如CC, BCC, Reply-To之類的郵件功能,或者其它遵循SMTP協議的功能.在這個例子中,我只使用From 和 Reply-To信息頭.
如果你想給我發郵件但你使用的是一個非Windows系統,程序代碼就應該如下:
如果你使用的是一個基于Windows的SMTP服務,那么你有可能不需要使用第五個參數,而且在附加的頭信息參數中(也就是第四個參數),你需要將它們分開寫--使用 而不是 .所以,同樣的一個郵件通過基于Windows的SMTP服務發送的代碼如下:
腳本中的echo語句使你的Web瀏覽器在腳本運行完成的時候向你顯示一條信息.如果不寫echo語句,你就會得到一個"空文件"的對話框,因為沒有任何輸出能夠發送到瀏覽器端.
只要能夠連接到指定的SMTP服務器mail()函數就會返回真值.但是這并不意味著郵件成功的到達了接收方那里.mail()函數不會等待或報告SMTP服務器發來的成功/錯誤代碼.
mail()函數有可能返回假值,然后給你警告"無法連接,在第x行"或是"未知的錯誤,在第x行."如果這兩條信息中的任何一條出現了,你就應該檢查php.ini中的SMTP值.引起這些消息有兩種可能:SMTP服務器癱瘓了,或者PHP無法連接到它.無論是這兩種情況中的哪一種,你的郵件都無法被發送出去.