說(shuō)起發(fā)送Email,我們總是想起郵件客戶端軟件,比如Outlook Express、Foxmail(最新版3.0 beta1已于 4月30號(hào)發(fā)布,請(qǐng)到http://www.aerofox.com/下載)等。如果在Web上發(fā)送Email,大家肯定又會(huì)想起一些免費(fèi)的電子郵箱,比如大名鼎鼎的www.163.net等,那么如何實(shí)現(xiàn)在Web上發(fā)送Email呢?大家可能會(huì)想到首先安裝郵件服務(wù)器,比如Exchange,其實(shí)NT Server4.0加IIS4.0就可以了,本文就是想以實(shí)例來(lái)說(shuō)明技術(shù)上的實(shí)現(xiàn)方法。
郵件列表(Maillist)在Internet上應(yīng)用比較廣泛。使用郵件列表可以與訪問(wèn)者保持積極的聯(lián)系,快捷、簡(jiǎn)便、低成本地發(fā)送信息,也可以提高網(wǎng)站的知名度。擴(kuò)展后的郵件列表也可以用于創(chuàng)立電子雜志(像索易:http://www.soim.online.sh.cn/)。探討郵件列表的建立是非常有意義的,我們的實(shí)例就是建立一個(gè)郵件列表。
一、電子郵件發(fā)送原理
郵件傳遞過(guò)程的實(shí)現(xiàn)是從一個(gè)如Microsoft Outlook Express這樣的客戶端軟件將一份郵件發(fā)送給一個(gè)SMTP服務(wù)器開(kāi)始的,然后SMTP服務(wù)器負(fù)責(zé)決定如何處置該郵件。
如果電子郵件的目的域是服務(wù)器的本地域(比如將電子郵件發(fā)送給harrizon@domain.com,而且SMTP服務(wù)器是smtp.domain.com),那么該郵件被存儲(chǔ)在這個(gè)服務(wù)器上,否則將該郵件轉(zhuǎn)發(fā)給另一個(gè)合適的服務(wù)器。
網(wǎng)絡(luò)上所有的SMTP服務(wù)器都可以通過(guò)一種“語(yǔ)言”互相通信,這個(gè)通用語(yǔ)言就是SMTP協(xié)議。但是,服務(wù)器如何決定傳遞郵件的目的地呢?可以通過(guò)它的域名解析系統(tǒng)(DNS)來(lái)查找域。
NT Server是目前使用比較廣泛的網(wǎng)絡(luò)服務(wù)器,而且前景看好,IIS(Internet Information Server4.0,Internet信息服務(wù)器)是網(wǎng)絡(luò)文件和應(yīng)用程序服務(wù)器,它們使用HTTP、Gopher以及FTP,通過(guò)Internet或Intranet來(lái)提供服務(wù)。
IIS SMTP服務(wù)僅提供郵件傳遞功能,它不能對(duì)接收郵件提供服務(wù)。Microsoft在IIS中加入了一個(gè)特殊的組件—Collaboration Data Objects for Microsoft Windows NT Server,也稱(chēng)為CDO for NTS Library,它提供郵件對(duì)象,可以在ASP(Active Server Pages)腳本中使用這些對(duì)象來(lái)訪問(wèn)和處理發(fā)送給特定用戶的電子郵件。
郵件列表就是在網(wǎng)上收集訪問(wèn)者的Email,從而在需要的時(shí)候定期向該訂閱者發(fā)送一定的信息。需要的工作是收集Email、發(fā)送Email。下面我們可以看到如何來(lái)完成這些工作。
二、 從Web頁(yè)面發(fā)送電子郵件
利用IIS SMTP和CDO for IIS,可以從一個(gè)ASP腳本直接向Internet上的任何人發(fā)送電子郵件。
首先要安裝Microsoft NT Ser-ver4.0,然后再安裝IIS4.0,務(wù)必注意是否安裝了SMTP服務(wù),默認(rèn)方式是安裝的。安裝完畢后不妨看看在winnt\system32目錄下是否有一個(gè)文件cdonts.dll。如果存在這個(gè)文件,那么安裝過(guò)程宣告成功。
程序1是最簡(jiǎn)單的發(fā)送電子郵件程序,它將一封主題為subject、內(nèi)容為test的郵件從郵箱harrizon@163.net發(fā)送到ivan@188.net。
<%
Dim MailObject
Set MailObject = Server.CreateObject("CDONTS.NewMail")
MailObject.Send "harrizon@163.net"," ivan@188.net", "subject", "test"
%>
這樣的程序雖然可以快速測(cè)試是否成功,但是實(shí)用價(jià)值并不高。我們將其優(yōu)化一下,根據(jù)郵件列表的特點(diǎn),編出一個(gè)有實(shí)用價(jià)值的程序。
首先請(qǐng)用Access建立一個(gè)數(shù)據(jù)庫(kù)mail.mdb,用于保存email地址;然后需要建立一個(gè)表,表的名字為mail,包含一個(gè)字段email(字段名email,數(shù)據(jù)類(lèi)型:文本,字段長(zhǎng)度:50)即可,另外可以有一個(gè)id(字段名:id,數(shù)據(jù)類(lèi)型:自動(dòng)編號(hào),本字段可以不要)。設(shè)置ODBC ,在控制面板中雙擊ODBC圖標(biāo),設(shè)立dsn,其名為mail。
至此設(shè)置部分已經(jīng)完成,現(xiàn)在編寫(xiě)程序。
將程序2加入到你的主頁(yè)的合適位置。程序2的目的是為了收集訪問(wèn)者的Email。
<form method="POST" action="addmail.asp">
<p>您的Email:<input type="text" name="email" size="20"><input type="submit"
value="訂閱" name="B1"><input type="reset" value="重寫(xiě)" name="B2"></p>
</form>
用瀏覽器打開(kāi)程序2得到結(jié)果如圖1,填入一個(gè)合法的email地址,單擊“訂閱”。服務(wù)器自動(dòng)調(diào)用程序3,輸入的email將自動(dòng)入庫(kù),你不妨用Access直接打開(kāi)數(shù)據(jù)庫(kù)mail.mdb看看剛剛?cè)霂?kù)的Email是否保存了。
(圖注ASP-1) 圖1
<%
email=trim(request("email"))
Set Connection=Server.Create-Object("ADODB.Connection")
Connection.Open "mail","",""
SQL="INSERT INTO mail(email) VALUES('"+email+"')"
Set RS=Connection.Execute(sql)
response.write email%>,多謝您加入!
程序3的目的是將email保存到數(shù)據(jù)庫(kù)mail.mdb里去。
Email入庫(kù)意味著有了訂閱者,現(xiàn)在我們可以進(jìn)入下一個(gè)步驟—發(fā)送郵件給訂閱者了。
這里我們用兩個(gè)程序(sendmail. asp,mail.asp)來(lái)完成這部分工作,sendmail.asp的作用是生成一個(gè)界面(見(jiàn)圖2),在這里我們可以選擇發(fā)送的對(duì)象(全部或部分),填寫(xiě)發(fā)送的主題和內(nèi)容,也可以粘貼附件,填寫(xiě)完畢后就單擊“發(fā)送郵件”,此時(shí)對(duì)于管理員來(lái)說(shuō),一切工作是結(jié)束了,但如何發(fā)送郵件呢?我們就需要調(diào)用程序5了。
程序5為發(fā)送郵件處置程序mail. asp。其作用就是發(fā)送郵件,當(dāng)然是根據(jù)程序4的選擇和輸入來(lái)處理郵件的。程序5的完整源代碼參見(jiàn)《電子與電腦》的網(wǎng)站www.pccomputing.com.cn。
程序4為在線發(fā)送電子郵件sendmail.asp。程序運(yùn)行結(jié)果如圖2所示。
。▓D注ASP-2) 圖2
(程序4)
<% Set Connection=Server.CreateObject("ADODB.Connection")
Connection.Open "mail","",""
sql="select * from mail"
Set RS=Connection.Execute(sql)
sql1="select count(*) from mail"
Set RS1=Connection.Execute(sql1)
%>
<form method="POST" action="mail.asp">
<table border="1" width="100%">
<tr bgColor="#abcdef">
<td align="middle">適占耍喝*<%=rs1(0)%>位訂閱者<inputtype=
"checkbox" name="all" value="1" checked><hr><%do while not
rs.eof%>
<font size="3">
<input type="checkbox" name="shou" value="<%=rs(0)%>">
<%=RS(1)%>
<%
rs.movenext
loop
%> </td> </tr>
<tr bgColor="#eeddff">
<td width="7%">
郵件主題:<input type="text" name="subject" size="53"><br>
郵件內(nèi)容:<br>
<textarea rows="9" name="body" cols="59"></textarea><br>
您的mail:<input type="text" name="usemail" size="50" value="harrizon@21cn.com">
<br>附件:<input type="file" maxlength="50" name="attfile" size="20" value="">附件名稱(chēng):<input type="text" name="fname" size="10" value=""><br></p>
<input type="submit" value="發(fā)送郵件" name="B1"><input type="reset" value="重寫(xiě)" name="B2"></p> </td>
</tr>
</table>
</form>
。ǔ绦5)
<% SHOU=trim(request("SHOU")) '取得在程序四選擇和輸入的內(nèi)容
subject=trim(request("subject"))
body=trim(request("body"))
att_file=trim(request("attfile"))
fname=trim(request("fname"))
usemail=trim(request("usemail"))
ckall=request("all")
if ckall=1 then '是否是給所有訂閱者發(fā)送郵件
Set Conn2=Server.CreateObject("ADODB.Connection")
conn2.open "MAIL","","" '打開(kāi)數(shù)據(jù)庫(kù)
sql2="select * from mail"
Set RS2=Conn2.Execute(SQL2) '從數(shù)據(jù)庫(kù)讀出所有的郵件地址
do while not rs2.eof
item=rs2(0)
Set Conn=Server.CreateObject("ADODB.Connection")
conn.open "MAIL","",""
sql="select * from mail where id="+cstr(item)+""
Set RS=Conn.Execute(SQL)
Set MailObject = Server.CreateObject("CDONTS.NewMail")
if att_file="" then '附件為空
MailObject.Send usemail,rs(1),subject,body
response.write "無(wú)附件web郵件發(fā)送成功!"
%><hr><%else
f_name=fname
MailObject.From=gzer@163.net '發(fā)件郵址
MailObject.To=rs(1) '收件人
MailObject.Subject=subject
MailObject.Body=body
MailObject.AttachFile att_file,f_name
MailObject.Send '發(fā)送郵件
response.write "含附件web郵件發(fā)送成功!" '發(fā)送成功
end if
response.write "收信地址:"+rs(1)+"<p>"
response.write "主題:"+ subject +"<br>"
response.write "內(nèi)容:"+ body +"<br>"
%><hr><% rs2.movenext
loop
else
for each item in request("shou")
Set Conn=Server.CreateObject("ADODB.Connection")
conn.open "MAIL","",""
sql="select * from mail where id="+cstr(item)+""
Set RS=Conn.Execute(SQL)
Set MailObject = Server.CreateObject("CDONTS.NewMail")
if att_file="" then
MailObject.Send usemail,rs(1),subject,body
response.write "無(wú)附件web郵件發(fā)送成功!"
%><hr><%else '
f_name=fname
MailObject.From="gzer@163.net" '發(fā)件郵址
response.write rs(1) +"<br>"
MailObject.To=rs(1) '收件人
MailObject.Subject=subject
MailObject.Body=body
MailObject.AttachFile att_file,f_name
MailObject.Send
response.write "含附件web郵件發(fā)送成功!"
end if
%><hr><% next '下一封郵件
end if
%>
三、 后記
1. 由于篇幅的原因,這里省去了一些代碼,請(qǐng)讀者理解。
2. 如果發(fā)送郵件時(shí)加一個(gè)接收電子郵件地址的輸入欄,那么你可以給任何一個(gè)合法的地址發(fā)送電子郵件,應(yīng)用也就更為廣泛了。
3. 使用本程序可以發(fā)送匿名郵件,但注意請(qǐng)勿亂用!
4. 若是使用POP3組件,就可以接收郵件了。
5. 本程序的附件發(fā)送不支持中文路徑,有心者不妨編寫(xiě)更好的組件來(lái)支持中文路徑。
|