摘 要:定時郵件群發系統由郵件列表、郵件發送、定時觸發送幾部分組成,利用System.Net.Mail類實現郵件發送,利用Application_Start事件和System.Timers類實現定時發送。ASP.NET作為先進的WEB開發工具被廣泛使用,強大的功能保證了功能實現的簡單性、系統的穩定性。
關鍵詞:ASP.NET 郵件 郵件群發 郵件列表
隨著信息技術的發展,因特網在人們的日常工作和生活中發揮著越來越大的作用。電子郵件作為因特網的重要功能之一,并利用電子郵件的快速、廉價、便于存儲、傳遞多媒體信息、便于多向交流、方便保密等獨特優點,在個項工作中發揮重要作用,如在BBS、交易等服務網站得到了廣泛應用。如果需要向多方用戶發送相同類型的郵件時,人工每份逐一發送不但工作量很大,而且不能達到及時發送的效果。所以群發就非常必要,讓每個用戶都能及時得到最新的信息。
一、郵件列表的作用和工作方式
郵件列表就是網站或者機構為了及時通知信息給相關用戶,將這些用戶的電子郵件保存,并且在有信息需要發送的時候將信息分別發送給所有用戶。表面上,郵件列表和發送電子郵件的時候使用的“附送”、“密送”差不多,基本沒什么差別,其實,它們還是有差別的:郵件列表具有明確的發送目的,發送郵件列表就是為了發送特定信息給特定用戶;郵件列表接受人不能取得其他接受人的資料,這一點是郵件列表和電子郵件附送的最大區別。發現在郵件的“附送”欄有很多其他用戶的郵件地址,這就是通過“附送”方式將郵件發送給一系列用戶;而通過郵件列表發送的郵件,用戶感覺就是發送人單獨發送給用戶的,不能看見其他用戶的信息。這樣,我們就可以知道郵件列表的工作方式其實是將每個用戶的電子郵件取出,然后逐個發送相同的信息。
二、郵件列表的設計
郵件列表的所有電子郵件地址必須保存在數據庫表中或一個文件中,這樣可以很方便地對郵件地址記錄進行管理。假設存入表userE-mail中,表結構為標識號ID、郵件地址E-mail等字段。利用DataSet讀取郵件地址E-mail。
private static void EMailList()
{
DataSet ds = new DataSet();
OleDbDataAdapter da = new OleDbDataAdapter(“select id,email from userEmail”,OleDbConnection);
da.Fill(ds);
}
三、郵件發送
一般來講,做ASP的郵件發送系統都是借助第三方開發的組件,如Jmail等,當然你也可以用Windows的自帶的對象CDONTS.NewMail對象來傳送E-mail,這雖然是免費的,但卻十分依賴操作平臺,CDONTS.NewMail對象只存在Windows 200和NT底下,在Windows 95/98底下是沒有這個對象。自從Microsoft公司推出了asp.net(微軟最強的開發語言),利用System.Net.Mail空間,E-mail的發送已經成為WEB程序設計的基本對象,利用MailMessage的to、from、host等屬性和send事件就能簡單實現發送郵件功能。
public Boolean SendMail(string cFrom,string cSmtpServer,string cUserName,string cPassword,string cTo,string cSubject,string cBody)
{
Msg.Sender = new MailAddress(cFrom);//發件地址
Msg.To.Add(cTo);//目的地址
Msg.Subject = cSubject;//標題
Msg.Body = cBody;//內容
Msg.IsBodyHtml = true;//內容發送是否以HTML格式發送,否則以文本格式發送
SmtpClient smtp = new SmtpClient();
smtp.Host = cSmtpServer;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(cUserName,cPassword);
smtp.Send(Msg);
}
四、Smtp服務器
Smtp服務器是郵件發送服務器,而現在一些免費郵件提供商是不再提供針對所有郵件提供Smtp服務,在發送郵件的時候,需要驗證用戶信息,因此,不能隨便使用一個Smtp服務器,而必須使用完全免費的Smtp服務器,這樣的服務器現在已經很少了。所以,如果有條件,最好我們自己設置計算機為Smtp服務器,怎樣實現,我們可以下載EasyMail等軟件。第二是郵件發送速度問題,如果Smtp服務器在本地計算機,發送速度很快,基本上不用擔心;如果不是本地服務器,那么發送的時候最好不要一次太多,一是速度問題,二是一次發送太多郵件,Smtp服務器可能認為是垃圾郵件而拒絕服務。
五、郵件定時群發
在ASP.NET開發的系統里面,有時會有需要定時做一件操作的功能,例如發送通知郵件、清理信息等。有些采用了Windows服務的方式,所有的Windows服務都必須寫入注冊表的HKEY_LO-CAL_MACHINE \SYSTEM \CurrentControlSet\Services位置中。但作為一個Web系統需要Windows服務,并且需要修改注冊表,假設需要更新系統還得又要更新服務,這樣就沒有發揮Web系統的優勢。
ASP.NET系統里能怎樣做定時類的功能?利用Global.asax中的Application_Start事件和System.Timers類。Global.asax文件(也稱作ASP.NET應用程序文件)是可選文件,包含用于響應ASP.NET引發的應用程序級別事件的代碼。Global.asax文件駐留在基于ASP.NET的應用程序的根目錄中。在運行時,分析Global.asax文件并將其編譯到一個動態生成的.NET Framework類,該類是從HttpApplication基類派生的。Global.asax文件本身被配置為自動拒絕對它的任何直接URL請求,外部用戶無法下載或查看在該文件中編寫的代碼。
void Application_Start(object sender,EventArgse)事件在應用程序開始前調用,只要該WEB系統開始運行,該事件就先觸發,定時觸發的判斷就可以加在里面。Timer組件是基于服務器的計時器,它使您能夠指定在應用程序中引發Elapsed事件的周期性間隔,然后可以操控此事件以提供定期處理。
void Application_Start(object sender,EventArgs e)
{
System.Timers.Timer t = new System.Timers.Timer(60000);//定義timer并設定其周期時間,1000為1秒
t.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);//定時調用處理事件
t.Enabled = true;
}
private static void OnTimedEvent(object source,System.Timers.ElapsedEventArgs e)
{
System.DateTime dt = System.DateTime.Now;
if (dt.Hour == 0 dt.Minute >= 0 dt.Minute <= 2) //設定執行事件的條件,這里設定每天凌晨執行
{
for (int i = 0;i <= ds.Tables.Rows - 1;i++) //循環發送郵件列表的每個地址
SendMail();
}
}
可以設置郵件發送完成標準,避免因為上一次發送沒有完成,而定時起Timer觸發了下次事件而造成的死鎖。
六、總結
以上實現了每個重要模塊的功能,該模塊完全根據實際需要設計,具有較大的實用性。也可以利用定時觸發功能完成系統的清理、備份、維護等周期性的操作。EMailList()、SendMail()等函數寫在類文件中,在Global.asax中調用,從而實現更復雜的功能,讓程序結構更合理可讀。