時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
??? 用asp.net發(fā)送Email已經(jīng)不是一件新鮮的事情了.可以采用很多種方法來發(fā)送,比如SmtpMail方法,Socket方法,通過第三方組件Jmail等方式都可以.但是本文討論的不是發(fā)送郵件采用的技術(shù),而是通過公司的一個項目實踐說說郵件引擎的架構(gòu),有不足和改進之處,歡迎同行批評指正.
??? 我們以前發(fā)送郵件的時候采用的方法就是,在頁面里面觸發(fā)進行發(fā)送,比如注冊了會員,點了提交按鈕之后,將會員數(shù)據(jù)插入到數(shù)據(jù)庫,然后進行發(fā)送.這種方法雖然簡單方便,但是有一個弱點,如果郵件發(fā)送失敗,就不能重發(fā)了.因此,在我們項目中采用的方法是,將需要發(fā)送的郵件統(tǒng)一插入到一個郵件隊列,然后由引擎來處理這個隊列.具體的做法是,數(shù)據(jù)庫設(shè)計:
Win_EmailQueue(郵件隊列表)
QueueId??? int?? 自動編號,主鍵Id
ToEmail??? nvarchar(100)? 收件人
Title????? nvarchar(100)? 郵件標題
Content??? ntext??? 郵件內(nèi)容
AddDate??? datetime 添加時間
TryTimes?? int????? 錯誤重試次數(shù)
LastSendTime datetime???? 最后一次發(fā)送的時間
Status???? int????? 狀態(tài):0 未發(fā)送 1 已經(jīng)發(fā)送
??? 需要發(fā)送郵件的時候,如注冊會員成功后,將郵件的內(nèi)容插入到表中.
??? 郵件引擎可以用一個系統(tǒng)服務(wù)來完成,安裝在Web服務(wù)器同一臺服務(wù)器上面,也可以根據(jù)負載實際情況安裝在另外一臺服務(wù)器上面,減輕Web服務(wù)器負擔(dān).郵件引擎的任務(wù)是間隔一個時間(比如5秒),查詢郵件隊列,根據(jù)時間順序發(fā)送郵件,為了降低引擎的負擔(dān),可以設(shè)置每次發(fā)送15封,當然這個數(shù)字要根據(jù)實際情況來配置.
??? 以下是處理隊列和發(fā)送郵件的一些代碼.
?///
? /// 發(fā)送Email隊列,
? ///
? public static void SendEmailQueue()
? {
????? //取最新的15條未成功的進行發(fā)送。
????? string sql = "select top 15 * from Win_EmailQueue where Status=0 and ToEmail<>'' order by AddDate desc";
????? DataTable dt = DbHelperSQL.Query(sql).Tables[0];
????? for (int i = 0; i < dt.Rows.Count; i++)
????? {
??? string title = dt.Rows[i]["Title"].ToString();
??? string content = dt.Rows[i]["Content"].ToString();
??? string to = dt.Rows[i]["ToEmail"].ToString();
??? string CreateTime = dt.Rows[i]["AddDate"].ToString();
??? string QueueID = dt.Rows[i]["QueueID"].ToString();
??? bool flag = EmailUtil.Send(title, to, content);
??? if (flag)
??? {
????? //發(fā)送成功,將Status設(shè)置為1
? sql = "update? Win_EmailQueue set Status=1 where QueueID=" + QueueID + "";
??? }
??? else
??? {
????? //發(fā)送失敗,將失敗次數(shù)增加1
? sql = "update?? Win_EmailQueue set TryTimes=TryTimes+1,LastSendTime='" + DateTime.Now.ToString() + "' where QueueID=" + QueueID + "";
??? }
??? DbHelperSQL.ExecuteSql(sql);
????? }
????? dt.Dispose();
????? //超過10次未成功的郵件,將不再發(fā)送
????? sql = "update? Win_EmailQueue set Status=1? where TryTimes>10";
????? DbHelperSQL.ExecuteSql(sql);
? }
?///
? /// 執(zhí)行發(fā)送操作
? ///
? ///
? public static bool Send(string title, string to, string content)
? {
????? //來自配置項
????? string fromemail = System.Configuration.ConfigurationManager.AppSettings["SMTPUserName"];
????? string smtpserver = System.Configuration.ConfigurationManager.AppSettings["SMTPServer"];
????? string frompwd = System.Configuration.ConfigurationManager.AppSettings["SMTPPass"];
????? string fromaddress = System.Configuration.ConfigurationManager.AppSettings["SMTPNickName"];
????? MailMessage mail = new MailMessage();
????? mail.From = new MailAddress(fromemail, fromaddress, Encoding.GetEncoding("gb2312"));//發(fā)件人的郵箱
????? mail.To.Add(new MailAddress(to));//收件人
????? mail.Subject = title;//主題
????? mail.Body = content;//內(nèi)容
????? mail.IsBodyHtml = true;
????? mail.SubjectEncoding = Encoding.GetEncoding("gb2312");
????? mail.BodyEncoding = Encoding.GetEncoding("gb2312");
????? mail.IsBodyHtml = true;
????? mail.Priority = MailPriority.Normal;
??&nb
關(guān)鍵詞標簽:Asp.net
相關(guān)閱讀
熱門文章 誅仙3飛升任務(wù)怎么做-誅仙3飛升任務(wù)流程最新2022 鐘離圣遺物推薦-原神鐘離圣遺物詞條 解決方法:應(yīng)用程序“DEFAULT WEB SITE”中的服務(wù)器錯誤 使用aspnet_regiis.exe 重新注冊.NET Framework
人氣排行 誅仙3飛升任務(wù)怎么做-誅仙3飛升任務(wù)流程最新2022 asp.net表單提交方法GET\POST 在ASP.NET中如何判斷用戶IE瀏覽器的版本 Asp.net中messagebox的實現(xiàn)方法 Asp.net中的web.config配置 在ASP.NET MVC中實現(xiàn)大文件異步上傳 asp.net獲取URL和IP地址 FileUpload上傳多文件出現(xiàn)錯誤的解決方法