22使用cgi程序發(fā)送電子郵件_第1頁(yè)
22使用cgi程序發(fā)送電子郵件_第2頁(yè)
22使用cgi程序發(fā)送電子郵件_第3頁(yè)
22使用cgi程序發(fā)送電子郵件_第4頁(yè)
22使用cgi程序發(fā)送電子郵件_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第22學(xué)時(shí)使用CGIeb沖浪時(shí),要填寫(xiě)一個(gè)窗體,以便在以后用來(lái)發(fā)送電子郵件。這些窗體常常用作信址列表、故障報(bào)告、客戶(hù)支持、愛(ài)好者郵件和其他各種可以想像到的用途。在本學(xué)時(shí)中,我們將要介紹如何用Perl程序發(fā)送郵件,并且講述一個(gè)簡(jiǎn)短的eb頁(yè)示例,Web頁(yè)。如何建立發(fā)送郵件的Web在你將編程技巧用于以Perl來(lái)發(fā)送電子郵件之前,首先必須學(xué)習(xí)一些關(guān)于電子郵件特性如何在Internet上運(yùn)行的一些知識(shí)。在Perl問(wèn)世之前,在美國(guó)的國(guó)家計(jì)算機(jī)安全委員會(huì)(NCSA)尚未注意到eb的遠(yuǎn)大前景并且調(diào)制解調(diào)器的速度還比較慢的時(shí)候,全球的許多人就已經(jīng)在使用電子郵件在所謂的UNIX至UNIX拷貝(UNIX-to-UNIXcopy,UUCP)的系統(tǒng)上進(jìn)行通信了。當(dāng)你在這個(gè)老式系統(tǒng)上發(fā)送電子郵件時(shí),本地系統(tǒng)把你的電子郵件封裝好,然后轉(zhuǎn)發(fā)給系統(tǒng)鏈中的下一個(gè)系統(tǒng),下一個(gè)系統(tǒng)又將電子郵件封裝好,轉(zhuǎn)發(fā)給下一個(gè)系統(tǒng),如此傳遞下去。線路上的每個(gè)系統(tǒng)都要給22-1所示。圖22-1將郵件從一個(gè)系統(tǒng)

很明顯,這種郵件傳遞的方法可以稱(chēng)為存儲(chǔ)與轉(zhuǎn)發(fā)法。后來(lái)UUCP系統(tǒng)被別的方法所取代,不過(guò)存儲(chǔ)與轉(zhuǎn)發(fā)的基本方法仍然沒(méi)有變。當(dāng)你從你的PC發(fā)送電子郵件時(shí),另一個(gè)系統(tǒng)負(fù)責(zé)接收該郵件,再將它轉(zhuǎn)發(fā)給另一個(gè)系統(tǒng),然后該系統(tǒng)又將郵件轉(zhuǎn)發(fā)給下一個(gè)系統(tǒng),直到最后由目標(biāo)系統(tǒng)接收到郵件為止。不過(guò),如今這些協(xié)議完全發(fā)生了變化。目前最常用的方法是使用簡(jiǎn)單郵件傳輸協(xié)議(SimpleMailTransportProtocolSMTP)將郵件發(fā)送到系統(tǒng)鏈上(22-2連接的目標(biāo)端通常使用郵局協(xié)議(PostOfficePortocol,POP)或Internet郵件訪問(wèn)協(xié)議(InternetMessageAccessProtocol,IMAPSMTP 第三部分將Perl用于圖22-2發(fā)送電子郵件時(shí)使你

若要發(fā)送電子郵件,需要兩樣?xùn)|西,即郵件傳輸代理或SMTP中繼主機(jī)。郵件傳輸代理(MailTransportAgent,MTA)是駐留在你的計(jì)算機(jī)上的一個(gè)程序,它通常是你的操作系統(tǒng)所配備的一個(gè)程序,負(fù)責(zé)接收電子郵件并正確地將它們轉(zhuǎn)發(fā)。當(dāng)你的操作系MAUNIX系統(tǒng)上的常用MA稱(chēng)為sendmail。semdmail程序負(fù)責(zé)取出一個(gè)電子郵件并確定如何將它傳遞到目的地。上面這個(gè)代碼段將一個(gè)短郵件發(fā)送到foo@。sendmail程序負(fù)責(zé)為你解決所有難以如果你使用MicrosoftWindows或Macintosh操作系統(tǒng),那么你將不具備內(nèi)置的MA。不過(guò)PerlNet::SMTP模塊可以在沒(méi)有介入的MA的情況下發(fā)送郵件,但是你必須知道你的SMTP中繼主機(jī)的名字。這個(gè)名字是用于發(fā)送郵件的“郵件主機(jī)”的主機(jī)名,當(dāng)你用你的帳戶(hù)進(jìn)行登錄時(shí),你將被賦予該主機(jī)名。請(qǐng)索取中繼主機(jī)的名字,并將它寫(xiě)在某個(gè)地方,以后你會(huì)用到它。請(qǐng)記住,依靠SMTP中繼的程序必須將正確的中繼主機(jī)內(nèi)置于軟件之中,否則該進(jìn)程將不能運(yùn)行。SMTP中繼主機(jī)名”取決于你從何處發(fā)送你的郵件。如果你從家中發(fā)送郵件,那么你的家庭Internet服務(wù)提供商(ISP)帳戶(hù)為你賦予一個(gè)SMTP中繼主機(jī)名。如果你用租用的eb服務(wù)器上的帳戶(hù)發(fā)送郵件,那么就需要該服務(wù)器的中繼主機(jī)的名字。當(dāng)郵件從中繼主機(jī)并不知道的一個(gè)系統(tǒng)發(fā)送過(guò)來(lái),郵件中繼主機(jī)便拒絕轉(zhuǎn)發(fā)該郵件。在下一節(jié)中,我們將要介紹一個(gè)新函數(shù),即send_mail,使用這個(gè)函數(shù),你就能夠用Perl程序發(fā)送電子郵件。這個(gè)函數(shù)雖然非常有用,但同時(shí)它也有很大的危險(xiǎn)性。將郵件發(fā)送給某個(gè)人,將會(huì)在一定程序上侵犯他的隱私權(quán)。你會(huì)要求郵件的收件人在你的郵件上耗費(fèi)一定的第22學(xué)時(shí)使用CGI程序發(fā)送電子郵 時(shí)間和磁盤(pán)空間,還會(huì)要求你與收件人之間的每個(gè)系統(tǒng)為你中繼該郵件。對(duì)于一個(gè)完全陌生的人來(lái)說(shuō),這樣做是很不合適的。首先使用眾所周知的地址(比如你自己的地址)測(cè)試你的代碼并發(fā)送一些短郵件。這時(shí),隨時(shí)都可能產(chǎn)生一些問(wèn)題,你應(yīng)該設(shè)法避免發(fā)生問(wèn)題。不要發(fā)送有人主動(dòng)提供的商業(yè)性電子郵件。這類(lèi)商業(yè)性電子郵件通常稱(chēng)為垃圾郵件,這類(lèi)郵件已經(jīng)成為Internet上的一個(gè)令人頭痛的大問(wèn)題。少數(shù)人喜歡接收這類(lèi)郵件,而其他人的反應(yīng)則不同,他們有的對(duì)垃圾郵件非常反感,有的則痛恨之極。發(fā)送此類(lèi)郵件的企業(yè)將會(huì)成為許多人唾罵的對(duì)象。當(dāng)你得到一個(gè)郵件地址后,應(yīng)該問(wèn)一問(wèn)是否可以在以后向它發(fā)送電子郵件。如果有人要求從你的郵件地址列表中刪除他的地址,那么你應(yīng)該尊重他的要求。無(wú)論對(duì)方要求還是沒(méi)有要求,都不要一次就發(fā)送很長(zhǎng)的郵件,要按適當(dāng)?shù)乃俣葋?lái)發(fā)送。ISP將會(huì)終止IS因?yàn)槟愕泥]件太大而無(wú)法承受,該ISP就會(huì)阻塞從你的域發(fā)送過(guò)來(lái)的全部郵件。如果根本無(wú)法向較大的域(如、應(yīng)該提供很好的返回郵件的地址,尤其是在郵件報(bào)頭中要寫(xiě)明這個(gè)地址。應(yīng)該確保你的電子郵件的From:(或ReplyTo:)地址正確無(wú)誤,尤其是當(dāng)郵件是從一臺(tái)計(jì)算機(jī)發(fā)送時(shí)更應(yīng)保證地址的正確性。你可以使用Perl偽造電子郵件,但是偽造的郵件包含一個(gè)返回給你的指針。偽造的郵件會(huì)使你陷入巨大的麻煩之中。請(qǐng)始終都使用你自己的郵件中繼主機(jī)。濫用其他系統(tǒng)的郵件中繼主機(jī)會(huì)使你的帳戶(hù)迅速停用,并使你遭人指控,甚至出現(xiàn)更糟糕的問(wèn)題。不要將很長(zhǎng)的電子郵件或者許多很短的郵件發(fā)送給靠不住的人,這稱(chēng)為郵件炸彈,可能導(dǎo)致你的帳戶(hù)被停用,并引起法律上的麻煩。上面這些建議并非全部?jī)H僅是一些好的網(wǎng)上禮儀。如果違背這些原則,ISP可能將你從它ISPISPISP會(huì)IntInternet具有長(zhǎng)期的記憶能力。真的發(fā)送過(guò)垃圾郵件的人將會(huì)被人們長(zhǎng)久記住并遭到唾罵。一旦因?yàn)榘l(fā)送垃圾郵件而變得臭名昭著,要想挽回名譽(yù)是很難的。下面各節(jié)將介紹如何編寫(xiě)一個(gè)Perl短函數(shù),供你在CGI里存在一個(gè)問(wèn)題。該函數(shù)運(yùn)行的方式主要取決于你是否擁有本地MTA(如sendmail程序),或 第三部分將Perl用于如果你擁有UNIX系統(tǒng),并且sendmail可能已經(jīng)配置好了(也許尚未配置好,那么你閱讀UNIX或sendmail,只是因?yàn)楹闷娑喿x本節(jié)內(nèi)容,這也對(duì)你有好處,不過(guò),程序清單22-1中展示的函數(shù)也許對(duì)你沒(méi)有多大幫助。即使你擁有即使你擁有UNIX系統(tǒng),下一節(jié)“用于非UNIX系統(tǒng)的郵件函數(shù)”也是值得一讀的。下一節(jié)將介紹使用模塊(即面向?qū)ο蟮哪K)的新方法。程序清單22- 第6行:sendmailsendmail程序可能位第8行:$sendmail中設(shè)定的sendmail程序啟動(dòng)并打開(kāi),以便對(duì)文件句柄MAIL第9~14行:電子郵件的報(bào)頭被寫(xiě)入MAIL若要使用該函數(shù),只要像下面這樣用4個(gè)參數(shù)調(diào)用它:sendmail。如果沒(méi)有安裝和配置,請(qǐng)閱讀下一節(jié)“用于非UNIX系統(tǒng)的郵件函數(shù)”,那里介紹的解決方案也可以在UNIX下使用。必須將變量$sendmail改為你的系統(tǒng)上的sendmail/usr/lib,不過(guò)它也可以是/usr/sbin,/lib第第22學(xué)時(shí)使用CGI程序發(fā)送電子郵 置正確??梢允褂胢ail或pine之類(lèi)的郵件實(shí)用程序來(lái)發(fā)送測(cè)試郵件。如果這sendmail的安裝很可能不正確。你必須- (From、To、Subject等)- -odq對(duì)郵件進(jìn)行排隊(duì),而不是立即將它們發(fā)送出去。如果你愿意,可以不使用本選項(xiàng)。但是,如果有太多的郵件要立即發(fā)送,那么你的郵件系統(tǒng)將會(huì)應(yīng)接不暇。使用-odq是一在沒(méi)有安裝l之類(lèi)的內(nèi)置MA的Wdws和其他操作系統(tǒng)下,你會(huì)遇到一些復(fù)雜的問(wèn)題。MA不是個(gè)簡(jiǎn)單的郵件傳輸工具,試圖用幾行Perl代碼就復(fù)制它的功能,是很不容易首先,使用Perl模塊Net::SMTP,你可以通過(guò)Perl運(yùn)行的任何操作系統(tǒng)來(lái)發(fā)送郵件。使用該模塊,你就能夠非常容易地發(fā)送郵件而不會(huì)遇到太大的困難。問(wèn)題是在標(biāo)準(zhǔn)的Perl產(chǎn)品上并沒(méi)有安裝該模塊。為了獲得該模塊,必須將它加載到Web服務(wù)器所在的系統(tǒng)上,或者加載到你想發(fā)送郵件的任何位置上。Net::SMTP模塊是libnet組件的組成部分,它包含各種非常有用的網(wǎng)絡(luò)模塊。Libnet組件位于本書(shū)所附光盤(pán)上。本書(shū)的附錄“安裝模塊”提供了相當(dāng)詳細(xì)的如何安裝本書(shū)的附錄“安裝模塊”提供了相當(dāng)詳細(xì)的如何安裝Perl模塊的指南。它講述了如何在UNIXWindows和Macintosh操作系統(tǒng)下,安裝各個(gè)Per此外,如果你的系統(tǒng)管理員沒(méi)有安裝模塊的公用拷貝,你還會(huì)在附錄中找到如何安裝模塊的專(zhuān)用拷貝的說(shuō)明。程序清單22-2顯示了用于不帶MA的操作系統(tǒng)的send_mail函數(shù)。它包含某些非常奇特的新語(yǔ)句,你可能對(duì)它們不太熟悉。請(qǐng)務(wù)必要閱讀后面的說(shuō)明。程序清單22- 第三部分將Perl用于第10行:Net::SMTP對(duì)象得以創(chuàng)建,并與正確的中繼主機(jī)相連接,該主機(jī)是你在第9行上第13~234這個(gè)函數(shù)令你感到奇怪的第一件事情是$smtp=Net::SMTP->new($relay);這行代碼。$smtp中的值現(xiàn)在代表一個(gè)到達(dá)郵件程序的連接,你可以對(duì)你感到奇怪的下一件事情是$smtp->mail($from);這行代碼。->用于將一個(gè)對(duì)象連接到一mail是個(gè)使用上一行創(chuàng)建的$smtp對(duì)象來(lái)調(diào)用的函數(shù)。為了使用Net::SMTP模塊,你并不需要理解對(duì)象語(yǔ)句的全部特征,只需順便了解一下就夠了。對(duì)于Net::SMTP對(duì)象,可以使用的函數(shù)包括下列幾個(gè):$smtp->mail(addr)mail函數(shù)用于指明你發(fā)送郵件時(shí)使用的是什么身份。當(dāng)然,有時(shí)你可以就你的身份問(wèn)題撒點(diǎn)兒謊。$smtp->to(addr)toto函數(shù)帶有一個(gè)名字列表,那么每人都會(huì)收到一個(gè)郵件拷貝。這些人的名字列表不一定出現(xiàn)在郵件正文中,BCC。 $smtp->datasend(data)這個(gè)函數(shù)用于發(fā)送郵件的實(shí)際文本。你必須輸出你自己的報(bào)頭域(o:、From:等。報(bào)頭域,比如Date:和Received:,是自動(dòng)生成的。在報(bào)頭與正文之間,還必須輸出一個(gè)空行—$smtp->datasend(“\n”)。你的郵件正文跟隨在這個(gè)空行的后面,并且也用$smtp->datasend( 第第22學(xué)時(shí)使用CGI程序發(fā)送電子郵 既然你有了一個(gè)郵件發(fā)送函數(shù)send_mail(),那么從eb頁(yè)來(lái)發(fā)送郵件的其余工作就非常簡(jiǎn)單了。只要設(shè)計(jì)一個(gè)eb頁(yè),編寫(xiě)一個(gè)CTL程序清單22- 用于發(fā)送電子郵件的HTML窗 第三部分將Perl用于在上面這個(gè)代碼中的小程序中,有幾個(gè)問(wèn)題你應(yīng)該注意。首先,必須將程序清單22-1或22-2中的send_mail函數(shù)插入該程序,使該程序能夠運(yùn)行。哪個(gè)程序清單中的函數(shù)最好,并且適合于你,就使用該程序清單中的那個(gè)函數(shù)。其次,注意o:地址是通過(guò)硬連線與程序相連接的,正如ebmaster@的情況那樣。必須將這個(gè)地址改為你想要將郵件發(fā)送到的那個(gè)地址。該地址不是從用戶(hù)那里獲得的原因很簡(jiǎn)單,因?yàn)槟悴幌M脩?hù)使用eb窗體將郵件發(fā)往任意的地址。如果有人濫用你的窗體,將惡意郵件發(fā)送給某個(gè)人,那么你和你的系統(tǒng)將成為人們指責(zé)的目標(biāo)。因此這不是個(gè)好主意。如果你希望用一個(gè)窗體將郵件發(fā)送到多個(gè)目的地,請(qǐng)使用下拉列表(或者單選按鈕你提供一個(gè)地址選擇表:無(wú)論你如何進(jìn)行操作,不要讓實(shí)際的o:地址從窗體傳遞過(guò)來(lái)并用在你的程序中。請(qǐng)傳遞一個(gè)沒(méi)有問(wèn)題的值(1至3,并在你的CGI程序中對(duì)該值進(jìn)行相應(yīng)的轉(zhuǎn)換,(else。設(shè)計(jì)Internet上的電子郵件系統(tǒng)的要求之一是要能夠了解目的地址是否有效。然而這是不可能的。22-1和22-2。從發(fā)送郵件系統(tǒng)的角度來(lái)看,它無(wú)法看到郵件傳輸鏈的結(jié)尾環(huán)節(jié)。它必須將郵件全部傳遞給傳輸鏈上的第二個(gè)系統(tǒng),第二個(gè)系統(tǒng)又將郵件傳遞給第三個(gè)系統(tǒng),以此類(lèi)推。這些“傳遞”過(guò)程的延遲時(shí)間是很重要的,更重要的是,發(fā)送郵件的系統(tǒng)在將郵件送出去后就無(wú)法控制郵件了。標(biāo)準(zhǔn)的解決辦法是設(shè)法清除掉顯然無(wú)效的地址,無(wú)法確定是否有效的地址則屬例外。電Internet標(biāo)準(zhǔn)(RFC-822)有一個(gè)標(biāo)準(zhǔn)電子郵件地址的模板。但是,有些符合RFC-822標(biāo)準(zhǔn)的有效地址實(shí)際上是無(wú)效的,而有些不符合RFC-822標(biāo)準(zhǔn)的地址卻是有效的、可第22學(xué)時(shí)使用CGI程序發(fā)送電子郵 編寫(xiě)對(duì)電子郵件地址進(jìn)行匹配的正則表達(dá)式是不行的。例如,表達(dá)式/^[\w]\.)+\w+$/看上去是可行的,它甚至與me@這個(gè)地址相匹配。但是,它拒絕下面這個(gè)完全有效的電子郵件地址:與符合RFC-822標(biāo)準(zhǔn)的電子郵件地址相匹配的一個(gè)正則表達(dá)式長(zhǎng)達(dá)4700個(gè)字符,因?yàn)樘L(zhǎng),所以本書(shū)沒(méi)有將它列出,你也很難鍵入。同時(shí)它也無(wú)法與Internet上的每個(gè)傳輸郵件的地址相若要確定電子郵件地址是否有效,唯一的辦法是將一個(gè)郵件發(fā)送到該地址,然后等待對(duì)方的答復(fù)。如果由于某個(gè)原因,你希望確保對(duì)方地址上有人(比如將來(lái)將郵件發(fā)送給他,因?yàn)樗蟀l(fā)送,請(qǐng)發(fā)送一個(gè)電子郵件,要求他回答。當(dāng)對(duì)方的答復(fù)返回時(shí),就知道你發(fā)送了一份有效的電子郵件。在本學(xué)時(shí)中,我們介紹了如何從Web頁(yè)發(fā)送電子郵件。同時(shí),介紹了_()函數(shù)的兩個(gè)版本,它們可以用在任何Pr程序中來(lái)發(fā)送電子郵件。我們還講述了Intene問(wèn)題:能不能使用從瀏覽器中搜集到的信息來(lái)獲取Web解答:雖然能夠這樣做看起來(lái)是很好的(它可以消除獲取電子郵件地址時(shí)的錯(cuò)誤,但這是不可能的。瀏覽器并不包含用戶(hù)的電子郵件地址。CGI模塊中的remote_host函數(shù)返回的值實(shí)際上并不是用戶(hù)接收電子郵時(shí)使用的地址。如果你使用安全的Web事務(wù)處理,那么remote

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論