提示:閱讀本文需提前了解的相關知識
1、電子郵件協議(http://baike.baidu.com/view/2367542.htm)
2、阿里雲郵件推送(https://www.aliyun.com/product/directmail)
3、EDM(電子郵件營銷)(http://baike.baidu.com/subview/1212416/8602812.htm)
4、SendCloud郵件服務(http://sendcloud.sohu.com/)
閱讀目錄結構
引:
一、需求分析
二、功能設計
三、詳細實現步驟
四、總結與思考
引:
我們會發現,越來越多的互聯網應用和企業級應用,開始使用郵件驗證碼驗證替代郵件鏈接驗證,例如下圖:
又例如:
當然,也有更多的應用使用了漂亮的HTML代碼來裝飾郵件,例如:
又例如:
我想,一個優秀的互聯網應用或者個體經營的站長站點,如果在注冊、身份證驗證、信息推送等功能上,加上如上效果的郵件服務,一定能帶來更加優質的用戶體驗
而郵件服務也不是現在才有,我們可以回顧一下發展歷史
很多站長應該都記得,在例如Discuz、WordPress等CMS中,都可以配置SMTP信息,開通了163等郵箱的SMTP功能就可以填入賬號密碼,從而達到發送郵件的功能。
很多企業在若干年前,也熱衷於使用大型如ExchangeServer,中小型如UMail等軟件搭建自己的企業郵件服務系統。
但是隨着互聯網的發展,伴隨着QQ等郵件服務商的走紅,傳統的國外那一套郵件規則和秩序已經發生了改變,有時候就算你有很多IP,做了反向解析,在Spamhaus白名單,又或者虛擬了不同的helo域,QQ郵箱還是照攔不誤,最終還是得單獨花錢向國內外各大ESP購買獨立通道
在這種情況下,自建郵局系統或者郵件SMTP服務,就顯得得不償失了,所以一方面各大企業郵箱服務越做越好,得到企業的認可,另一方面,國內外如SendGrid,SendCloud等第三方郵件PUSH服務商也逐漸做大,他們用更專業的手段,去解決通道、白名單、信譽度等各種郵件服務問題,而客戶只需要通過SMTP協議或者封裝的API接口,就可以非常便捷的給用戶發送郵件
就我所知,目前國內做的最好的當屬搜狐的SendCloud,但是SendCloud發展了這么多年,也越來越復雜和專業,我認為更適合有大型EDM需求的應用使用,作為中小企業和創業者以及站長,首推依然是阿里雲的郵件推送服務,一如既往秉持阿里雲的特點:使用傻瓜,上手快速,文檔俱全,但漏洞和問題多多,不過作為AWS的追趕者,能在短時間內快速實現這些應用級功能,也算是值得鼓勵的。因此下面也基於阿里雲郵件推送服務,來實現一個自己的郵件驗證與推送體系。
一、需求分析
做任何事情,頂層設計非常重要,優秀的設計往往讓以后的事情事半功倍,所以在設計整個郵件驗證與推送體系前,我們先看看有哪些功能是希望能夠實現的
- 支持郵件發送驗證碼和郵件營銷推送
- 能夠通過開發在程序邏輯或者管理界面中自動觸發發送
- 能夠支持HTML的郵件內容,而HTML內容能夠隨時隨地進行修改,方便美工和開發去調整
- 驗證類郵件能夠支持IP統計、次數統計,能夠進行時間限制、防止惡意發送
- 推送類郵件能夠支持統計發送數量、發送成功率等反饋數據。
- 推送類郵件,用戶可以退訂。
當然,最重要的,驗證郵件要能在5-10秒內發送成功,到達率高
二、功能設計
經過以上需求分析,可以明確出以下一些關鍵的設計思路
1、需要設計模板功能。通過模板功能來支持HTML郵件內容以及隨時可更新替換的要求,通過模板里的關鍵詞參數設計,來達到驗證碼、用戶名、營銷內容的動態輸入。
2、需要設計一個驗證碼相關表。用來支撐郵件驗證碼校驗、請求限制等功能。
3、需要設計一個發送記錄相關表。記錄所有發送記錄,用於統計和分析。
4、管理后台盡量界面化管理。用戶管理、郵件模板配置、發送記錄查詢等基本支撐功能,在后台盡量以界面化實現管理。
5、將企業郵局和郵件推送服務分開。以域名XXX.com為例,一般企業郵局地為zhangsan@XXX.com,郵件服務不宜以XXX.com為域,會和企業郵局服務相互干擾(也不是完全不可能,只是配置起來很麻煩),應當增加一個二級域名,例如mail.XXX.com,郵件服務地址就是service@mail.XXX.com。
整體功能架構圖如下:
三、詳細實現步驟
正好手上有個網站,含有注冊郵件驗證功能,那就基於這個網站的開發,一步一步的講解一下詳細的實現步驟
最終實現效果如下:
網站域名是:alphams.cn,地址為 https://www.alphams.cn,用戶注冊地址為https://www.alphams.cn/Register
官方企業郵箱域是@alphams.cn,客服郵件地址為:kefu@alphams.cn
在阿里雲申請的郵件服務域為:@mail.alphams.cn,服務郵件地址為:service@mail.alphams.cn
具體的實現步驟為:
1、注冊阿里雲企業郵箱免費版,實現客服郵件地址
我們的企業郵局服務使用了阿里雲企業郵箱免費版。(吐槽一下,竟然要轉發微博才能注冊還捆綁消費6元郵件推送)
支付成功后,可以在企業郵箱列表中看到
下面繼續設置解析,可以到幫助頁面看到如何設置解析
前往域名解析處進行解析設置
解析后,企業郵箱生效,進行管理員用戶密碼初始化
使用管理員賬號進入 https://qiye.aliyun.com/
繼續設置安全問題並綁定手機號
成功進入后繼續添加客戶賬號
至此,企業郵局賬號添加成功,到Foxmail中進行登錄。
2、配置阿里雲郵件服務
首先要添加一個發信域名
這里我們也可以注意到,阿里雲也提示不要添加企業郵箱域名,這和我們之前設計中的思路一致,這里我們添加的域名是 mail.alphams.cn
然后阿里雲提示需要配置一些解析信息,從而生效域名
下面前往阿里雲的域名解析中進行設置
設置好了以后回到剛才的頁面進行驗證
這樣,域名就添加成功了
下面繼續添加發信地址
這里我們可以看到,發信賬號如我們之前所說,是service@mail.alphams.cn
發信類型選擇了批量郵件(這里有個疑問,在實測中發現,阿里雲這個推送服務有觸發郵件和批量郵件,觸發郵件類型偶爾會發不出去或者接收不到,不知道原因是什么,有深入研究的人感謝告知我一下)
這時候回信地址還未通過驗證,我們點擊驗證回信地址,然后前往之前申請的QQ企業郵箱中,來驗證
這樣就進行了驗證
這時候還需要設置一下SMTP密碼,我們設置為XXX
這里特別需要注意的是阿里雲的官方說明
發信域名在創建之前要仔細,因為不能給刪除和修改。
這樣,阿里雲郵件服務的配置就完成了。
SMTP服務地址為:smtpdm.aliyun.com,SMTP賬號就是service@mail.alphams.cn,密碼就是剛才設置的密碼
到這一步為止,已經可以為很多站長網站的郵件服務提供支撐了,在一些CMS里面直接配置入SMTP信息即可使用。
但是,網站和應用大部分都是獨立開發,我們更需要設計自己的郵件發送和功能處理體系,因此下面我們繼續
3、用戶注冊頁面的准備工作
具體的頁面編碼和程序邏輯因為非今天所講重點,所以這里省略若干字以及若干代碼,把主要的步驟列出來,源碼可郵件找我要:
由於要加入郵件地址的驗證,所以先對注冊頁面的完整流程進行設計,邏輯圖如下:
其中,為了增強用戶體驗,先驗證郵件地址,再輸入用戶名,而這種里面的關聯和強邏輯用一個注冊會話表來進行控制
注冊會話表結構如下:
臨時驗證成功的郵件地址,存入會話表,並向客戶端反回一個會話編號,最終完成注冊時,需要用戶名密碼連同這個會話編號一起傳入后台驗證注冊
接下來就是郵件驗證表的設計
這個表既要能支持沒有用戶狀態的驗證,例如注冊驗證,又要能支持用戶運行時的驗證,例如修改密碼驗證等。
表結構如下:
其中渠道為具體的使用場景,狀態和過期時間兩個字段用來雙重控制有效性,預留的兩個參數,用於存儲用戶編號、注冊會話編號等額外的數據
當然,也少不了用戶表,因為這里並沒有什么特殊的用戶場景,所以用戶表較為簡單,結構如下:
4、郵件模板的設計
接下來就進入具體的開發,在開發中,肯定會用到對郵件的發送,在我們這個設計的體系里面,最上面也說了,需要設計模板機制,那么我們就先設計郵件模板功能
具體的功能架構為:
這里設計了最簡單的模板功能,主要思路即數據庫存儲HTML模板內容,參數直接放入HTML代碼中,在開發時進行替換
下面是郵件模板表的設計,表結構如下:
在后端對模板進行增刪改查管理,省略代碼若干,最終效果如下:
先構建一個用於新用戶注冊的HTML模板
然后在管理界面添加信息和HTML代碼
然后添加成功
5、郵件發送的技術准備
通過阿里雲的技術文檔可以知道,阿里雲郵件服務的調用方式有三種
原本准備使用API接口進行封裝,但是最近太忙了,所以先使用STMP接口方式進行了一次封裝,主要代碼如下:
實體:
/// <summary> /// 郵件直推請求 /// </summary> public class AliyunEMailDirectPushRequest { /// <summary> /// 目標郵件地址列表 /// </summary> public Dictionary<String, String> AimAddressList { get; set; } /// <summary> /// 來源郵件地址 /// </summary> public KeyValuePair<String, String> FromAddress { get; set; } /// <summary> /// 回復郵件地址列表 /// </summary> public Dictionary<String, String> ReplyAddressList { get; set; } /// <summary> /// 郵件標題 /// </summary> public String Subject { get; set; } /// <summary> /// 郵件文本 /// </summary> public String Text { get; set; } /// <summary> /// 郵件HTML /// </summary> public String HTML { get; set; } /// <summary> /// 類型 /// </summary> public Int32 Type { get; set; } /// <summary> /// SMTP用戶名 /// </summary> public String SMTPUserName { get; set; } /// <summary> /// SMTP密碼 /// </summary> public String SMTPPassword { get; set; } } /// <summary> /// 郵件直推響應 /// </summary> public class AliyunEMailDirectPushResponse { /// <summary> /// 推送結果 /// </summary> public Int32 Result { get; set; } /// <summary> /// 推送結果消息 /// </summary> public String ResultMessage { get; set; } }
發送業務代碼:
/// <summary> /// 郵件直接推送 /// </summary> /// <param name="String"></param> /// <returns></returns> public static AliyunEMailDirectPushResponse EMailDirectPush(AliyunEMailDirectPushRequest _Request) { AliyunEMailDirectPushResponse MyReturn = new AliyunEMailDirectPushResponse(); MailMessage MyMailMessage = new MailMessage(); //填充目標郵件地址 foreach (var e in _Request.AimAddressList) { MyMailMessage.To.Add(new MailAddress(e.Key, e.Value)); } //填充來源郵件地址 MyMailMessage.From = new MailAddress(_Request.FromAddress.Key, _Request.FromAddress.Value); //填充回復郵件地址 foreach (var e in _Request.ReplyAddressList) { MyMailMessage.ReplyToList.Add(new MailAddress(e.Key, e.Value)); } // 郵件主題 MyMailMessage.Subject = _Request.Subject; // 郵件正文內容 String Text = _Request.Text; String HTML = _Request.HTML; if (_Request.Type == 1) { //文本發送方式 MyMailMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(Text, null, MediaTypeNames.Text.Plain)); } if (_Request.Type == 2) { //HTML發送方式 MyMailMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(HTML, null, MediaTypeNames.Text.Html)); } //郵件推送的SMTP地址和端口 SmtpClient MySmtpClient = new SmtpClient("smtpdm.aliyun.com", 25); // 使用SMTP用戶名和密碼進行驗證 System.Net.NetworkCredential MyNetworkCredential = new System.Net.NetworkCredential(_Request.SMTPUserName, _Request.SMTPPassword); MySmtpClient.Credentials = MyNetworkCredential; MySmtpClient.Timeout = 5000;//設置5秒超時 try { MySmtpClient.Send(MyMailMessage); MyReturn.Result = 1; MyReturn.ResultMessage = "發送成功"; return MyReturn; } catch (Exception e) { MyReturn.Result = -1; MyReturn.ResultMessage = e.Message; return MyReturn; } }
6、郵件驗證碼生成與發送的實現
主要代碼如下:
/// <summary> /// 創建注冊郵件驗證 /// </summary> /// <param name="_Request"></param> /// <returns></returns> private DWebAccountCreateRegisterEMailVerifyResponse CreateRegisterEMailVerify(DWebAccountCreateRegisterEMailVerifyRequest _Request, HttpRequestMessage _HttpRequest) { DWebAccountCreateRegisterEMailVerifyResponse MyResponse = new DWebAccountCreateRegisterEMailVerifyResponse(); DWebMySQLDataContexter CheckQueryDataContexter = CreateNewDataContexter(); //首先檢查是否存在郵件 var UserCheckQuery = CheckQueryDataContexter.ams_user_table.Where(e => e.AUT_EMAILADDRESS == _Request.EMailAddress); if (UserCheckQuery.Count() > 0) { MyResponse.SetResult(-1, "郵件已經存在"); return MyResponse; } else { //再檢查和最近一次的發送是否已經超過1分鍾了 DateTime CheckDateTime = DateTime.Now.AddMinutes(4);//增加4分鍾 var VerifyCreateCheckQuery = CheckQueryDataContexter.ams_email_verify_table.Where(e => e.AEVT_EMAILADDRESS == _Request.EMailAddress && e.AEVT_EXPIRETIME >= CheckDateTime); if (VerifyCreateCheckQuery.Count() > 0) { MyResponse.SetResult(-2, "一分鍾內只能發送一次郵件,請稍后再試!"); return MyResponse; } else { //將之前發送的驗證碼全部失效 DWebMySQLDataContexter UpdateQueryDataContexter = CreateNewDataContexter(); var EMailVerifyClearUpdateQuery = UpdateQueryDataContexter.ams_email_verify_table.Where(e => e.AEVT_EMAILADDRESS == _Request.EMailAddress); var RegisterSessionClearUpdateQuery = UpdateQueryDataContexter.ams_register_session_table.Where(e => e.ARST_EMAILADDRESS == _Request.EMailAddress); foreach (var e in EMailVerifyClearUpdateQuery) { e.AEVT_STATE = -1;//表示失效 } foreach (var e in RegisterSessionClearUpdateQuery) { e.ARST_STATE = -1;//表示失效 } try { UpdateQueryDataContexter.SaveChanges(); //下面發起一個新的驗證 DWebMySQLDataContexter NewTableDataContexter = CreateNewDataContexter(); //生成驗證碼 Random MyRandom = new Random(); String VerifyCode = MyRandom.Next(1000, 10000).ToString();//獲得一個4位隨機碼 DateTime NowDateTime = DateTime.Now; ams_email_verify_table TempEMailVerifyTable = new ams_email_verify_table(); TempEMailVerifyTable.AEVT_ID = BLHelper.NewGuid(); TempEMailVerifyTable.AEVT_CHANNEL = 1;//表示注冊驗證 TempEMailVerifyTable.AEVT_CHANNELDESCRIPTION = "注冊驗證"; TempEMailVerifyTable.AEVT_CREATETIME = NowDateTime; TempEMailVerifyTable.AEVT_EXPIRETIME = NowDateTime.AddSeconds(300);//有效期300秒,5分鍾 TempEMailVerifyTable.AEVT_EMAILADDRESS = _Request.EMailAddress; TempEMailVerifyTable.AEVT_PARAMETER1 = "";//參數暫時為空 TempEMailVerifyTable.AEVT_PARAMETER2 = "";//參數暫時為空 TempEMailVerifyTable.AEVT_REQUESTIPNUMBERADDRESS = _HttpRequest.GetClientIPAddress().StringIPToNumberIP();//獲得IP地址 TempEMailVerifyTable.AEVT_STATE = 1;//剛剛創建 TempEMailVerifyTable.AEVT_VERIFYCODE = VerifyCode; TempEMailVerifyTable.AEVT_VERIFYTYPE = 1;//默認類型為1 //插入數據庫 NewTableDataContexter.ams_email_verify_table.Add(TempEMailVerifyTable); try { //保存 NewTableDataContexter.SaveChanges(); //下面就開啟一個多線程發送郵件,然后返回獲取成功,這里這樣寫不妥,但是為了用戶體驗,立即返回發送成功,就暫且相信阿里雲的到達率吧 //下面在線程中發送郵件 Task TempTask; TempTask = Task.Factory.StartNew(() => { try { //下面繼續用阿里雲郵件推送發送郵件 //先讀取郵件驗證模板 String TaskVerifyCode = VerifyCode; DWebMySQLDataContexter EMailTemplateDataContexter = CreateNewDataContexter(); String EMailTemplateUniqueIdentity = "NewRegisterVerify"; var EMailTemplateQuery = EMailTemplateDataContexter.ams_email_template_table.Where(e => e.AETT_UNIQUEIDENTITY == EMailTemplateUniqueIdentity).ToList(); if (EMailTemplateQuery.Count() > 0) { AliyunEMailDirectPushRequest MyRequest = new AliyunEMailDirectPushRequest(); //目標地址 MyRequest.AimAddressList = new Dictionary<String, String>(); MyRequest.AimAddressList.Add(_Request.EMailAddress, "AlphaMS門戶注冊郵箱【" + _Request.EMailAddress + "】"); //來源地址 MyRequest.FromAddress = new KeyValuePair<String, String>("service@mail.alphams.cn", "AlphaMS門戶郵件服務"); //回復地址 MyRequest.ReplyAddressList = new Dictionary<String, String>(); MyRequest.ReplyAddressList.Add("kefu@alphams.cn", "AlphaMS門戶客服"); String EMailHTML = EMailTemplateQuery.FirstOrDefault().AETT_CONTENT; EMailHTML = EMailHTML.Replace("##EMailAddress##", _Request.EMailAddress); EMailHTML = EMailHTML.Replace("##VerifyCode##", TaskVerifyCode); MyRequest.HTML = EMailHTML; MyRequest.Subject = "AlphaMS門戶用戶注冊郵件驗證"; MyRequest.Type = 2;//HTML方式發送郵件 MyRequest.SMTPUserName = "service@mail.alphams.cn"; MyRequest.SMTPPassword = "XXXXXX"; //下面發送 AliyunEMailDirectPushResponse TempAliyunEMailDirectPushResponse = AliyunControl.EMailDirectPush(MyRequest); } else { //模板不存在,也不報錯 } } catch (Exception) { //在線程中不報錯 } }); MyResponse.SetResult(1, "發送成功"); return MyResponse; } catch (Exception NewTableSaveException) { return (DWebAccountCreateRegisterEMailVerifyResponse)SetExceptionError(MyResponse, NewTableSaveException, -5, "數據庫錯誤"); } } catch (Exception UpdateStateSaveException) { return (DWebAccountCreateRegisterEMailVerifyResponse)SetExceptionError(MyResponse, UpdateStateSaveException, -5, "數據庫錯誤"); } } } }
7、驗證碼驗證邏輯的實現
主要代碼如下:
/// <summary> /// 檢查注冊郵件驗證碼 /// </summary> /// <param name=""></param> /// <returns></returns> private DWebAccountCheckRegisterEMailVerifyCodeResponse CheckRegisterEMailVerifyCode(DWebAccountCheckRegisterEMailVerifyCodeRequest _Request, HttpRequestMessage _HttpRequest) { DWebAccountCheckRegisterEMailVerifyCodeResponse MyResponse = new DWebAccountCheckRegisterEMailVerifyCodeResponse(); //先檢查是否有驗證記錄 DWebMySQLDataContexter CheckQueryDataContexter = CreateNewDataContexter(); DateTime NowDateTime = DateTime.Now; var CheckQuery = CheckQueryDataContexter.ams_email_verify_table.Where(e => e.AEVT_EMAILADDRESS == _Request.EMailAddress && e.AEVT_STATE == 1 && e.AEVT_EXPIRETIME >= NowDateTime); if (CheckQuery.Count() > 0) { String VerifyCode = CheckQuery.FirstOrDefault().AEVT_VERIFYCODE; if (VerifyCode == _Request.VerifyCode) { //驗證成功,設置這個驗證失效 CheckQuery.FirstOrDefault().AEVT_STATE = -1;//設置失效 //所有的注冊會話先失效 DWebMySQLDataContexter UpdateClearDataContexter = CreateNewDataContexter(); var ClearQuery = UpdateClearDataContexter.ams_register_session_table.Where(e => e.ARST_EMAILADDRESS == _Request.EMailAddress); foreach (var e in ClearQuery) { e.ARST_STATE = -1;//全部失效 } //下面就要新建一個注冊會話 DWebMySQLDataContexter NewTableDataContexter = CreateNewDataContexter(); ams_register_session_table TempRegisterSessionTable = new ams_register_session_table(); TempRegisterSessionTable.ARST_ID = BLHelper.NewGuid(); CheckQuery.FirstOrDefault().AEVT_PARAMETER1 = TempRegisterSessionTable.ARST_ID;//和郵件驗證建立起關聯 TempRegisterSessionTable.ARST_CREATETIME = NowDateTime; TempRegisterSessionTable.ARST_CLIENTIPNUMBERADDRESS = _HttpRequest.GetClientIPAddress().StringIPToNumberIP(); TempRegisterSessionTable.ARST_EMAILADDRESS = _Request.EMailAddress; TempRegisterSessionTable.ARST_EXPIRETIME = NowDateTime.AddMinutes(10);//這個會話的有效期是10分鍾 TempRegisterSessionTable.ARST_STATE = 1;//剛剛創建 NewTableDataContexter.ams_register_session_table.Add(TempRegisterSessionTable); try { CheckQueryDataContexter.SaveChanges(); NewTableDataContexter.SaveChanges(); UpdateClearDataContexter.SaveChanges(); MyResponse.RegisterSessionID = TempRegisterSessionTable.ARST_ID; MyResponse.SetResult(1, "驗證成功"); return MyResponse; } catch (Exception DataSaveException) { return (DWebAccountCheckRegisterEMailVerifyCodeResponse)SetExceptionError(MyResponse, DataSaveException, -5, "數據庫錯誤"); } } else { MyResponse.SetResult(-2, "驗證碼錯誤"); return MyResponse; } } else { MyResponse.SetResult(-1, "已經過期,請重新獲取驗證碼!"); return MyResponse; } }
8、前端注冊頁面的實現
//頁面控制器 var PageControl = { //注冊初始化 RegisterInit: function () { PageControl.NewRegisterSessionID = "";//重新清空會話編號 PageControl.EMailVerifyInit(); }, //郵件驗證初始化 EMailVerifyInit: function () { clearInterval(PageControl.GetVerifyCodeTimeLeft); $("#AR_Register_EMailVerify_Container").show(); $("#AR_Register_EMailVerify_EMailAddress_TextBox").val(""); $("#AR_Register_EMailVerify_EMailAddress_TextBox").removeAttr("readonly"); $("#AR_Register_EMailVerify_GetVerifyCode_Button").removeAttr("disabled"); $("#AR_Register_EMailVerify_GetVerifyCode_Button").val("獲取驗證碼"); $("#AR_Register_EMailVerify_Verify_Container").hide(); $("#AR_Register_EMailVerify_Verify_Code_TextBox").val(""); $("#AR_Register_UserInfo_Container").hide(); }, //獲取驗證碼時間結束 GetVerifyCodeTimeLeft: null, //創建郵件驗證 CreateEMailVerify: function () { //先隱藏起來 $("#AR_Register_EMailVerify_Verify_Container").hide(); //檢查郵件地址輸入 if ($("#AR_Register_EMailVerify_EMailAddress_TextBox").val() == "") { AlphaMS.JSToolkit.Dialog.MessageBox("請輸入郵件地址", function () { $("#AR_Register_EMailVerify_EMailAddress_TextBox").focus(); }); return; } //檢查郵件地址輸入 if (!AlphaMS.JSToolkit.Valid.CheckMail($("#AR_Register_EMailVerify_EMailAddress_TextBox").val())) { AlphaMS.JSToolkit.Dialog.MessageBox("請輸入正確的郵件地址", function () { $("#AR_Register_EMailVerify_EMailAddress_TextBox").focus(); }); return; } //AlphaMS業務邏輯請求 AlphaMS.JSToolkit.NET.BLRequest({ Debug: false, //業務邏輯方法路由名稱 FunctionRouteName: "AlphaMS.Portal.DWeb.Account.CreateRegisterEMailVerify", //業務邏輯請求數據 BLRequestObject: { //請求參數 //郵件地址 EMailAddress: $("#AR_Register_EMailVerify_EMailAddress_TextBox").val() }, //SBS請求返回 BLResponse: { //請求成功 Success: function (MyResponseObject) { switch (MyResponseObject.ResultCode) { case 1: //注冊成功 AlphaMS.JSToolkit.Dialog.MessageBox("驗證碼獲取成功,有效期5分鍾,請到郵箱中查收驗證碼並填入下面框中", function () { $("#AR_Register_EMailVerify_Verify_Code_TextBox").focus(); }); $("#AR_Register_EMailVerify_EMailAddress_TextBox").attr("readonly", "readonly"); $("#AR_Register_EMailVerify_GetVerifyCode_Button").attr("disabled", "disabled"); $("#AR_Register_EMailVerify_GetVerifyCode_Button").html("重新獲取(剩余60秒)"); var T = 60;//倒計時60秒 PageControl.GetVerifyCodeTimeLeft = setInterval(function () { T = T - 1; if (T == 0) { //結束倒計時 clearInterval(PageControl.GetVerifyCodeTimeLeft); $("#AR_Register_EMailVerify_EMailAddress_TextBox").removeAttr("readonly"); $("#AR_Register_EMailVerify_GetVerifyCode_Button").removeAttr("disabled"); $("#AR_Register_EMailVerify_GetVerifyCode_Button").html("獲取驗證碼"); } else { $("#AR_Register_EMailVerify_GetVerifyCode_Button").html("重新獲取(剩余" + T + "秒)"); } }, 1000); $("#AR_Register_EMailVerify_Verify_Container").show(); break; case -1: AlphaMS.JSToolkit.Dialog.MessageBox("郵件已經被其他用戶使用,請換一個", function () { $("#AR_Register_EMailVerify_EMailAddress_TextBox").focus(); }); break; default: AlphaMS.JSToolkit.Dialog.MessageBox(MyResponseObject.ResultMessage); break; } } } }, ["Body"]); }, //新注冊會話編號 NewRegisterSessionID: "", //檢查郵件驗證碼 CheckEMailVerifyCode: function () { //檢查驗證碼輸入 if ($("#AR_Register_EMailVerify_Verify_Code_TextBox").val() == "") { AlphaMS.JSToolkit.Dialog.MessageBox("請輸入收到的驗證碼", function () { $("#AR_Register_EMailVerify_Verify_Code_TextBox").focus(); }); return; } //AlphaMS業務邏輯請求 AlphaMS.JSToolkit.NET.BLRequest({ Debug: false, //業務邏輯方法路由名稱 FunctionRouteName: "AlphaMS.Portal.DWeb.Account.CheckRegisterEMailVerifyCode", //業務邏輯請求數據 BLRequestObject: { //請求參數 //郵件地址 EMailAddress: $("#AR_Register_EMailVerify_EMailAddress_TextBox").val(), //驗證碼 VerifyCode: $("#AR_Register_EMailVerify_Verify_Code_TextBox").val() }, //SBS請求返回 BLResponse: { //請求成功 Success: function (MyResponseObject) { switch (MyResponseObject.ResultCode) { case 1: PageControl.NewRegisterSessionID = MyResponseObject.RegisterSessionID; $("#AR_Register_EMailVerify_Container").hide(); $("#AR_Register_UserInfo_Container").show(); $("#AR_Register_EMail_TextBox").val($("#AR_Register_EMailVerify_EMailAddress_TextBox").val()); break; case -1: AlphaMS.JSToolkit.Dialog.MessageBox("驗證碼過期,請重新獲取!", function () { //初始化郵件驗證 PageControl.EMailVerifyInit(); }); break; case -2: AlphaMS.JSToolkit.Dialog.MessageBox("驗證碼錯誤,請重新輸入", function () { $("#AR_Register_EMailVerify_Verify_Code_TextBox").focus(); }); break; default: AlphaMS.JSToolkit.Dialog.MessageBox(MyResponseObject.ResultMessage); break; } } } }, ["Body"]); }, //提交注冊 SubmitRegister: function () { //檢查用戶名輸入 if ($("#AR_Register_UserName_TextBox").val() == "") { AlphaMS.JSToolkit.Dialog.MessageBox("請輸入用戶名", function () { $("#AR_Register_UserName_TextBox").focus(); }); return; } //檢查密碼輸入 if ($("#AR_Register_Password_TextBox").val() == "") { AlphaMS.JSToolkit.Dialog.MessageBox("請輸入密碼", function () { $("#AR_Register_Password_TextBox").focus(); }); return; } var PreRegisterString = "您的注冊信息如下:</br>"; PreRegisterString = PreRegisterString + "郵件地址:" + $("#AR_Register_EMailVerify_EMailAddress_TextBox").val() + "</br>"; PreRegisterString = PreRegisterString + "用戶名:" + $("#AR_Register_UserName_TextBox").val() + "</br>"; PreRegisterString = PreRegisterString + "密碼:" + $("#AR_Register_Password_TextBox").val() + "</br>"; PreRegisterString = PreRegisterString + "確認注冊嗎?"; AlphaMS.JSToolkit.Dialog.MessageBox(PreRegisterString, function () { //AlphaMS業務邏輯請求 AlphaMS.JSToolkit.NET.BLRequest({ Debug: false, //業務邏輯方法路由名稱 FunctionRouteName: "AlphaMS.Portal.DWeb.Account.NewRegister", //業務邏輯請求數據 BLRequestObject: { //請求參數 //用戶名 UserName: $("#AR_Register_UserName_TextBox").val(), //密碼 Password: $("#AR_Register_Password_TextBox").val(), //注冊會話編號 RegisterSessionID: PageControl.NewRegisterSessionID }, //SBS請求返回 BLResponse: { //請求成功 Success: function (MyResponseObject) { switch (MyResponseObject.ResultCode) { case 1: //注冊成功 AlphaMS.JSToolkit.Dialog.MessageBox("注冊成功,請前往登錄", function () { AlphaMS.JSToolkit.Action.GoToPage("/Login"); }); break; case -1: AlphaMS.JSToolkit.Dialog.MessageBox("注冊已經過期,請重新驗證郵件地址!", function () { PageControl.RegisterInit(); }); break; case -2: AlphaMS.JSToolkit.Dialog.MessageBox("郵件地址已經存在!", function () { PageControl.RegisterInit(); }); break; case -3: AlphaMS.JSToolkit.Dialog.MessageBox("用戶名已經存在,請重新輸入!", function () { $("#AR_Register_UserName_TextBox").focus(); }); break; default: AlphaMS.JSToolkit.Dialog.MessageBox(MyResponseObject.ResultMessage); break; } } } }, ["Body"]); }, function () { }); } }
下面來看一下最終郵件驗證的效果
輸入郵件地址
獲取驗證碼
收到郵件
驗證成功,繼續填寫用戶信息
注冊成功
四、總結與思考
就此,我們就使用阿里雲郵件推送,完成了完整的郵件驗證與推送體系的架設(主動推送、數據統計等沒有寫出來,但是在代碼里面有,有需要代碼的可以郵件向我索要),一句話總結就是如下:
我想,互聯網再怎么發展,QQ號可以沒有,微信也可能衰落,但郵件沒有的可能性很低,作為一種工作方式和服務方式,在可預見的未來內,郵件體系一定會伴隨着信息系統的發展而發展,而從技術的角度出發,對郵件技術和服務的深入研究與思考,一定能夠帶來更加優秀的軟件系統和應用。因此,建議每一個互聯網創業者和應用,都能夠重視對郵件數據的收集和處理,也在郵件服務上多花點精力和金錢,帶給用戶更好的體驗。
轉載請注明出處,歡迎郵件交流:zhangrou@printhelloworld.com,或者加QQ群:11444444