用PHP發(fā)電子郵件2
發(fā)表時(shí)間:2024-06-18 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]mail()函數(shù)是非常簡(jiǎn)單的:只有五個(gè)參數(shù),而其中的兩個(gè)是可選的.這些參數(shù)是:接收方地址 主題 信件內(nèi)容 其它文件信息頭(可選) SMTP服務(wù)程序的其它配置選項(xiàng)(可選) 附加的頭參數(shù)控制了諸如CC, BCC, Reply-To之類(lèi)的郵件功能,或者其它遵循SMTP協(xié)議的功能.在這個(gè)例子中,我只使用F...
mail()函數(shù)是非常簡(jiǎn)單的:只有五個(gè)參數(shù),而其中的兩個(gè)是可選的.這些參數(shù)是:
接收方地址
主題
信件內(nèi)容
其它文件信息頭(可選)
SMTP服務(wù)程序的其它配置選項(xiàng)(可選)
附加的頭參數(shù)控制了諸如CC, BCC, Reply-To之類(lèi)的郵件功能,或者其它遵循SMTP協(xié)議的功能.在這個(gè)例子中,我只使用From 和 Reply-To信息頭.
如果你想給我發(fā)郵件但你使用的是一個(gè)非Windows系統(tǒng), 程序代碼就應(yīng)該如下:
<?
$to = "julie@thickbook.com";
$subject = "ZDNet Developer article";
$msg = "I completely understand SMTP servers now!";
$headers = "From: me@mycompany.com\nReply-To: someoneelse@mycompany.com";
$config = "-fwebmaster@mycompany.com";
mail("$to", "$subject", "$msg", "$headers", "$config");
echo "finished!";
?>
如果你使用的是一個(gè)基于Windows的SMTP服務(wù),那么你有可能不需要使用第五個(gè)參數(shù),而且在附加的頭信息參數(shù)中(也就是第四個(gè)參數(shù)),你需要將它們分開(kāi)寫(xiě)--使用\r\n而不是\n.所以,同樣的一個(gè)郵件通過(guò)基于Windows的SMTP服務(wù)發(fā)送的代碼如下:
<?
$to = "julie@thickbook.com";
$subject = "ZDNet Developer article";
$msg = "I completely understand SMTP servers now!";
$headers = "From: me@mycompany.com\r\nReply-To: someoneelse@mycompany.com";
mail("$to", "$subject", "$msg", "$headers");
echo "finished!";
?>
腳本中的echo語(yǔ)句使你的Web瀏覽器在腳本運(yùn)行完成的時(shí)候向你顯示一條信息.如果不寫(xiě)echo語(yǔ)句,你就會(huì)得到一個(gè)"空文件"的對(duì)話(huà)框,因?yàn)闆](méi)有任何輸出能夠發(fā)送到瀏覽器端.
只要能夠連接到指定的SMTP服務(wù)器mail()函數(shù)就會(huì)返回真值.但是這并不意味著郵件成功的到達(dá)了接收方那里.mail()函數(shù)不會(huì)等待或報(bào)告SMTP服務(wù)器發(fā)來(lái)的成功/錯(cuò)誤代碼.
mail()函數(shù)有可能返回假值,然后給你警告"無(wú)法連接,在第x行"或是"未知的錯(cuò)誤,在第x行."如果這兩條信息中的任何一條出現(xiàn)了,你就應(yīng)該檢查php.ini中的SMTP值.引起這些消息有兩種可能:SMTP服務(wù)器癱瘓了,或者PHP無(wú)法連接到它.無(wú)論是這兩種情況中的哪一種,你的郵件都無(wú)法被發(fā)送出去.
這個(gè)腳本對(duì)這些參數(shù)使用硬編碼的值.使用一個(gè)簡(jiǎn)單的HTML表單,你就可以在這些參數(shù)中插入一些值并擁有一個(gè)良好的反饋表單.
一旦你知道了如何給一個(gè)人發(fā)送郵件,你可能按奈不住要把同一個(gè)郵件發(fā)送給許多接收者--就象新聞信件一樣.所有這些牽涉到一個(gè)漂亮輕巧的循環(huán)來(lái)遍歷一個(gè)接收者的列表并將郵件發(fā)送給他們.mail函數(shù)的形式還是相同的:
mail([接收方], [主題], [郵件主體], [頭信息]);
你只需要簡(jiǎn)單的用列表中的下一個(gè)名字來(lái)替換[接收方].假設(shè)你已經(jīng)有了一個(gè)電子郵件地址的數(shù)組:
$addresses = array("me@mycompany.com", "you@yourcompany.com", "someone@otherplace.com");
你所需要做的就是循環(huán)遍歷這個(gè)數(shù)組,取得新地址而后發(fā)送這個(gè)郵件.
如果你在數(shù)據(jù)庫(kù)中擁有一個(gè)電子郵件地址的列表,同樣的原則也是適用的:循環(huán)遍歷它們.
你已經(jīng)懂得要領(lǐng)了.顯然,同樣的概念對(duì)你特定的數(shù)據(jù)庫(kù)類(lèi)型和表結(jié)構(gòu)來(lái)說(shuō)也是適用的,雖然代碼會(huì)需要做一些改動(dòng).
人們?cè)谘h(huán)遍歷一個(gè)地址列表的時(shí)候似乎都忽視了一點(diǎn):如果你有多于50個(gè)地址要處理,你的腳本在完成以前很可能超時(shí),因?yàn)镻HP對(duì)每一個(gè)腳本的運(yùn)行有一個(gè)缺省為30秒的時(shí)間限制.你可以修改這個(gè)時(shí)間限制但是這樣做的時(shí)候要小心.要把這種修改限定在特定的腳本上,比方說(shuō)遍歷一個(gè)地址列表發(fā)送郵件的腳本.否則,你可能親手將服務(wù)器的線(xiàn)程超載,然后你的計(jì)算機(jī)將崩潰,從此萬(wàn)劫不復(fù).
要在腳本中設(shè)置時(shí)間限制,你可以使用set_time_limit()函數(shù).你可以設(shè)定時(shí)間限制,比如說(shuō)60秒(set_time_limit(60)),或者你還可以讓它一直運(yùn)行直道它完成(set_time_limit(0)).
將這段代碼加到你的腳本里,你的郵件地址遍歷循環(huán)會(huì)很愉快的繼續(xù)工作,直到郵件被發(fā)送給了列表中所有的地址.
發(fā)送HTML格式的電子郵件也是一種看起來(lái)難,做起來(lái)容易的事情.一但你學(xué)會(huì)了如何做這件事,你可能會(huì)因?yàn)樽约涸?jīng)認(rèn)為它很難而踢自己一腳.
我們需要對(duì)我們已經(jīng)編寫(xiě)的郵件腳本做兩個(gè)修改:
你的郵件應(yīng)該是HTML格式的.
你必須添加content-type頭信息.
這就是所有要做的事情.擁有一個(gè)能閱讀HTML格式電子郵件客戶(hù)端程序的接收方將看見(jiàn)他們的郵件以大的,粗體格式顯示的信件.如果你發(fā)送的HTML格式郵件包括image置標(biāo),你一定要記住在src屬性中使用完整的URL,例如: <img src=http://cfan.net.cn/info/"http://www.yourdomain.com/images/image.gif">.
你還應(yīng)該記住不是每一個(gè)人都能閱讀HTML格式的電子郵件而且那些無(wú)法閱讀這種格式的人只能看見(jiàn)HTML代碼本身.這是另人討厭的,所以最好三思而行.
結(jié)論
你可以用PHP以任何途徑,方法或是可以想象到的任何形式來(lái)發(fā)送郵件.這個(gè)教程只是提供了基本的知識(shí):配置你的服務(wù)器并發(fā)送簡(jiǎn)單的郵件.你還可以將附件和你用mail()函數(shù)產(chǎn)生的電子郵件一道發(fā)送,修改一大堆不同的頭信息,還有做任何電子郵件客戶(hù)端程序和郵件列表發(fā)送程序能夠做的事情.