用ASP.NET設計高效郵件列表

iteye_20683發表於2009-12-17

出處:動態網站製作指南 作者:動態網站製作指南 時間:2006-3-20 12:40:00

一個吸引人的、功能完備的網站往往具有以下特徵:一是內容充實、實用,吸引對該類內容幹興趣的瀏覽者;二是頁面設定合理,頁面設計精美;三是網站互動性強,使用者和網站或者使用者與使用者之間交流方便高效;四是網站內容更新及時並且可以第一時間通知使用者。以上這些特點可能對於一些大型的入口網站而言,不是特別適合,因為入口網站的特點,使用者流量往往不是內容的區別而是使用者習慣、歷史原因和地域區別(比如廣東地區的瀏覽者喜歡網易、北京的喜歡新浪)。而對於一般個人網站或者企業網站而言,以上特點就顯得特別重要,因為這類網站內容更新不是很快,瀏覽者來這些網站往往具有特定目的性(比如尋找特定領域的資料或者產品資訊),當網站內容吸引到使用者以後,網站的更新資訊或者網站最新新聞就有必要及時通知瀏覽者,以此來緊緊抓住瀏覽者,培養瀏覽者的“瀏覽忠誠度”。這就是網站郵件列表的作用。


一、郵件列表作用和工作方式
郵件列表是什麼呢?郵件列表就是網站或者機構為了及時通知資訊給相關使用者,將這些使用者的電子郵件儲存並且在有資訊需要傳送的時候將資訊分別傳送給所有使用者。表面上,郵件列表和傳送電子郵件的時候使用的“附送”“密送”差不多,基本沒什麼差別,其實,它們還是有差別的:
(1)郵件列表具有明確的發行目的,傳送郵件列表就是為了傳送特定資訊給特定使用者;
(2)郵件列表接受人不能取得其他接受人的資料,這一點是郵件列表和電子郵件附送的最大區別。
我們知道,當我們收到一些電子郵件的時候,發現在郵件的“附送”欄有很多其他使用者的郵件地址,這就是通過“附送”方式將郵件傳送給一系列使用者;而通過郵件列表傳送的郵件,使用者感覺就是傳送人單獨傳送給使用者的,不能看見其他使用者的資訊,當然,實質也是這樣傳送的。這樣,我們就可以知道郵件列表的工作方式其實是將每個使用者的電子郵件取出,然後逐個傳送相同的資訊。
郵件列表既然是單獨逐個傳送資訊,那麼,肯定我們不能通過手工一個個傳送,只能通過軟體來傳送。現在,郵件列表的傳送以下幾種方式,一是通過專門的郵件群發軟體來實現,這些軟體將所有電子郵件地址讀入,然後逐個傳送,這些軟體的優點是可以針對具體使用者改變郵件主題資訊或者傳送人郵箱;缺點是往往這些軟體需要註冊費用;二是通過專門的郵件列表服務提供網站實現,這些網站通過程式幫助郵件列表發行者將資訊傳送給訂閱者,這是個人使用者使用最多的一種方式,這種方式的優點是簡單、免費,缺點是往往這些服務提供網站效能不是很穩定,郵件延遲情況時常發生;三是通過自己的網站設計一個郵件列表程式,自己管理,這樣的優點是傳送資訊高效、管理方便,缺點是技術實現稍微優點困難,不是很適合一般使用者。我們在這裡就介紹通過ASP.NET程式設計實現一個功能完備的郵件列表。


二、郵件列表的設計
在設計之前我們必須知道一點,郵件列表的所有電子郵件地址必須儲存成為一個檔案,這裡,我們將所有電子郵件地址儲存在Access資料庫中,這樣可以很方便的對郵件地址進行增加、修改、刪除等操作。在這裡,我們的資料庫名為mail.mdb,位於data目錄下。資料表名為mail,只有一個欄位“mail”,用於儲存電子郵件地址。
作為一個長期的網站功能,我們當然要求沒傳送以此郵件都必須有詳細的傳送記錄和每個郵件的傳送情況。這裡,我們在程式中會自動在log目錄使用傳送郵件的主題為檔名生產一個HTML格式的Log日誌檔案。
現在,我們已經基本瞭解了程式的功能和檔案結構,我們來看程式程式碼:
<%@ 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伺服器的名稱
Smtp.smtpserver="127.0.0.1"
'定義郵件的傳送地址
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
'預設傳送郵件格式為純文字TEXT,如果選擇HTML格式,設定為HTML格式
if mode.value="HTML" then
mailObj.BodyFormat=MailFormat.Html
end if
'設定郵件傳送級別為高
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
'連結資料庫
'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"> 傳送郵箱: </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"> 標題: </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">內容:</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>

程式執行介面如下(圖一):
1240001.jpg
在以上的程式中,我們將一些比較常見的功能設定成為函式,在主體程式中直接呼叫這些函式,這樣,程式看起來比較簡潔,修改也很簡單。在這裡,我們簡單介紹一下這些函式,一是連線資料庫的ConnectDB(txtdatabase AS String),這個函式使用Access資料庫的相對位置作為函式引數,返回資料庫連線OleDbConnection;函式readdb(conn As Oledbconnection,txtsql As String)可以直接執行一條SQL語句,返回OledbDataReader。在程式中,我們將每一個郵件傳送的結果儲存並且最好生成一個HTML格式的日誌檔案。因為程式中我們用到了資料庫、電子郵件和檔案操作,以此,在引入名字空間的時候,我們需要將“System.Data.OleDb”、“System.Web.Mail”和“System.IO”引入。
在使用以上郵件列表程式的時候,我們需要注意幾個問題,第一是Smtp伺服器的設定,我們知道,Smtp伺服器是郵件傳送伺服器,而現在一些免費郵件提供商是不再提供針對所有郵件提供Smtp服務,在傳送郵件的時候,需要驗證使用者資訊,而我們看到,在以上的程式中甚至整個ASP.NET的郵件部分,根本沒有考慮Smtp使用者驗證問題,以此,我們不能隨便使用一個Smtp伺服器,而必須使用完全免費的Smtp伺服器,這樣的伺服器現在已經很少了。所以,如果有條件,最好我們自己設定計算機為Smtp伺服器,怎樣實現,我們可以下載EasyMail等軟體。第二是郵件傳送速度問題,如果Smtp伺服器在本地計算機,傳送速度很快的,基本上不用擔心,如果不是本地伺服器,那麼傳送的時候最好不要以此太多,一是速度問題,二是以此傳送太多郵件,Smtp伺服器可能認為是垃圾郵件而拒絕服務,這一點我們可以自己試驗;第三是郵件傳送傳送人的設定問題,通過這個程式或者說通過使用ASP.NET的郵件功能,我們完全可以在郵件傳送人隨意寫,這樣,很容易別有用心的人就可以通過這個功能來傳送垃圾郵件,當然,這些郵件追查來源很簡單,直接查IP就可以,隨意,我們最好不要隨意傳送。


三、總結
以上我們用一個具體的例項介紹了完整郵件列表的設計,該程式完全根據實際需要設計,具有較大的實用性。在程式實現中,我們同時使用了資料庫、郵件和檔案操作,涉及內容較多,有興趣的朋友可以根據自己的實際要求適當修改,使程式功能更加全面。

相關文章