明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

用ASP.NET設(shè)計(jì)高效郵件下文

[摘要]廣東南海市公安局計(jì)算機(jī)安全監(jiān)察股 喻凱 一個(gè)吸引人的、功能完備的網(wǎng)站往往具有以下特征:一是內(nèi)容充實(shí)、實(shí)用,吸引對該類內(nèi)容干興趣的瀏覽者;二是頁面設(shè)置合理,頁面設(shè)計(jì)精美;三是網(wǎng)站互動(dòng)性強(qiáng),用戶和網(wǎng)站或者用戶與用戶之間交流方便高效;四是網(wǎng)站內(nèi)容更新及時(shí)并且可以第一時(shí)間通知用戶。以上這些特點(diǎn)可能對于一...

廣東南海市公安局計(jì)算機(jī)安全監(jiān)察股 喻凱 

一個(gè)吸引人的、功能完備的網(wǎng)站往往具有以下特征:一是內(nèi)容充實(shí)、實(shí)用,吸引對該類內(nèi)容干興趣的瀏覽者;二是頁面設(shè)置合理,頁面設(shè)計(jì)精美;三是網(wǎng)站互動(dòng)性強(qiáng),用戶和網(wǎng)站或者用戶與用戶之間交流方便高效;四是網(wǎng)站內(nèi)容更新及時(shí)并且可以第一時(shí)間通知用戶。以上這些特點(diǎn)可能對于一些大型的門戶網(wǎng)站而言,不是特別適合,因?yàn)殚T戶網(wǎng)站的特點(diǎn),用戶流量往往不是內(nèi)容的區(qū)別而是用戶習(xí)慣、歷史原因和地域區(qū)別(比如廣東地區(qū)的瀏覽者喜歡網(wǎng)易、北京的喜歡新浪)。而對于一般個(gè)人網(wǎng)站或者企業(yè)網(wǎng)站而言,以上特點(diǎn)就顯得特別重要,因?yàn)檫@類網(wǎng)站內(nèi)容更新不是很快,瀏覽者來這些網(wǎng)站往往具有特定目的性(比如尋找特定領(lǐng)域的資料或者產(chǎn)品信息),當(dāng)網(wǎng)站內(nèi)容吸引到用戶以后,網(wǎng)站的更新信息或者網(wǎng)站最新新聞就有必要及時(shí)通知瀏覽者,以此來緊緊抓住瀏覽者,培養(yǎng)瀏覽者的“瀏覽忠誠度”。這就是網(wǎng)站郵件列表的作用。

一、郵件列表作用和工作方式
郵件列表是什么呢?郵件列表就是網(wǎng)站或者機(jī)構(gòu)為了及時(shí)通知信息給相關(guān)用戶,將這些用戶的電子郵件保存并且在有信息需要發(fā)送的時(shí)候?qū)⑿畔⒎謩e發(fā)送給所有用戶。表面上,郵件列表和發(fā)送電子郵件的時(shí)候使用的“附送”“密送”差不多,基本沒什么差別,其實(shí),它們還是有差別的:(1)郵件列表具有明確的發(fā)行目的,發(fā)送郵件列表就是為了發(fā)送特定信息給特定用戶;(2)郵件列表接受人不能取得其他接受人的資料,這一點(diǎn)是郵件列表和電子郵件附送的最大區(qū)別。我們知道,當(dāng)我們收到一些電子郵件的時(shí)候,發(fā)現(xiàn)在郵件的“附送”欄有很多其他用戶的郵件地址,這就是通過“附送”方式將郵件發(fā)送給一系列用戶;而通過郵件列表發(fā)送的郵件,用戶感覺就是發(fā)送人單獨(dú)發(fā)送給用戶的,不能看見其他用戶的信息,當(dāng)然,實(shí)質(zhì)也是這樣發(fā)送的。這樣,我們就可以知道郵件列表的工作方式其實(shí)是將每個(gè)用戶的電子郵件取出,然后逐個(gè)發(fā)送相同的信息。
郵件列表既然是單獨(dú)逐個(gè)發(fā)送信息,那么,肯定我們不能通過手工一個(gè)個(gè)發(fā)送,只能通過軟件來發(fā)送,F(xiàn)在,郵件列表的發(fā)送以下幾種方式,一是通過專門的郵件群發(fā)軟件來實(shí)現(xiàn),這些軟件將所有電子郵件地址讀入,然后逐個(gè)發(fā)送,這些軟件的優(yōu)點(diǎn)是可以針對具體用戶改變郵件主題信息或者發(fā)送人郵箱;缺點(diǎn)是往往這些軟件需要注冊費(fèi)用;二是通過專門的郵件列表服務(wù)提供網(wǎng)站實(shí)現(xiàn),這些網(wǎng)站通過程序幫助郵件列表發(fā)行者將信息發(fā)送給訂閱者,這是個(gè)人用戶使用最多的一種方式,這種方式的優(yōu)點(diǎn)是簡單、免費(fèi),缺點(diǎn)是往往這些服務(wù)提供網(wǎng)站性能不是很穩(wěn)定,郵件延遲情況時(shí)常發(fā)生;三是通過自己的網(wǎng)站設(shè)計(jì)一個(gè)郵件列表程序,自己管理,這樣的優(yōu)點(diǎn)是發(fā)送信息高效、管理方便,缺點(diǎn)是技術(shù)實(shí)現(xiàn)稍微優(yōu)點(diǎn)困難,不是很適合一般用戶。我們在這里就介紹通過ASP.NET編程實(shí)現(xiàn)一個(gè)功能完備的郵件列表。

二、郵件列表的設(shè)計(jì)
在設(shè)計(jì)之前我們必須知道一點(diǎn),郵件列表的所有電子郵件地址必須保存成為一個(gè)文件,這里,我們將所有電子郵件地址保存在Access數(shù)據(jù)庫中,這樣可以很方便的對郵件地址進(jìn)行增加、修改、刪除等操作。在這里,我們的數(shù)據(jù)庫名為mail.mdb,位于data目錄下。數(shù)據(jù)表名為mail,只有一個(gè)字段“mail”,用于保存電子郵件地址。
作為一個(gè)長期的網(wǎng)站功能,我們當(dāng)然要求沒發(fā)送以此郵件都必須有詳細(xì)的發(fā)送記錄和每個(gè)郵件的發(fā)送情況。這里,我們在程序中會(huì)自動(dòng)在log目錄使用發(fā)送郵件的主題為文件名生產(chǎn)一個(gè)HTML格式的Log日志文件。
現(xiàn)在,我們已經(jīng)基本了解了程序的功能和文件結(jié)構(gòu),我們來看程序代碼:
<%@ Page Language="VB" Debug="True" Explicit="True"%>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Web.Mail" %>
<%@ Import Namespace="System.IO" %>

<html>

<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>郵件列表</title>

<style>
<!--
a:link{color:#0066FF;text-decoration:none;font-size:"9 pt"} 
a:visited{color:#000066;text-decoration:none;font-size:"9 pt"} 
a:actived{color:#FF0000;font-size:"9 pt"}
a:hover{color:#FF0000;font-size:"9 pt"} 
table{font-size:"11 pt"}
-->
</style>

</head>

<body>

<SCRIPT language=VB RUNAT="server">
Sub SendMail(Obj As Object, E As EventArgs) 
lbmsg.Text="

Dim mailObj AS new MailMessage 
Dim smtp AS new SmtpMail 
'定義SMTP服務(wù)器的名稱 
Smtp.smtpserver="127.0.0.1" 
'定義郵件的發(fā)送地址 
mailObj.From=sendmailbox.value
'定義郵件的接收地址 
Dim conn AS OleDbConnection
conn=connectdb("data\mail.mdb")
conn.open()
Dim reader As oledbdatareader
reader=readdb(conn,"select * from mail")

while (reader.read())
try 
mailObj.To=reader("mail")

mailObj.Subject =subject.value
mailObj.Body =content.value
'默認(rèn)發(fā)送郵件格式為純文本TEXT,如果選擇HTML格式,設(shè)置為HTML格式
if mode.value="HTML" then
mailObj.BodyFormat=MailFormat.Html
end if
'設(shè)置郵件發(fā)送級別為高
mailObj.Priority = MailPriority.High 

Smtp.Send(mailObj) 

lbmsg.text=lbmsg.text+reader("mail")+"OK!Time:"+Now().ToString()+"<br>"
catch er as Exception
lbmsg.text=lbmsg.text+er.message+"<br>"
finally

End Try
End While 
reader.close()
Dim strwriterobj As StreamWriter
try
strwriterobj= File.CreateText(Server.MapPath("log\")+subject.value+".htm")
strwriterobj.Write("<HTML><head><meta http-equiv='Content-Language' content='zh-cn'><meta http-equiv='Content-Type' content='text/html; charset=gb2312'></head><BODY>"+lbmsg.text+"</BODY></HTML>")
catch er as Exception
lbmsg.text=lbmsg.text+er.message+"<br>"
finally
strwriterobj.close
lbmsg.text=lbmsg.text+"日志保存成功!保存目錄:<br>"+Server.MapPath("log\")+subject.value+".htm"
End Try

End Sub 

'鏈接數(shù)據(jù)庫
'www.knowsky.com
Function ConnectDB(txtdatabase AS String) As Oledbconnection
Dim conn AS OledbConnection
Dim connstr As String
connstr="Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=False; Data Source=" +Server.MapPath(txtdatabase)
connectdb=New OledbConnection(connstr)
End Function

'讀取一條記錄
Function readdb(conn As Oledbconnection,txtsql As String) As OledbDataReader
Dim cmd As OledbCommand
cmd=new oledbcommand(txtsql,conn)
readdb=cmd.executereader()
End Function
</SCRIPT>


<p align="center"><font size="5" face="楷體_GB2312">郵件列表</font></p>
<hr width="60%" size="1">
<div align="center">
<center>
<table border="0" width="770">
<tr>
<td width="100%">
<form method="POST" runat="Server">
<table border="0" width="100%" height="125">
<tr>
<td width="15%" align="right" height="24"> 發(fā)送郵箱: </td>
<td width="85%" height="24"><input type="text" name="sendmailbox" id="sendmailbox" size="50" runat="Server"/></td>
</tr>
<tr>
<td width="15%" align="right" height="24"> 標(biāo)題: </td>
<td width="85%" height="24"><input type="text" name="subject" id="subject" size="50" runat="Server"/></td>
</tr>
<tr>
<td width="15%" align="right" height="60">內(nèi)容:</td>
<td width="85%" height="60"><textarea rows="6" name="content" cols="80" id="content" runat="Server"/></textarea></td>
</tr>
<tr>
<td width="15%" align="right" height="23">方式:</td>
<td width="85%" height="23"><select size="1" name="mode" id="mode" runat="Server">
<option value="Text" selected>Text</option>
<option value="HTML">HTML</option>
</select></td>
</tr>
</table>
<p align="center"><input type="button" value=" 提 交 " name="ok" onserverclick="sendmail" runat="Server"/></p>
</form>
<ASP:Label id="lbmsg" runat="Server"/>
<p> 
</td>
</tr>
<tr>
<td width="100%"></td>
</tr>
</table>
</center>
</div>

</body>

</html>
程序運(yùn)行界面如下(圖一):

 
在以上的程序中,我們將一些比較常見的功能設(shè)置成為函數(shù),在主體程序中直接調(diào)用這些函數(shù),這樣,程序看起來比較簡潔,修改也很簡單。在這里,我們簡單介紹一下這些函數(shù),一是連接數(shù)據(jù)庫的ConnectDB(txtdatabase AS String),這個(gè)函數(shù)使用Access數(shù)據(jù)庫的相對位置作為函數(shù)參數(shù),返回?cái)?shù)據(jù)庫連接OleDbConnection;函數(shù)readdb(conn As Oledbconnection,txtsql As String)可以直接執(zhí)行一條SQL語句,返回OledbDataReader。在程序中,我們將每一個(gè)郵件發(fā)送的結(jié)果保存并且最好生成一個(gè)HTML格式的日志文件。因?yàn)槌绦蛑形覀冇玫搅藬?shù)據(jù)庫、電子郵件和文件操作,以此,在引入名字空間的時(shí)候,我們需要將“System.Data.OleDb”、“System.Web.Mail”和“System.IO”引入。
在使用以上郵件列表程序的時(shí)候,我們需要注意幾個(gè)問題,第一是Smtp服務(wù)器的設(shè)置,我們知道,Smtp服務(wù)器是郵件發(fā)送服務(wù)器,而現(xiàn)在一些免費(fèi)郵件提供商是不再提供針對所有郵件提供Smtp服務(wù),在發(fā)送郵件的時(shí)候,需要驗(yàn)證用戶信息,而我們看到,在以上的程序中甚至整個(gè)ASP.NET的郵件部分,根本沒有考慮Smtp用戶驗(yàn)證問題,以此,我們不能隨便使用一個(gè)Smtp服務(wù)器,而必須使用完全免費(fèi)的Smtp服務(wù)器,這樣的服務(wù)器現(xiàn)在已經(jīng)很少了。所以,如果有條件,最好我們自己設(shè)置計(jì)算機(jī)為Smtp服務(wù)器,怎樣實(shí)現(xiàn),我們可以下載EasyMail等軟件。第二是郵件發(fā)送速度問題,如果Smtp服務(wù)器在本地計(jì)算機(jī),發(fā)送速度很快的,基本上不用擔(dān)心,如果不是本地服務(wù)器,那么發(fā)送的時(shí)候最好不要以此太多,一是速度問題,二是以此發(fā)送太多郵件,Smtp服務(wù)器可能認(rèn)為是垃圾郵件而拒絕服務(wù),這一點(diǎn)我們可以自己試驗(yàn);第三是郵件發(fā)送發(fā)送人的設(shè)定問題,通過這個(gè)程序或者說通過使用ASP.NET的郵件功能,我們完全可以在郵件發(fā)送人隨意寫,這樣,很容易別有用心的人就可以通過這個(gè)功能來發(fā)送垃圾郵件,當(dāng)然,這些郵件追查來源很簡單,直接查IP就可以,隨意,我們最好不要隨意發(fā)送。

三、總結(jié)
以上我們用一個(gè)具體的實(shí)例介紹了完整郵件列表的設(shè)計(jì),該程序完全根據(jù)實(shí)際需要設(shè)計(jì),具有較大的實(shí)用性。在程序?qū)崿F(xiàn)中,我們同時(shí)使用了數(shù)據(jù)庫、郵件和文件操作,涉及內(nèi)容較多,有興趣的朋友可以根據(jù)自己的實(shí)際要求適當(dāng)修改,使程序功能更加全面。