IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁(yè)網(wǎng)絡(luò)編程PHP編程 → PHP應(yīng)用技巧:通過SMTP發(fā)送電子郵件

PHP應(yīng)用技巧:通過SMTP發(fā)送電子郵件

時(shí)間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)

由于php沒有提供現(xiàn)成的smtp函數(shù),卻提供了一個(gè)功能不甚靈活的mail()函數(shù),這個(gè)函數(shù)需要服務(wù)器配置上的支持,并且不支持smtp驗(yàn)證,在很多場(chǎng)合無法正常的工作,因此不建議使用。本文的目的在于為新手指明方向,并沒有涉及那些高級(jí)的內(nèi)容,一來本身水平有限,二來也擔(dān)心不能準(zhǔn)確的講述相關(guān)的概念,進(jìn)而對(duì)各位造成誤導(dǎo),還請(qǐng)自行深入學(xué)習(xí)。

"使用php發(fā)送mail"最近已經(jīng)成為繼"register_globals"以后本版第二個(gè)新手陷阱,今天特地寫這篇文章為新手解惑,希望可以為迷茫的人指明方向。

讓我們先從以下這個(gè)例子開始說起:

引用:

[root@server~/]# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

220 server.domain.com.br ESMTP Postfix (2.1.0)

MAIL FROM: [email protected]

250 Ok

RCPT TO: [email protected]

250 Ok

DATA

354 End data with .

teste

.

250 Ok: queued as 7B41F4665A

QUIT

221 Bye

Connection closed by foreign host.

注:以上來自netkiller的postfix文檔,偷懶,直接用現(xiàn)成的。

首先是使用telnet來連接本地的25端口,稍微熟悉點(diǎn)網(wǎng)絡(luò)的人都知道smtp協(xié)議使用25端口,這也就是說,現(xiàn)在在連接本地的smtp服務(wù)器。

引用:

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

220 server.domain.com.br ESMTP Postfix (2.1.0)

這些東西是系統(tǒng)輸出信息,說明已經(jīng)連接上了,而且這個(gè)smtp服務(wù)器是postfix做的。

"MAIL FROM: [email protected]"這個(gè)命令指明了發(fā)件地址是[email protected],"250 Ok"說明這條命令被服務(wù)器接受并正確執(zhí)行,這類似http協(xié)議的200、404、500等狀態(tài)代碼。接下來的"RCPT TO: [email protected]"指明了收件地址是[email protected]。

引用:

DATA

354 End data with .

teste

.

這一段是輸入郵件正文,輸入"DATA"以后系統(tǒng)提示使用"<回車>.<回車>"來結(jié)束輸入,正文內(nèi)容是"teste"。

最后使用"QUIT"退出。

以上就是最簡(jiǎn)單的一次發(fā)送mail的過程,從這個(gè)例子我們可以看出,發(fā)送mail其實(shí)是很簡(jiǎn)單的事情,實(shí)質(zhì)上也就是建立一個(gè)對(duì)smtp服務(wù)器的連接,然后發(fā)送一些簡(jiǎn)單的命令給它,一封內(nèi)容簡(jiǎn)單的郵件就發(fā)送出去了,至于更加復(fù)雜內(nèi)容的郵件或者操作,其實(shí)也就是在此基礎(chǔ)上稍加擴(kuò)展而已。

把這個(gè)過程用php來實(shí)現(xiàn),其實(shí)就是利用php的Socket functions、Network Functions等等操作socket的函數(shù)來和smtp服務(wù)器建立一個(gè)連接,然后發(fā)送文本的命令給服務(wù)器,如果你親自去看看那些寫好的利用smtp協(xié)議發(fā)送郵件的類或者函數(shù),相信可以印證我的說法。

由于已經(jīng)存在很多現(xiàn)成的封裝得很好的類或者函數(shù)替我們完成底層的socket級(jí)操作,我們只需要直接拿來用就好,而我也不會(huì)費(fèi)時(shí)費(fèi)神的在本文里去討論底層的代碼,有精神去研究的話,自己找代碼來研究吧,F(xiàn)在繼續(xù)跟我走,我們來點(diǎn)實(shí)際的代碼來說明如何使用php發(fā)送郵件,采用的類是PEAR::Mail。

代碼:

require_once 'Mail.php';

$conf['mail'] = array(

'host' => 'xx.xx.xx.xx', //smtp服務(wù)器地址,可以用ip地址或者域名

'auth' => true, //true表示smtp服務(wù)器需要驗(yàn)證,false代碼不需要

'username' => 'tester', //用戶名

'password' => 'retset' //密碼

);

/***

* 使用$headers數(shù)組,可以定義郵件頭的內(nèi)容,比如使用$headers['Reply-To']可以定義回復(fù)地址

* 通過這種方式,可以很方便的定制待發(fā)送郵件的郵件頭

***/

$headers['From'] = '[email protected]'; //發(fā)信地址

$headers['To'] = '[email protected]'; //收信地址

$headers['Subject'] = 'test mail send by php'; //郵件標(biāo)題

$mail_object = &Mail::factory('smtp', $conf['mail']);

$body = <<< MSG //郵件正文

hello world!!!

MSG;

$mail_res = $mail_object->send($headers['To'], $headers, $body); //發(fā)送

if( Mail::isError($mail_res) ){ //檢測(cè)錯(cuò)誤

die($mail_res->getMessage());

}

?>

以上的代碼非常的簡(jiǎn)單,配合注釋應(yīng)該不難看懂,關(guān)于PEAR和PEAR::Mail的更多信息,可以自己去翻閱PEAR Manual得到進(jìn)一步的信息。

現(xiàn)在你依葫蘆畫瓢已經(jīng)可以開始工作了,不過如果你還想做得更好、做得更多的話,我在這里提供一些更多的指南。

1、SMTP協(xié)議

熟悉并了解SMTP協(xié)議的內(nèi)容,這樣你可以進(jìn)行更多的高級(jí)操作,甚至自己寫一個(gè)滿足自己特別需求的發(fā)郵件程序。以上的代碼雖然簡(jiǎn)單,但是肯定還是有很多人不了解注釋里提到的郵件頭是什么東西,它到底對(duì)發(fā)出的郵件有什么樣的影響。

比如"發(fā)送html郵件為什么對(duì)方看到的是亂碼"等等問題都可能和郵件頭相關(guān),如果對(duì)smtp協(xié)議比較了解的話,可以很快的知道問題所在。

2、MIME規(guī)范

如果想要發(fā)送html郵件甚至多媒體郵件,一定是需要對(duì)MIME有一定了解的,有了這方面的知識(shí)你就可以發(fā)送內(nèi)容更加精彩的郵件。

3、PEAR

PEAR并非唯一的發(fā)送郵件的工具,但是PEAR包含了Mail、Mail_Mime等等已經(jīng)封裝好了的類,可以讓我們的開發(fā)事半功倍,并且除了Mail方面的東西以外,它還提供了很多其他方面的現(xiàn)成的工具,非常值得花時(shí)間學(xué)一學(xué)。

關(guān)鍵詞標(biāo)簽:PHP,SMTP,電子郵件

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 plsql developer怎么連接數(shù)據(jù)庫(kù)-plsql deveplsql developer怎么連接數(shù)據(jù)庫(kù)-plsql deve2021年最好用的10款php開發(fā)工具推薦2021年最好用的10款php開發(fā)工具推薦在 PHP 中使用命令行工具在 PHP 中使用命令行工具php應(yīng)用程序安全防范技術(shù)研究php應(yīng)用程序安全防范技術(shù)研究

相關(guān)下載

人氣排行 詳解ucenter原理及第三方應(yīng)用程序整合思路、方法PHP中防止SQL注入攻擊PHP會(huì)話Session的具體使用方法解析PHP運(yùn)行出現(xiàn)Notice : Use of undefined constant 的解決辦法CakePHP程序員必須知道的21條技巧PHP如何清空mySQL數(shù)據(jù)庫(kù)PHP采集圖片實(shí)例(PHP采集)plsql developer怎么連接數(shù)據(jù)庫(kù)-plsql developer連接數(shù)據(jù)庫(kù)方法