IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁(yè)網(wǎng)絡(luò)編程.Net編程 → 淺談Asp.net實(shí)現(xiàn)的郵件發(fā)送引擎

淺談Asp.net實(shí)現(xiàn)的郵件發(fā)送引擎

時(shí)間:2015/6/28來(lái)源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)

    用ASP.NET發(fā)送Email已經(jīng)不是一件新鮮的事情了.可以采用很多種方法來(lái)發(fā)送,比如SmtpMail方法,Socket方法,通過(guò)第三方組件Jmail等方式都可以.但是本文討論的不是發(fā)送郵件采用的技術(shù),而是通過(guò)公司的一個(gè)項(xiàng)目實(shí)踐說(shuō)說(shuō)郵件引擎的架構(gòu),有不足和改進(jìn)之處,歡迎同行批評(píng)指正.

    我們以前發(fā)送郵件的時(shí)候采用的方法就是,在頁(yè)面里面觸發(fā)進(jìn)行發(fā)送,比如注冊(cè)了會(huì)員,點(diǎn)了提交按鈕之后,將會(huì)員數(shù)據(jù)插入到數(shù)據(jù)庫(kù),然后進(jìn)行發(fā)送.這種方法雖然簡(jiǎn)單方便,但是有一個(gè)弱點(diǎn),如果郵件發(fā)送失敗,就不能重發(fā)了.因此,在我們項(xiàng)目中采用的方法是,將需要發(fā)送的郵件統(tǒng)一插入到一個(gè)郵件隊(duì)列,然后由引擎來(lái)處理這個(gè)隊(duì)列.具體的做法是,數(shù)據(jù)庫(kù)設(shè)計(jì):

Win_EmailQueue(郵件隊(duì)列表)
QueueId    int   自動(dòng)編號(hào),主鍵Id
ToEmail    nvarchar(100)  收件人
Title      nvarchar(100)  郵件標(biāo)題
Content    ntext    郵件內(nèi)容
AddDate    datetime 添加時(shí)間
TryTimes   int      錯(cuò)誤重試次數(shù)
LastSendTime datetime     最后一次發(fā)送的時(shí)間
Status     int      狀態(tài):0 未發(fā)送 1 已經(jīng)發(fā)送

    需要發(fā)送郵件的時(shí)候,如注冊(cè)會(huì)員成功后,將郵件的內(nèi)容插入到表中.

    郵件引擎可以用一個(gè)系統(tǒng)服務(wù)來(lái)完成,安裝在web服務(wù)器同一臺(tái)服務(wù)器上面,也可以根據(jù)負(fù)載實(shí)際情況安裝在另外一臺(tái)服務(wù)器上面,減輕Web服務(wù)器負(fù)擔(dān).郵件引擎的任務(wù)是間隔一個(gè)時(shí)間(比如5秒),查詢郵件隊(duì)列,根據(jù)時(shí)間順序發(fā)送郵件,為了降低引擎的負(fù)擔(dān),可以設(shè)置每次發(fā)送15封,當(dāng)然這個(gè)數(shù)字要根據(jù)實(shí)際情況來(lái)配置.

    以下是處理隊(duì)列和發(fā)送郵件的一些代碼.

 ///
  /// 發(fā)送Email隊(duì)列,
  ///
  public static void SendEmailQueue()
  {
      //取最新的15條未成功的進(jìn)行發(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();
      //超過(guò)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)
  {
      //來(lái)自配置項(xiàng)
      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)鍵詞標(biāo)簽:Asp.net

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門(mén)文章 手把手教你用好LINQ to SQL手把手教你用好LINQ to SQL在.NET環(huán)境下為網(wǎng)站增加IP過(guò)濾功能在.NET環(huán)境下為網(wǎng)站增加IP過(guò)濾功能ASP.NET 如何避免頁(yè)面重新整理時(shí)重復(fù)送出ASP.NET 如何避免頁(yè)面重新整理時(shí)重復(fù)送出用Asp.net擴(kuò)展ExtJS用Asp.net擴(kuò)展ExtJS

相關(guān)下載

人氣排行 asp.net表單提交方法GET\POST在ASP.NET中如何判斷用戶IE瀏覽器的版本Asp.net中messagebox的實(shí)現(xiàn)方法Asp.net中的web.config配置在ASP.NET MVC中實(shí)現(xiàn)大文件異步上傳用Iformattable接口控制.Net中文本格式c#.Net經(jīng)典面試題目用Asp.net擴(kuò)展ExtJS