php中mail()函數(shù)和SMTP工作原理及實(shí)踐
來(lái)源:易賢網(wǎng) 閱讀:877 次 日期:2014-09-18 14:19:33
溫馨提示:易賢網(wǎng)小編為您整理了“php中mail()函數(shù)和SMTP工作原理及實(shí)踐”,方便廣大網(wǎng)友查閱!

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

要使mail()能夠運(yùn)行,你必須有一 個(gè)SMTP服務(wù)器以便PHP能夠連接上去.不管這個(gè)服務(wù)器對(duì)郵件程序多么重要,大多數(shù)人對(duì)它如何運(yùn)轉(zhuǎn)沒有一星半點(diǎn)的概念.在本教程中,我們將揭示SMTP 的秘密并解決一些使用PHP發(fā)送郵件的常見問題.而本文中的另一些主題將包括循環(huán)遍歷一個(gè)地址列表的方法以及同時(shí)以文本和HTML格式向接收者發(fā)送一個(gè)郵 件的方法.

SMTP 是簡(jiǎn)單郵件傳輸協(xié)議(Simple Mail TransferProtocol)的縮寫,而一個(gè)SMTP服務(wù)器是一臺(tái)運(yùn)行這種協(xié)議并發(fā)出郵件的計(jì)算機(jī).運(yùn)行這種協(xié)議實(shí)際上指的是運(yùn)行諸如 Sendmail和Qmail的程序--如果你使用的是一臺(tái)非Windows計(jì)算機(jī)的話.在Windows平臺(tái)上,作為Windows NT ServicePack一部分或是內(nèi)建于Windows 2000內(nèi)部的SMTP服務(wù)程序就是典型的這種程序.

我并不是說(shuō)SMTP軟件包 就只有那些,但是它們是最普通的.如果你的Web站點(diǎn)使用了互聯(lián)網(wǎng)服務(wù)提供者的主機(jī)軟件包(Internet ServiceProvider's virtual hostingpackage)的一部分,那么SMTP服務(wù)程序就應(yīng)該已經(jīng)在這臺(tái)計(jì)算機(jī)上安裝了.如果你是一臺(tái)位于ISP或是室內(nèi)的計(jì)算機(jī)的系統(tǒng)管理員, 那么你很有可能已經(jīng)在這臺(tái)計(jì)算機(jī)上安裝了某種SMTP軟件,用來(lái)處理從Web服務(wù)器發(fā)送郵件的過(guò)程.

但是,如果你是一個(gè)個(gè)人用戶并只有一 個(gè)開發(fā)用的Web服務(wù)程序運(yùn)行在你的個(gè)人電腦上,你可能沒有在自己的機(jī)器上運(yùn)行SMTP軟件.下面是一個(gè)非常簡(jiǎn)單但是準(zhǔn)確的拇指定律:如果你是一個(gè) Windows用戶而從沒有看見SMTP服務(wù)器這樣的字眼,那么你就沒有運(yùn)行這個(gè)程序.如果你確實(shí)沒有,那么你有兩種選擇:安裝,配置,和維護(hù)一個(gè) SMTP服務(wù)程序(如果你不知道那是怎么一回事的話就不推薦你使用這種方法)或是使用一個(gè)現(xiàn)存的SMTP服務(wù)器.

"如果一個(gè)服務(wù)器現(xiàn)在沒 有運(yùn)行的話,我又怎么使用它呢?"你可能要問.如果你的計(jì)算機(jī)是通過(guò)撥號(hào)連接(或是DSL或電纜)連到互聯(lián)網(wǎng)的話,你可以使用你ISP的外發(fā)郵件服務(wù)器. 例如,如果你開發(fā)用的 計(jì)算機(jī)是一個(gè)Windows98的系統(tǒng)并使用56kbpsmodem通過(guò)EarthLink連接到互聯(lián)網(wǎng),那么你就可以使用 mail.earthlink.net作為你的SMTP服務(wù)器.不論你對(duì)你的外發(fā)郵件服務(wù)器使用什么樣的郵件客戶端(Eudora, Outlook, NetscapeMail等等),它們都將和你的PHP代碼使用你的SMTP服務(wù)器的過(guò)程一樣.技巧就是使PHP知道一點(diǎn)點(diǎn)事實(shí).

在php.ini管理配置文件里,有幾個(gè)條目需要被設(shè)置以便mail()函數(shù)能夠正常運(yùn)行.在改變它們以前,搞清楚它們都是做什么用的.你可以使用phpinfo()函數(shù)通過(guò)創(chuàng)建一個(gè)文件來(lái)顯示系統(tǒng)當(dāng)前的配置情況,這個(gè)文件包括:

保存這個(gè)文件,將它放置到你的Web服務(wù)程序的文件根目錄,然后通過(guò)你的瀏覽器訪問它.你應(yīng)該可以看到一個(gè)被優(yōu)美的格式化了的信息,顯示你的配置情況.你要查看的條目如下:

SMTP

sendmail_from

sendmail_path

如果你沒有使用windows,那么sendmail_path指令就是你唯一要擔(dān)心的東西.如果你正在使用Windows,你就需要看看最后兩個(gè)指令.

如果你使用的是Linux或是一個(gè)Unix變種,sendmail_path看起來(lái)應(yīng)該象這樣:

sendmail_path = /usr/sbin/sendmail

或者如果你使用Qmail:

sendmail_path = /var/qmail/bin/sendmail

在這條指令里,你還可以設(shè)置配置參數(shù)來(lái)指明隊(duì)列緩沖選項(xiàng)或是顯示的設(shè)置Return-Path頭,如下所示:

sendmail_path = /usr/sbin/sendmail

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

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

如果你決心在這臺(tái)電腦上運(yùn)行一個(gè)SMTP服務(wù)程序,你在php.ini文件中的條目就應(yīng)該如下:

SMTP = localhost

但是,如果你要使用你ISP(在這個(gè)例子中是EarthLink)的外發(fā)郵件服務(wù)器,那么php.ini中的郵件看起來(lái)應(yīng)該如下:

SMTP = mail.earthlink.net

你也可以使用IP地址而不是域名,因?yàn)橛?jì)算機(jī)不區(qū)分這兩種條目.

第二條配置指令是sendmail_from,它應(yīng)該被設(shè)置成From頭中的電子郵件地址.它可以在腳本里被修改但是通常作為缺省值使用.下面就是這個(gè)配置指令的示例指的是你自己的郵件地址.

sendmail_from

在做了這些配置上的改動(dòng)以后,重啟Web服務(wù)程序然后使用phpinfo()函數(shù)來(lái)驗(yàn)證這些修改.在這些工作完成以后,你就可以用PHP來(lái)發(fā)送電子郵件了.

mail()函數(shù)是非常簡(jiǎn)單的:只有五個(gè)參數(shù),而其中的兩個(gè)是可選的.這些參數(shù)是:

接收方地址

主題

信件內(nèi)容

其它文件信息頭(可選)

SMTP服務(wù)程序的其它配置選項(xiàng)(可選)

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

如果你想給我發(fā)郵件但你使用的是一個(gè)非Windows系統(tǒng), 程序代碼就應(yīng)該如下:

$to= "";

$subject = "ZDNet Developer article";

$msg = "I completely understand SMTP servers now!";

$headers = "From:me@mycompany.comnReply-To:someoneelse@mycompany.com";

$config = "";

mail("$to", "$subject", "$msg", "$headers", "$config");

echo "finished!";

?>

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

$to = "";

$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語(yǔ)句使你的Web瀏覽器在腳本運(yùn)行完成的時(shí)候向你顯示一條信息.如果不寫echo語(yǔ)句,你就會(huì)得到一個(gè)"空文件"的對(duì)話框,因?yàn)闆]有任何輸出能夠發(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è)良好的反饋表單.

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:php中mail()函數(shù)和SMTP工作原理及實(shí)踐
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)