【初碼乾貨】使用阿里雲郵件推送服務架設本身郵件驗證與推送體系

提示:閱讀本文需提早了解的相關知識html

一、電子郵件協議(http://baike.baidu.com/view/2367542.htm前端

二、阿里雲郵件推送(https://www.aliyun.com/product/directmail數據庫

三、EDM(電子郵件營銷)(http://baike.baidu.com/subview/1212416/8602812.htm後端

四、SendCloud郵件服務(http://sendcloud.sohu.com/安全

閱讀目錄結構微信

引:session

1、需求分析多線程

2、功能設計架構

3、詳細實現步驟dom

4、總結與思考

 


引:

咱們會發現,愈來愈多的互聯網應用和企業級應用,開始使用郵件驗證碼驗證替代郵件連接驗證,例以下圖:

image

又例如:

image

固然,也有更多的應用使用了漂亮的HTML代碼來裝飾郵件,例如:

image

又例如:

image

我想,一個優秀的互聯網應用或者個體經營的站長站點,若是在註冊、身份證驗證、信息推送等功能上,加上如上效果的郵件服務,必定能帶來更加優質的用戶體驗

而郵件服務也不是如今纔有,咱們能夠回顧一下發展歷史

不少站長應該都記得,在例如Discuz、WordPress等CMS中,均可以配置SMTP信息,開通了163等郵箱的SMTP功能就能夠填入帳號密碼,從而達到發送郵件的功能。

不少企業在若干年前,也熱衷於使用大型如ExchangeServer,中小型如UMail等軟件搭建本身的企業郵件服務系統。

可是隨着互聯網的發展,伴隨着QQ等郵件服務商的走紅,傳統的國外那一套郵件規則和秩序已經發生了改變,有時候就算你有不少IP,作了反向解析,在Spamhaus白名單,又或者虛擬了不一樣的helo域,QQ郵箱仍是照攔不誤,最終仍是得單獨花錢向國內外各大ESP購買獨立通道

在這種狀況下,自建郵局系統或者郵件SMTP服務,就顯得得不償失了,因此一方面各大企業郵箱服務越作越好,獲得企業的承認,另外一方面,國內外如SendGrid,SendCloud等第三方郵件PUSH服務商也逐漸作大,他們用更專業的手段,去解決通道、白名單、信譽度等各類郵件服務問題,而客戶只須要經過SMTP協議或者封裝的API接口,就能夠很是便捷的給用戶發送郵件

就我所知,目前國內作的最好的當屬搜狐的SendCloud,可是SendCloud發展了這麼多年,也愈來愈複雜和專業,我認爲更適合有大型EDM需求的應用使用,做爲中小企業和創業者以及站長,首推依然是阿里雲的郵件推送服務,一如既往秉持阿里雲的特色:使用傻瓜,上手快速,文檔俱全,但漏洞和問題多多不過做爲AWS的追趕者,能在短期內快速實現這些應用級功能,也算是值得鼓勵的。所以下面也基於阿里雲郵件推送服務,來實現一個本身的郵件驗證與推送體系

1、需求分析

作任何事情,頂層設計很是重要,優秀的設計每每讓之後的事情事半功倍,因此在設計整個郵件驗證與推送體系前,咱們先看看有哪些功能是但願可以實現的

  • 支持郵件發送驗證碼郵件營銷推送
  • 可以經過開發在程序邏輯或者管理界面中自動觸發發送
  • 可以支持HTML的郵件內容,而HTML內容可以隨時隨地進行修改,方便美工和開發去調整
  • 驗證類郵件可以支持IP統計、次數統計,可以進行時間限制、防止惡意發送
  • 推送類郵件可以支持統計發送數量、發送成功率等反饋數據。
  • 推送類郵件,用戶能夠退訂。

固然,最重要的,驗證郵件要能在5-10秒內發送成功,到達率高

2、功能設計

通過以上需求分析,能夠明確出如下一些關鍵的設計思路

一、須要設計模板功能。經過模板功能來支持HTML郵件內容以及隨時可更新替換的要求,經過模板裏的關鍵詞參數設計,來達到驗證碼、用戶名、營銷內容的動態輸入。

二、須要設計一個驗證碼相關表。用來支撐郵件驗證碼校驗、請求限制等功能。

三、須要設計一個發送記錄相關表。記錄全部發送記錄,用於統計和分析。

四、管理後臺儘可能界面化管理。用戶管理、郵件模板配置、發送記錄查詢等基本支撐功能,在後臺儘可能以界面化實現管理。

五、將企業郵局和郵件推送服務分開。以域名XXX.com爲例,通常企業郵局地爲zhangsan@XXX.com,郵件服務不宜以XXX.com爲域,會和企業郵局服務相互干擾(也不是徹底不可能,只是配置起來很麻煩),應當增長一個二級域名,例如mail.XXX.com,郵件服務地址就是service@mail.XXX.com

總體功能架構圖以下:

郵件

3、詳細實現步驟

正好手上有個網站,含有註冊郵件驗證功能,那就基於這個網站的開發,一步一步的講解一下詳細的實現步驟

最終實現效果以下:

網站域名是:alphams.cn,地址爲 https://www.alphams.cn,用戶註冊地址爲https://www.alphams.cn/Register

官方企業郵箱域是@alphams.cn,客服郵件地址爲:kefu@alphams.cn

在阿里雲申請的郵件服務域爲:@mail.alphams.cn,服務郵件地址爲:service@mail.alphams.cn

具體的實現步驟爲:

一、註冊阿里雲企業郵箱免費版,實現客服郵件地址

咱們的企業郵局服務使用了阿里雲企業郵箱免費版。(吐槽一下,居然要轉發微博才能註冊還捆綁消費6元郵件推送)

image

image

支付成功後,能夠在企業郵箱列表中看到

image

下面繼續設置解析,能夠到幫助頁面看到如何設置解析

image

前往域名解析處進行解析設置

image

解析後,企業郵箱生效,進行管理員用戶密碼初始化

image

使用管理員帳號進入 https://qiye.aliyun.com/ 

繼續設置安全問題並綁定手機號

image

成功進入後繼續添加客戶帳號

image

至此,企業郵局帳號添加成功,到Foxmail中進行登陸。

二、配置阿里雲郵件服務

首先要添加一個發信域名

image

image

這裏咱們也能夠注意到,阿里雲也提示不要添加企業郵箱域名,這和咱們以前設計中的思路一致,這裏咱們添加的域名是 mail.alphams.cn

而後阿里雲提示須要配置一些解析信息,從而生效域名

image

下面前往阿里雲的域名解析中進行設置

image

設置好了之後回到剛纔的頁面進行驗證

image

這樣,域名就添加成功了

image

下面繼續添加發信地址

image

image

這裏咱們能夠看到,發信帳號如咱們以前所說,是service@mail.alphams.cn

發信類型選擇了批量郵件這裏有個疑問,在實測中發現,阿里雲這個推送服務有觸發郵件和批量郵件,觸發郵件類型偶爾會發不出去或者接收不到,不知道緣由是什麼,有深刻研究的人感謝告知我一下

image

這時候回信地址還未經過驗證,咱們點擊驗證回信地址,而後前往以前申請的QQ企業郵箱中,來驗證

image

這樣就進行了驗證

image

這時候還須要設置一下SMTP密碼,咱們設置爲XXX

image

image

這裏特別須要注意的是阿里雲的官方說明

image

發信域名在建立以前要仔細,由於不能給刪除和修改。

這樣,阿里雲郵件服務的配置就完成了。

SMTP服務地址爲:smtpdm.aliyun.com,SMTP帳號就是service@mail.alphams.cn,密碼就是剛纔設置的密碼

到這一步爲止,已經能夠爲不少站長網站的郵件服務提供支撐了,在一些CMS裏面直接配置入SMTP信息便可使用

可是,網站和應用大部分都是獨立開發,咱們更須要設計本身的郵件發送和功能處理體系,所以下面咱們繼續

三、用戶註冊頁面的準備工做

具體的頁面編碼和程序邏輯由於非今天所講重點,因此這裏省略若干字以及若干代碼,把主要的步驟列出來,源碼可郵件找我要:

因爲要加入郵件地址的驗證,因此先對註冊頁面的完整流程進行設計,邏輯圖以下:

用戶註冊

其中,爲了加強用戶體驗,先驗證郵件地址,再輸入用戶名,而這種裏面的關聯和強邏輯用一個註冊會話表來進行控制

註冊會話表結構以下:

image

臨時驗證成功的郵件地址,存入會話表,並向客戶端反回一個會話編號,最終完成註冊時,須要用戶名密碼連同這個會話編號一塊兒傳入後臺驗證註冊

接下來就是郵件驗證表的設計

這個表既要能支持沒有用戶狀態的驗證,例如註冊驗證,又要能支持用戶運行時的驗證,例如修改密碼驗證等。

表結構以下:

image

其中渠道爲具體的使用場景,狀態和過時時間兩個字段用來雙重控制有效性,預留的兩個參數,用於存儲用戶編號、註冊會話編號等額外的數據

固然,也少不了用戶表,由於這裏並無什麼特殊的用戶場景,因此用戶表較爲簡單,結構以下:

image

四、郵件模板的設計

接下來就進入具體的開發,在開發中,確定會用到對郵件的發送,在咱們這個設計的體系裏面,最上面也說了,須要設計模板機制,那麼咱們就先設計郵件模板功能

具體的功能架構爲:

郵件模板

這裏設計了最簡單的模板功能,主要思路即數據庫存儲HTML模板內容,參數直接放入HTML代碼中,在開發時進行替換

下面是郵件模板表的設計,表結構以下:

image

在後端對模板進行增刪改查管理,省略代碼若干,最終效果以下:

先構建一個用於新用戶註冊的HTML模板

image

而後在管理界面添加信息和HTML代碼

image

而後添加成功

image

五、郵件發送的技術準備

經過阿里雲的技術文檔能夠知道,阿里雲郵件服務的調用方式有三種

image

本來準備使用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;
    }
}

六、郵件驗證碼生成與發送的實現

主要代碼以下:

/// <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, "數據庫錯誤");
            }
        }
    }
}

七、驗證碼驗證邏輯的實現

主要代碼以下:

/// <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;
    }
}

八、前端註冊頁面的實現

//頁面控制器
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 () { });

    }
}

下面來看一下最終郵件驗證的效果

輸入郵件地址

 

image

獲取驗證碼

image

收到郵件

image

驗證成功,繼續填寫用戶信息

image

image

註冊成功

image

4、總結與思考

就此,咱們就使用阿里雲郵件推送,完成了完整的郵件驗證與推送體系的架設(主動推送、數據統計等沒有寫出來,可是在代碼裏面有,有須要代碼的能夠郵件向我索要),一句話總結就是以下:

我想,互聯網再怎麼發展,QQ號能夠沒有,微信也可能衰落,但郵件沒有的可能性很低,做爲一種工做方式和服務方式,在可預見的將來內,郵件體系必定會伴隨着信息系統的發展而發展,而從技術的角度出發,對郵件技術和服務的深刻研究與思考,必定可以帶來更加優秀的軟件系統和應用。所以,建議每個互聯網創業者和應用,都可以重視對郵件數據的收集和處理,也在郵件服務上多花點精力和金錢,帶給用戶更好的體驗。


做者:張柔,發佈於  博客園  與  初碼博客

轉載請註明出處,歡迎郵件交流:zhangrou@printhelloworld.com,或者加QQ羣:11444444

相關文章
相關標籤/搜索