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