ASP.NET郵件列表設計及實現淺析
一個吸引人的、功能完備的網站往往具有以下特征:一是內容充實、實用,吸引對該類內容干興趣的瀏覽者;二是頁面設置合理,頁面設計精美;三是網站互動性強,用戶和網站或者用戶與用戶之間交流方便高效;四是網站內容更新及時并且可以第一時間通知用戶。以上這些特點可能對于一些大型的門戶網站而言,不是特別適合,因為門戶網站的特點,用戶流量往往不是內容的區別而是用戶習慣、歷史原因和地域區別(比如廣東地區的瀏覽者喜歡網易、北京的喜歡新浪)。而對于一般個人網站或者企業網站而言,以上特點就顯得特別重要,因為這類網站內容更新不是很快,瀏覽者來這些網站往往具有特定目的性(比如尋找特定領域的資料或者產品信息),當網站內容吸引到用戶以后,網站的更新信息或者網站最新新聞就有必要及時通知瀏覽者,以此來緊緊抓住瀏覽者,培養瀏覽者的“瀏覽忠誠度”。這就是網站郵件列表的作用。
一、ASP.NET郵件列表作用和工作方式
郵件列表是什么呢?郵件列表就是網站或者機構為了及時通知信息給相關用戶,將這些用戶的電子郵件保存并且在有信息需要發送的時候將信息分別發送給所有用戶。表面上,郵件列表和發送電子郵件的時候使用的“附送”“密送”差不多,基本沒什么差別,其實,它們還是有差別的:
(1)郵件列表具有明確的發行目的,發送郵件列表就是為了發送特定信息給特定用戶;
(2)郵件列表接受人不能取得其他接受人的資料,這一點是郵件列表和電子郵件附送的最大區別。
我們知道,當我們收到一些電子郵件的時候,發現在郵件的“附送”欄有很多其他用戶的郵件地址,這就是通過“附送”方式將郵件發送給一系列用戶;而通過郵件列表發送的郵件,用戶感覺就是發送人單獨發送給用戶的,不能看見其他用戶的信息,當然,實質也是這樣發送的。這樣,我們就可以知道郵件列表的工作方式其實是將每個用戶的電子郵件取出,然后逐個發送相同的信息。
郵件列表既然是單獨逐個發送信息,那么,肯定我們不能通過手工一個個發送,只能通過軟件來發送。現在,郵件列表的發送以下幾種方式,一是通過專門的郵件群發軟件來實現,這些軟件將所有電子郵件地址讀入,然后逐個發送,這些軟件的優點是可以針對具體用戶改變郵件主題信息或者發送人郵箱;缺點是往往這些軟件需要注冊費用;二是通過專門的郵件列表服務提供網站實現,這些網站通過程序幫助郵件列表發行者將信息發送給訂閱者,這是個人用戶使用最多的一種方式,這種方式的優點是簡單、免費,缺點是往往這些服務提供網站性能不是很穩定,郵件延遲情況時常發生;三是通過自己的網站設計一個郵件列表程序,自己管理,這樣的優點是發送信息高效、管理方便,缺點是技術實現稍微優點困難,不是很適合一般用戶。我們在這里就介紹通過ASP.NET編程實現一個功能完備的郵件列表。
二、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 〉
程序運行界面如下(圖一):
在以上的程序中,我們將一些比較常見的功能設置成為函數,在主體程序中直接調用這些函數,這樣,程序看起來比較簡潔,修改也很簡單。在這里,我們簡單介紹一下這些函數,一是連接數據庫的ConnectDB(txtdatabase AS String),這個函數使用Access數據庫的相對位置作為函數參數,返回數據庫連接OleDbConnection;函數readdb(conn As Oledbconnection,txtsql As String)可以直接執行一條SQL語句,返回OledbDataReader。在程序中,我們將每一個郵件發送的結果保存并且最好生成一個HTML格式的日志文件。因為程序中我們用到了數據庫、電子郵件和文件操作,以此,在引入名字空間的時候,我們需要將“System.Data.OleDb”、“System.Web.Mail”和“System.IO”引入。
在使用以上ASP.NET郵件列表程序的時候,我們需要注意幾個問題,第一是Smtp服務器的設置,我們知道,Smtp服務器是郵件發送服務器,而現在一些免費郵件提供商是不再提供針對所有郵件提供Smtp服務,在發送郵件的時候,需要驗證用戶信息,而我們看到,在以上的程序中甚至整個ASP.NET的郵件部分,根本沒有考慮Smtp用戶驗證問題,以此,我們不能隨便使用一個Smtp服務器,而必須使用完全免費的Smtp服務器,這樣的服務器現在已經很少了。所以,如果有條件,最好我們自己設置計算機為Smtp服務器,怎樣實現,我們可以下載EasyMail等軟件。第二是郵件發送速度問題,如果Smtp服務器在本地計算機,發送速度很快的,基本上不用擔心,如果不是本地服務器,那么發送的時候最好不要以此太多,一是速度問題,二是以此發送太多郵件,Smtp服務器可能認為是垃圾郵件而拒絕服務,這一點我們可以自己試驗;第三是郵件發送發送人的設定問題,通過這個程序或者說通過使用ASP.NET的郵件功能,我們完全可以在郵件發送人隨意寫,這樣,很容易別有用心的人就可以通過這個功能來發送垃圾郵件,當然,這些郵件追查來源很簡單,直接查IP就可以,隨意,我們最好不要隨意發送。
三、總結
以上我們用一個具體的實例介紹了完整ASP.NET郵件列表的設計,該程序完全根據實際需要設計,具有較大的實用性。在程序實現中,我們同時使用了數據庫、郵件和文件操作,涉及內容較多,有興趣的朋友可以根據自己的實際要求適當修改,使程序功能更加全面。
【編輯推薦】