要使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知道一點點事實.
在php.ini管理配置文件里,有幾個條目需要被設置以便mail()函數能夠正常運行.在改變它們以前,搞清楚它們都是做什么用的.你可以使用phpinfo()函數通過創建一個文件來顯示系統當前的配置情況,這個文件包括:
<? phpinfo() ?>
保存這個文件,將它放置到你的Web服務程序的文件根目錄,然后通過你的瀏覽器訪問它.你應該可以看到一個被優美的格式化了的信息,顯示你的配置情況.你要查看的條目如下:
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語句使你的Web瀏覽器在腳本運行完成的時候向你顯示一條信息.如果不寫echo語句,你就會得到一個"空文件"的對話框,因為沒有任何輸出能夠發送到瀏覽器端.
只要能夠連接到指定的SMTP服務器mail()函數就會返回真值.但是這并不意味著郵件成功的到達了接收方那里.mail()函數不會等待或報告SMTP服務器發來的成功/錯誤代碼.
mail()函數有可能返回假值,然后給你警告"無法連接,在第x行"或是"未知的錯誤,在第x行."如果這兩條信息中的任何一條出現了,你就應該檢查php.ini中的SMTP值.引起這些消息有兩種可能:SMTP服務器癱瘓了,或者PHP無法連接到它.無論是這兩種情況中的哪一種,你的郵件都無法被發送出去.
這個腳本對這些參數使用硬編碼的值.使用一個簡單的HTML表單,你就可以在這些參數中插入一些值并擁有一個良好的反饋表單.
一旦你知道了如何給一個人發送郵件,你可能按奈不住要把同一個郵件發送給許多接收者--就象新聞信件一樣.所有這些牽涉到一個漂亮輕巧的循環來遍歷一個接收者的列表并將郵件發送給他們.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知道一點點事實.
在php.ini管理配置文件里,有幾個條目需要被設置以便mail()函數能夠正常運行.在改變它們以前,搞清楚它們都是做什么用的.你可以使用phpinfo()函數通過創建一個文件來顯示系統當前的配置情況,這個文件包括:
<? phpinfo() ?>
保存這個文件,將它放置到你的Web服務程序的文件根目錄,然后通過你的瀏覽器訪問它.你應該可以看到一個被優美的格式化了的信息,顯示你的配置情況.你要查看的條目如下:
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語句使你的Web瀏覽器在腳本運行完成的時候向你顯示一條信息.如果不寫echo語句,你就會得到一個"空文件"的對話框,因為沒有任何輸出能夠發送到瀏覽器端.
只要能夠連接到指定的SMTP服務器mail()函數就會返回真值.但是這并不意味著郵件成功的到達了接收方那里.mail()函數不會等待或報告SMTP服務器發來的成功/錯誤代碼.
mail()函數有可能返回假值,然后給你警告"無法連接,在第x行"或是"未知的錯誤,在第x行."如果這兩條信息中的任何一條出現了,你就應該檢查php.ini中的SMTP值.引起這些消息有兩種可能:SMTP服務器癱瘓了,或者PHP無法連接到它.無論是這兩種情況中的哪一種,你的郵件都無法被發送出去.
這個腳本對這些參數使用硬編碼的值.使用一個簡單的HTML表單,你就可以在這些參數中插入一些值并擁有一個良好的反饋表單.
一旦你知道了如何給一個人發送郵件,你可能按奈不住要把同一個郵件發送給許多接收者--就象新聞信件一樣.所有這些牽涉到一個漂亮輕巧的循環來遍歷一個接收者的列表并將郵件發送給他們.mail函數的形式還是相同的:
mail([接收方], [主題], [郵件主體], [頭信息]);
你只需要簡單的用列表中的下一個名字來替換[接收方].假設你已經有了一個電子郵件地址的數組:
$addresses = array("me@mycompany.com", "you@yourcompany.com", "someone@otherplace.com");
你所需要做的就是循環遍歷這個數組,取得新地址而后發送這個郵件.
如果你在數據庫中擁有一個電子郵件地址的列表,同樣的原則也是適用的:循環遍歷它們.
你已經懂得要領了.顯然,同樣的概念對你特定的數據庫類型和表結構來說也是適用的,雖然代碼會需要做一些改動.
人們在循環遍歷一個地址列表的時候似乎都忽視了一點:如果你有多于50個地址要處理,你的腳本在完成以前很可能超時,因為PHP對每一個腳本的運行有一個缺省為30秒的時間限制.你可以修改這個時間限制但是這樣做的時候要小心.要把這種修改限定在特定的腳本上,比方說遍歷一個地址列表發送郵件的腳本.否則,你可能親手將服務器的線程超載,然后你的計算機將崩潰,從此萬劫不復.
要在腳本中設置時間限制,你可以使用set_time_limit()函數.你可以設定時間限制,比如說60秒(set_time_limit(60)),或者你還可以讓它一直運行直道它完成(set_time_limit(0)).
將這段代碼加到你的腳本里,你的郵件地址遍歷循環會很愉快的繼續工作,直到郵件被發送給了列表中所有的地址.
發送HTML格式的電子郵件也是一種看起來難,做起來容易的事情.一但你學會了如何做這件事,你可能會因為自己曾經認為它很難而踢自己一腳.
我們需要對我們已經編寫的郵件腳本做兩個修改:
你的郵件應該是HTML格式的.
你必須添加content-type頭信息.
這就是所有要做的事情.擁有一個能閱讀HTML格式電子郵件客戶端程序的接收方將看見他們的郵件以大的,粗體格式顯示的信件.如果你發送的HTML格式郵件包括image置標,你一定要記住在src屬性中使用完整的URL,例如: <img src="http://www.yourdomain.com/images/image.gif">.
你還應該記住不是每一個人都能閱讀HTML格式的電子郵件而且那些無法閱讀這種格式的人只能看見HTML代碼本身.這是另人討厭的,所以最好三思而行.
結論
你可以用PHP以任何途徑,方法或是可以想象到的任何形式來發送郵件.這個教程只是提供了基本的知識:配置你的服務器并發送簡單的郵件.你還可以將附件和你用mail()函數產生的電子郵件一道發送,修改一大堆不同的頭信息,還有做任何電子郵件客戶端程序和郵件列表發送程序能夠做的事情.
原文轉自:http://www.anti-gravitydesign.com