日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【初码干货】使用阿里云邮件推送服务架设自己邮件验证与推送体系

發(fā)布時(shí)間:2023/12/19 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 【初码干货】使用阿里云邮件推送服务架设自己邮件验证与推送体系 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

提示:閱讀本文需提前了解的相關(guān)知識

1、電子郵件協(xié)議(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郵件服務(wù)(http://sendcloud.sohu.com/)

閱讀目錄結(jié)構(gòu)

引:

一、需求分析

二、功能設(shè)計(jì)

三、詳細(xì)實(shí)現(xiàn)步驟

四、總結(jié)與思考


引:

我們會(huì)發(fā)現(xiàn),越來越多的互聯(lián)網(wǎng)應(yīng)用和企業(yè)級應(yīng)用,開始使用郵件驗(yàn)證碼驗(yàn)證替代郵件鏈接驗(yàn)證,例如下圖:

又例如:

當(dāng)然,也有更多的應(yīng)用使用了漂亮的HTML代碼來裝飾郵件,例如:

又例如:

我想,一個(gè)優(yōu)秀的互聯(lián)網(wǎng)應(yīng)用或者個(gè)體經(jīng)營的站長站點(diǎn),如果在注冊、身份證驗(yàn)證、信息推送等功能上,加上如上效果的郵件服務(wù),一定能帶來更加優(yōu)質(zhì)的用戶體驗(yàn)

而郵件服務(wù)也不是現(xiàn)在才有,我們可以回顧一下發(fā)展歷史

很多站長應(yīng)該都記得,在例如Discuz、WordPress等CMS中,都可以配置SMTP信息,開通了163等郵箱的SMTP功能就可以填入賬號密碼,從而達(dá)到發(fā)送郵件的功能。

很多企業(yè)在若干年前,也熱衷于使用大型如ExchangeServer,中小型如UMail等軟件搭建自己的企業(yè)郵件服務(wù)系統(tǒng)。

但是隨著互聯(lián)網(wǎng)的發(fā)展,伴隨著QQ等郵件服務(wù)商的走紅,傳統(tǒng)的國外那一套郵件規(guī)則和秩序已經(jīng)發(fā)生了改變,有時(shí)候就算你有很多IP,做了反向解析,在Spamhaus白名單,又或者虛擬了不同的helo域,QQ郵箱還是照攔不誤,最終還是得單獨(dú)花錢向國內(nèi)外各大ESP購買獨(dú)立通道

在這種情況下,自建郵局系統(tǒng)或者郵件SMTP服務(wù),就顯得得不償失了,所以一方面各大企業(yè)郵箱服務(wù)越做越好,得到企業(yè)的認(rèn)可,另一方面,國內(nèi)外如SendGrid,SendCloud等第三方郵件PUSH服務(wù)商也逐漸做大,他們用更專業(yè)的手段,去解決通道、白名單、信譽(yù)度等各種郵件服務(wù)問題,而客戶只需要通過SMTP協(xié)議或者封裝的API接口,就可以非常便捷的給用戶發(fā)送郵件

就我所知,目前國內(nèi)做的最好的當(dāng)屬搜狐的SendCloud,但是SendCloud發(fā)展了這么多年,也越來越復(fù)雜和專業(yè),我認(rèn)為更適合有大型EDM需求的應(yīng)用使用,作為中小企業(yè)和創(chuàng)業(yè)者以及站長,首推依然是阿里云的郵件推送服務(wù),一如既往秉持阿里云的特點(diǎn):使用傻瓜,上手快速,文檔俱全,但漏洞和問題多多不過作為AWS的追趕者,能在短時(shí)間內(nèi)快速實(shí)現(xiàn)這些應(yīng)用級功能,也算是值得鼓勵(lì)的。因此下面也基于阿里云郵件推送服務(wù),來實(shí)現(xiàn)一個(gè)自己的郵件驗(yàn)證與推送體系

一、需求分析

做任何事情,頂層設(shè)計(jì)非常重要,優(yōu)秀的設(shè)計(jì)往往讓以后的事情事半功倍,所以在設(shè)計(jì)整個(gè)郵件驗(yàn)證與推送體系前,我們先看看有哪些功能是希望能夠?qū)崿F(xiàn)的

支持郵件發(fā)送驗(yàn)證碼郵件營銷推送
能夠通過開發(fā)在程序邏輯或者管理界面中自動(dòng)觸發(fā)發(fā)送
能夠支持HTML的郵件內(nèi)容,而HTML內(nèi)容能夠隨時(shí)隨地進(jìn)行修改,方便美工和開發(fā)去調(diào)整
驗(yàn)證類郵件能夠支持IP統(tǒng)計(jì)、次數(shù)統(tǒng)計(jì),能夠進(jìn)行時(shí)間限制、防止惡意發(fā)送
推送類郵件能夠支持統(tǒng)計(jì)發(fā)送數(shù)量、發(fā)送成功率等反饋數(shù)據(jù)。
推送類郵件,用戶可以退訂。

當(dāng)然,最重要的,驗(yàn)證郵件要能在5-10秒內(nèi)發(fā)送成功,到達(dá)率高

二、功能設(shè)計(jì)

經(jīng)過以上需求分析,可以明確出以下一些關(guān)鍵的設(shè)計(jì)思路

1、需要設(shè)計(jì)模板功能。通過模板功能來支持HTML郵件內(nèi)容以及隨時(shí)可更新替換的要求,通過模板里的關(guān)鍵詞參數(shù)設(shè)計(jì),來達(dá)到驗(yàn)證碼、用戶名、營銷內(nèi)容的動(dòng)態(tài)輸入。

2、需要設(shè)計(jì)一個(gè)驗(yàn)證碼相關(guān)表。用來支撐郵件驗(yàn)證碼校驗(yàn)、請求限制等功能。

3、需要設(shè)計(jì)一個(gè)發(fā)送記錄相關(guān)表。記錄所有發(fā)送記錄,用于統(tǒng)計(jì)和分析。

4、管理后臺(tái)盡量界面化管理。用戶管理、郵件模板配置、發(fā)送記錄查詢等基本支撐功能,在后臺(tái)盡量以界面化實(shí)現(xiàn)管理。

5、將企業(yè)郵局和郵件推送服務(wù)分開。以域名XXX.com為例,一般企業(yè)郵局地為zhangsan@XXX.com,郵件服務(wù)不宜以XXX.com為域,會(huì)和企業(yè)郵局服務(wù)相互干擾(也不是完全不可能,只是配置起來很麻煩),應(yīng)當(dāng)增加一個(gè)二級域名,例如mail.XXX.com,郵件服務(wù)地址就是service@mail.XXX.com。

整體功能架構(gòu)圖如下:

三、詳細(xì)實(shí)現(xiàn)步驟

正好手上有個(gè)網(wǎng)站,含有注冊郵件驗(yàn)證功能,那就基于這個(gè)網(wǎng)站的開發(fā),一步一步的講解一下詳細(xì)的實(shí)現(xiàn)步驟

最終實(shí)現(xiàn)效果如下:

網(wǎng)站域名是:alphams.cn,地址為 https://www.alphams.cn,用戶注冊地址為https://www.alphams.cn/Register

官方企業(yè)郵箱域是@alphams.cn,客服郵件地址為:kefu@alphams.cn

在阿里云申請的郵件服務(wù)域?yàn)椋篅mail.alphams.cn,服務(wù)郵件地址為:service@mail.alphams.cn

具體的實(shí)現(xiàn)步驟為:

1、注冊阿里云企業(yè)郵箱免費(fèi)版,實(shí)現(xiàn)客服郵件地址

我們的企業(yè)郵局服務(wù)使用了阿里云企業(yè)郵箱免費(fèi)版。(吐槽一下,竟然要轉(zhuǎn)發(fā)微博才能注冊還捆綁消費(fèi)6元郵件推送)

支付成功后,可以在企業(yè)郵箱列表中看到

下面繼續(xù)設(shè)置解析,可以到幫助頁面看到如何設(shè)置解析

前往域名解析處進(jìn)行解析設(shè)置

解析后,企業(yè)郵箱生效,進(jìn)行管理員用戶密碼初始化

使用管理員賬號進(jìn)入 https://qiye.aliyun.com/

繼續(xù)設(shè)置安全問題并綁定手機(jī)號

成功進(jìn)入后繼續(xù)添加客戶賬號

至此,企業(yè)郵局賬號添加成功,到Foxmail中進(jìn)行登錄。

2、配置阿里云郵件服務(wù)

首先要添加一個(gè)發(fā)信域名

這里我們也可以注意到,阿里云也提示不要添加企業(yè)郵箱域名,這和我們之前設(shè)計(jì)中的思路一致,這里我們添加的域名是 mail.alphams.cn

然后阿里云提示需要配置一些解析信息,從而生效域名

下面前往阿里云的域名解析中進(jìn)行設(shè)置

設(shè)置好了以后回到剛才的頁面進(jìn)行驗(yàn)證

這樣,域名就添加成功了

下面繼續(xù)添加發(fā)信地址

這里我們可以看到,發(fā)信賬號如我們之前所說,是service@mail.alphams.cn

發(fā)信類型選擇了批量郵件(這里有個(gè)疑問,在實(shí)測中發(fā)現(xiàn),阿里云這個(gè)推送服務(wù)有觸發(fā)郵件和批量郵件,觸發(fā)郵件類型偶爾會(huì)發(fā)不出去或者接收不到,不知道原因是什么,有深入研究的人感謝告知我一下)

這時(shí)候回信地址還未通過驗(yàn)證,我們點(diǎn)擊驗(yàn)證回信地址,然后前往之前申請的QQ企業(yè)郵箱中,來驗(yàn)證

這樣就進(jìn)行了驗(yàn)證

這時(shí)候還需要設(shè)置一下SMTP密碼,我們設(shè)置為XXX

這里特別需要注意的是阿里云的官方說明

發(fā)信域名在創(chuàng)建之前要仔細(xì),因?yàn)椴荒芙o刪除和修改。

這樣,阿里云郵件服務(wù)的配置就完成了。

SMTP服務(wù)地址為:smtpdm.aliyun.com,SMTP賬號就是service@mail.alphams.cn,密碼就是剛才設(shè)置的密碼

到這一步為止,已經(jīng)可以為很多站長網(wǎng)站的郵件服務(wù)提供支撐了,在一些CMS里面直接配置入SMTP信息即可使用

但是,網(wǎng)站和應(yīng)用大部分都是獨(dú)立開發(fā),我們更需要設(shè)計(jì)自己的郵件發(fā)送和功能處理體系,因此下面我們繼續(xù)

3、用戶注冊頁面的準(zhǔn)備工作

具體的頁面編碼和程序邏輯因?yàn)榉墙裉焖v重點(diǎn),所以這里省略若干字以及若干代碼,把主要的步驟列出來,源碼可郵件找我要:

由于要加入郵件地址的驗(yàn)證,所以先對注冊頁面的完整流程進(jìn)行設(shè)計(jì),邏輯圖如下:

其中,為了增強(qiáng)用戶體驗(yàn),先驗(yàn)證郵件地址,再輸入用戶名,而這種里面的關(guān)聯(lián)和強(qiáng)邏輯用一個(gè)注冊會(huì)話表來進(jìn)行控制

注冊會(huì)話表結(jié)構(gòu)如下:

臨時(shí)驗(yàn)證成功的郵件地址,存入會(huì)話表,并向客戶端反回一個(gè)會(huì)話編號,最終完成注冊時(shí),需要用戶名密碼連同這個(gè)會(huì)話編號一起傳入后臺(tái)驗(yàn)證注冊

接下來就是郵件驗(yàn)證表的設(shè)計(jì)

這個(gè)表既要能支持沒有用戶狀態(tài)的驗(yàn)證,例如注冊驗(yàn)證,又要能支持用戶運(yùn)行時(shí)的驗(yàn)證,例如修改密碼驗(yàn)證等。

表結(jié)構(gòu)如下:

其中渠道為具體的使用場景,狀態(tài)和過期時(shí)間兩個(gè)字段用來雙重控制有效性,預(yù)留的兩個(gè)參數(shù),用于存儲(chǔ)用戶編號、注冊會(huì)話編號等額外的數(shù)據(jù)

當(dāng)然,也少不了用戶表,因?yàn)檫@里并沒有什么特殊的用戶場景,所以用戶表較為簡單,結(jié)構(gòu)如下:

4、郵件模板的設(shè)計(jì)

接下來就進(jìn)入具體的開發(fā),在開發(fā)中,肯定會(huì)用到對郵件的發(fā)送,在我們這個(gè)設(shè)計(jì)的體系里面,最上面也說了,需要設(shè)計(jì)模板機(jī)制,那么我們就先設(shè)計(jì)郵件模板功能

具體的功能架構(gòu)為:

這里設(shè)計(jì)了最簡單的模板功能,主要思路即數(shù)據(jù)庫存儲(chǔ)HTML模板內(nèi)容,參數(shù)直接放入HTML代碼中,在開發(fā)時(shí)進(jìn)行替換

下面是郵件模板表的設(shè)計(jì),表結(jié)構(gòu)如下:

在后端對模板進(jìn)行增刪改查管理,省略代碼若干,最終效果如下:

先構(gòu)建一個(gè)用于新用戶注冊的HTML模板

然后在管理界面添加信息和HTML代碼

然后添加成功

5、郵件發(fā)送的技術(shù)準(zhǔn)備

通過阿里云的技術(shù)文檔可以知道,阿里云郵件服務(wù)的調(diào)用方式有三種

原本準(zhǔn)備使用API接口進(jìn)行封裝,但是最近太忙了,所以先使用STMP接口方式進(jìn)行了一次封裝,主要代碼如下:

實(shí)體:

/// <summary>
/// 郵件直推請求
/// </summary>
public class AliyunEMailDirectPushRequest
{
    /// <summary>
    /// 目標(biāo)郵件地址列表
    /// </summary>
    public Dictionary<String, String> AimAddressList { get; set; }

    /// <summary>
    /// 來源郵件地址
    /// </summary>
    public KeyValuePair<String, String> FromAddress { get; set; }

    /// <summary>
    /// 回復(fù)郵件地址列表
    /// </summary>
    public Dictionary<String, String> ReplyAddressList { get; set; }

    /// <summary>
    /// 郵件標(biāo)題
    /// </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>
/// 郵件直推響應(yīng)
/// </summary>
public class AliyunEMailDirectPushResponse
{
    /// <summary>
    /// 推送結(jié)果
    /// </summary>
    public Int32 Result { get; set; }

    /// <summary>
    /// 推送結(jié)果消息
    /// </summary>
    public String ResultMessage { get; set; }
}

發(fā)送業(yè)務(wù)代碼:

/// <summary>
/// 郵件直接推送
/// </summary>
/// <param name="String"></param>
/// <returns></returns>
public static AliyunEMailDirectPushResponse EMailDirectPush(AliyunEMailDirectPushRequest _Request)
{
    AliyunEMailDirectPushResponse MyReturn = new AliyunEMailDirectPushResponse();
    MailMessage MyMailMessage = new MailMessage();
    //填充目標(biāo)郵件地址
    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);
    //填充回復(fù)郵件地址
    foreach (var e in _Request.ReplyAddressList)
    {
        MyMailMessage.ReplyToList.Add(new MailAddress(e.Key, e.Value));
    }
    // 郵件主題
    MyMailMessage.Subject = _Request.Subject;
    // 郵件正文內(nèi)容

    String Text = _Request.Text;
    String HTML = _Request.HTML;
    if (_Request.Type == 1)
    {
        //文本發(fā)送方式
        MyMailMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(Text, null, MediaTypeNames.Text.Plain));
    }
    if (_Request.Type == 2)
    {
        //HTML發(fā)送方式
        MyMailMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(HTML, null, MediaTypeNames.Text.Html));
    }
    //郵件推送的SMTP地址和端口
    SmtpClient MySmtpClient = new SmtpClient("smtpdm.aliyun.com", 25);
    // 使用SMTP用戶名和密碼進(jìn)行驗(yàn)證
    System.Net.NetworkCredential MyNetworkCredential = new System.Net.NetworkCredential(_Request.SMTPUserName, _Request.SMTPPassword);
    MySmtpClient.Credentials = MyNetworkCredential;
    MySmtpClient.Timeout = 5000;//設(shè)置5秒超時(shí)
    try
    {
        MySmtpClient.Send(MyMailMessage);
        MyReturn.Result = 1;
        MyReturn.ResultMessage = "發(fā)送成功";
        return MyReturn;
    }
    catch (Exception e)
    {
        MyReturn.Result = -1;
        MyReturn.ResultMessage = e.Message;
        return MyReturn;
    }
}

6、郵件驗(yàn)證碼生成與發(fā)送的實(shí)現(xiàn)

主要代碼如下:

/// <summary>
/// 創(chuàng)建注冊郵件驗(yàn)證
/// </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, "郵件已經(jīng)存在");
        return MyResponse;
    }
    else
    {
        //再檢查和最近一次的發(fā)送是否已經(jīng)超過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, "一分鐘內(nèi)只能發(fā)送一次郵件,請稍后再試!");
            return MyResponse;
        }
        else
        {
            //將之前發(fā)送的驗(yàn)證碼全部失效
            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();
                //下面發(fā)起一個(gè)新的驗(yàn)證
                DWebMySQLDataContexter NewTableDataContexter = CreateNewDataContexter();
                //生成驗(yàn)證碼
                Random MyRandom = new Random();
                String VerifyCode = MyRandom.Next(1000, 10000).ToString();//獲得一個(gè)4位隨機(jī)碼

                DateTime NowDateTime = DateTime.Now;
                ams_email_verify_table TempEMailVerifyTable = new ams_email_verify_table();
                TempEMailVerifyTable.AEVT_ID = BLHelper.NewGuid();
                TempEMailVerifyTable.AEVT_CHANNEL = 1;//表示注冊驗(yàn)證
                TempEMailVerifyTable.AEVT_CHANNELDESCRIPTION = "注冊驗(yàn)證";
                TempEMailVerifyTable.AEVT_CREATETIME = NowDateTime;
                TempEMailVerifyTable.AEVT_EXPIRETIME = NowDateTime.AddSeconds(300);//有效期300秒,5分鐘
                TempEMailVerifyTable.AEVT_EMAILADDRESS = _Request.EMailAddress;
                TempEMailVerifyTable.AEVT_PARAMETER1 = "";//參數(shù)暫時(shí)為空
                TempEMailVerifyTable.AEVT_PARAMETER2 = "";//參數(shù)暫時(shí)為空
                TempEMailVerifyTable.AEVT_REQUESTIPNUMBERADDRESS = _HttpRequest.GetClientIPAddress().StringIPToNumberIP();//獲得IP地址
                TempEMailVerifyTable.AEVT_STATE = 1;//剛剛創(chuàng)建
                TempEMailVerifyTable.AEVT_VERIFYCODE = VerifyCode;
                TempEMailVerifyTable.AEVT_VERIFYTYPE = 1;//默認(rèn)類型為1
                                                         //插入數(shù)據(jù)庫
                NewTableDataContexter.ams_email_verify_table.Add(TempEMailVerifyTable);
                try
                {
                    //保存
                    NewTableDataContexter.SaveChanges();
                    //下面就開啟一個(gè)多線程發(fā)送郵件,然后返回獲取成功,這里這樣寫不妥,但是為了用戶體驗(yàn),立即返回發(fā)送成功,就暫且相信阿里云的到達(dá)率吧

                    //下面在線程中發(fā)送郵件
                    Task TempTask;
                    TempTask = Task.Factory.StartNew(() =>
                    {

                        try
                        {
                            //下面繼續(xù)用阿里云郵件推送發(fā)送郵件
                            //先讀取郵件驗(yàn)證模板
                            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();
                                //目標(biāo)地址
                                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門戶郵件服務(wù)");
                                //回復(fù)地址
                                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門戶用戶注冊郵件驗(yàn)證";
                                MyRequest.Type = 2;//HTML方式發(fā)送郵件
                                MyRequest.SMTPUserName = "service@mail.alphams.cn";
                                MyRequest.SMTPPassword = "XXXXXX";
                                //下面發(fā)送
                                AliyunEMailDirectPushResponse TempAliyunEMailDirectPushResponse = AliyunControl.EMailDirectPush(MyRequest);
                            }
                            else
                            {
                                //模板不存在,也不報(bào)錯(cuò)
                            }
                        }
                        catch (Exception)
                        {
                            //在線程中不報(bào)錯(cuò)
                        }


                    });

                    MyResponse.SetResult(1, "發(fā)送成功");
                    return MyResponse;
                }
                catch (Exception NewTableSaveException)
                {
                    return (DWebAccountCreateRegisterEMailVerifyResponse)SetExceptionError(MyResponse, NewTableSaveException, -5, "數(shù)據(jù)庫錯(cuò)誤");
                }
            }
            catch (Exception UpdateStateSaveException)
            {
                return (DWebAccountCreateRegisterEMailVerifyResponse)SetExceptionError(MyResponse, UpdateStateSaveException, -5, "數(shù)據(jù)庫錯(cuò)誤");
            }
        }
    }
}

7、驗(yàn)證碼驗(yàn)證邏輯的實(shí)現(xiàn)

主要代碼如下:

/// <summary>
/// 檢查注冊郵件驗(yàn)證碼
/// </summary>
/// <param name=""></param>
/// <returns></returns>
private DWebAccountCheckRegisterEMailVerifyCodeResponse CheckRegisterEMailVerifyCode(DWebAccountCheckRegisterEMailVerifyCodeRequest _Request, HttpRequestMessage _HttpRequest)
{
    DWebAccountCheckRegisterEMailVerifyCodeResponse MyResponse = new DWebAccountCheckRegisterEMailVerifyCodeResponse();
    //先檢查是否有驗(yàn)證記錄
    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)
        {
            //驗(yàn)證成功,設(shè)置這個(gè)驗(yàn)證失效
            CheckQuery.FirstOrDefault().AEVT_STATE = -1;//設(shè)置失效

            //所有的注冊會(huì)話先失效
            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;//全部失效
            }


            //下面就要新建一個(gè)注冊會(huì)話
            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;//和郵件驗(yàn)證建立起關(guān)聯(lián)
            TempRegisterSessionTable.ARST_CREATETIME = NowDateTime;
            TempRegisterSessionTable.ARST_CLIENTIPNUMBERADDRESS = _HttpRequest.GetClientIPAddress().StringIPToNumberIP();
            TempRegisterSessionTable.ARST_EMAILADDRESS = _Request.EMailAddress;
            TempRegisterSessionTable.ARST_EXPIRETIME = NowDateTime.AddMinutes(10);//這個(gè)會(huì)話的有效期是10分鐘
            TempRegisterSessionTable.ARST_STATE = 1;//剛剛創(chuàng)建
            NewTableDataContexter.ams_register_session_table.Add(TempRegisterSessionTable);
            try
            {
                CheckQueryDataContexter.SaveChanges();
                NewTableDataContexter.SaveChanges();
                UpdateClearDataContexter.SaveChanges();
                MyResponse.RegisterSessionID = TempRegisterSessionTable.ARST_ID;
                MyResponse.SetResult(1, "驗(yàn)證成功");
                return MyResponse;
            }
            catch (Exception DataSaveException)
            {
                return (DWebAccountCheckRegisterEMailVerifyCodeResponse)SetExceptionError(MyResponse, DataSaveException, -5, "數(shù)據(jù)庫錯(cuò)誤");
            }
        }
        else
        {
            MyResponse.SetResult(-2, "驗(yàn)證碼錯(cuò)誤");
            return MyResponse;
        }
    }
    else
    {
        MyResponse.SetResult(-1, "已經(jīng)過期,請重新獲取驗(yàn)證碼!");
        return MyResponse;
    }
}

8、前端注冊頁面的實(shí)現(xiàn)

//頁面控制器
var PageControl = {
    //注冊初始化
    RegisterInit: function () {
        PageControl.NewRegisterSessionID = "";//重新清空會(huì)話編號
        PageControl.EMailVerifyInit();
    },
    //郵件驗(yàn)證初始化
    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("獲取驗(yàn)證碼");
        $("#AR_Register_EMailVerify_Verify_Container").hide();
        $("#AR_Register_EMailVerify_Verify_Code_TextBox").val("");
        $("#AR_Register_UserInfo_Container").hide();
    },
    //獲取驗(yàn)證碼時(shí)間結(jié)束
    GetVerifyCodeTimeLeft: null,
    //創(chuàng)建郵件驗(yàn)證
    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業(yè)務(wù)邏輯請求
        AlphaMS.JSToolkit.NET.BLRequest({
            Debug: false,
            //業(yè)務(wù)邏輯方法路由名稱
            FunctionRouteName: "AlphaMS.Portal.DWeb.Account.CreateRegisterEMailVerify",
            //業(yè)務(wù)邏輯請求數(shù)據(jù)
            BLRequestObject: {
                //請求參數(shù)
                //郵件地址
                EMailAddress: $("#AR_Register_EMailVerify_EMailAddress_TextBox").val()
            },
            //SBS請求返回
            BLResponse: {
                //請求成功
                Success: function (MyResponseObject) {
                    switch (MyResponseObject.ResultCode) {
                        case 1:
                            //注冊成功
                            AlphaMS.JSToolkit.Dialog.MessageBox("驗(yàn)證碼獲取成功,有效期5分鐘,請到郵箱中查收驗(yàn)證碼并填入下面框中", 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;//倒計(jì)時(shí)60秒
                            PageControl.GetVerifyCodeTimeLeft = setInterval(function () {
                                T = T - 1;
                                if (T == 0) {
                                    //結(jié)束倒計(jì)時(shí)
                                    clearInterval(PageControl.GetVerifyCodeTimeLeft);
                                    $("#AR_Register_EMailVerify_EMailAddress_TextBox").removeAttr("readonly");
                                    $("#AR_Register_EMailVerify_GetVerifyCode_Button").removeAttr("disabled");
                                    $("#AR_Register_EMailVerify_GetVerifyCode_Button").html("獲取驗(yàn)證碼");
                                } else {
                                    $("#AR_Register_EMailVerify_GetVerifyCode_Button").html("重新獲取(剩余" + T + "秒)");
                                }
                            }, 1000);

                            $("#AR_Register_EMailVerify_Verify_Container").show();


                            break;
                        case -1:
                            AlphaMS.JSToolkit.Dialog.MessageBox("郵件已經(jīng)被其他用戶使用,請換一個(gè)", function () {
                                $("#AR_Register_EMailVerify_EMailAddress_TextBox").focus();
                            });
                            break;
                        default:
                            AlphaMS.JSToolkit.Dialog.MessageBox(MyResponseObject.ResultMessage);
                            break;
                    }
                }
            }
        }, ["Body"]);

    },
    //新注冊會(huì)話編號
    NewRegisterSessionID: "",
    //檢查郵件驗(yàn)證碼
    CheckEMailVerifyCode: function () {

        //檢查驗(yàn)證碼輸入
        if ($("#AR_Register_EMailVerify_Verify_Code_TextBox").val() == "") {
            AlphaMS.JSToolkit.Dialog.MessageBox("請輸入收到的驗(yàn)證碼", function () {
                $("#AR_Register_EMailVerify_Verify_Code_TextBox").focus();
            });
            return;
        }

        //AlphaMS業(yè)務(wù)邏輯請求
        AlphaMS.JSToolkit.NET.BLRequest({
            Debug: false,
            //業(yè)務(wù)邏輯方法路由名稱
            FunctionRouteName: "AlphaMS.Portal.DWeb.Account.CheckRegisterEMailVerifyCode",
            //業(yè)務(wù)邏輯請求數(shù)據(jù)
            BLRequestObject: {
                //請求參數(shù)
                //郵件地址
                EMailAddress: $("#AR_Register_EMailVerify_EMailAddress_TextBox").val(),
                //驗(yàn)證碼
                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("驗(yàn)證碼過期,請重新獲取!", function () {
                                //初始化郵件驗(yàn)證
                                PageControl.EMailVerifyInit();
                            });
                            break;
                        case -2:
                            AlphaMS.JSToolkit.Dialog.MessageBox("驗(yàn)證碼錯(cuò)誤,請重新輸入", 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 + "確認(rèn)注冊嗎?";

        AlphaMS.JSToolkit.Dialog.MessageBox(PreRegisterString, function () {
            //AlphaMS業(yè)務(wù)邏輯請求
            AlphaMS.JSToolkit.NET.BLRequest({
                Debug: false,
                //業(yè)務(wù)邏輯方法路由名稱
                FunctionRouteName: "AlphaMS.Portal.DWeb.Account.NewRegister",
                //業(yè)務(wù)邏輯請求數(shù)據(jù)
                BLRequestObject: {
                    //請求參數(shù)
                    //用戶名
                    UserName: $("#AR_Register_UserName_TextBox").val(),
                    //密碼
                    Password: $("#AR_Register_Password_TextBox").val(),
                    //注冊會(huì)話編號
                    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("注冊已經(jīng)過期,請重新驗(yàn)證郵件地址!", function () {
                                    PageControl.RegisterInit();
                                });
                                break;
                            case -2:
                                AlphaMS.JSToolkit.Dialog.MessageBox("郵件地址已經(jīng)存在!", function () {
                                    PageControl.RegisterInit();
                                });
                                break;
                            case -3:
                                AlphaMS.JSToolkit.Dialog.MessageBox("用戶名已經(jīng)存在,請重新輸入!", function () {
                                    $("#AR_Register_UserName_TextBox").focus();
                                });
                                break;
                            default:
                                AlphaMS.JSToolkit.Dialog.MessageBox(MyResponseObject.ResultMessage);
                                break;
                        }
                    }
                }
            }, ["Body"]);
        }, function () { });

    }
}

下面來看一下最終郵件驗(yàn)證的效果

輸入郵件地址

獲取驗(yàn)證碼

收到郵件

驗(yàn)證成功,繼續(xù)填寫用戶信息

注冊成功

四、總結(jié)與思考

就此,我們就使用阿里云郵件推送,完成了完整的郵件驗(yàn)證與推送體系的架設(shè)(主動(dòng)推送、數(shù)據(jù)統(tǒng)計(jì)等沒有寫出來,但是在代碼里面有,有需要代碼的可以郵件向我索要),一句話總結(jié)就是如下:

我想,互聯(lián)網(wǎng)再怎么發(fā)展,QQ號可以沒有,微信也可能衰落,但郵件沒有的可能性很低,作為一種工作方式和服務(wù)方式,在可預(yù)見的未來內(nèi),郵件體系一定會(huì)伴隨著信息系統(tǒng)的發(fā)展而發(fā)展,而從技術(shù)的角度出發(fā),對郵件技術(shù)和服務(wù)的深入研究與思考,一定能夠帶來更加優(yōu)秀的軟件系統(tǒng)和應(yīng)用。因此,建議每一個(gè)互聯(lián)網(wǎng)創(chuàng)業(yè)者和應(yīng)用,都能夠重視對郵件數(shù)據(jù)的收集和處理,也在郵件服務(wù)上多花點(diǎn)精力和金錢,帶給用戶更好的體驗(yàn)。


作者:張柔,發(fā)布于 博客園 與 初碼博客

轉(zhuǎn)載請注明出處,歡迎郵件交流:zhangrou@printhelloworld.com,或者加QQ群:11444444

總結(jié)

以上是生活随笔為你收集整理的【初码干货】使用阿里云邮件推送服务架设自己邮件验证与推送体系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

精品一区二区三区电影 | 国产亚洲精品日韩在线tv黄 | 久草在线官网 | 高清av免费看 | 国产小视频福利在线 | 97精品国产97久久久久久粉红 | 国产亚洲精品日韩在线tv黄 | 亚洲电影成人 | 九九视频一区 | 亚洲精品一区二区三区四区高清 | 亚洲欧美在线视频免费 | 国内99视频 | 在线之家官网 | 天天色草| 久久久久人人 | 久久免费国产 | 午夜久久美女 | www最近高清中文国语在线观看 | 久久精精品视频 | 成人午夜影视 | 国产a级片免费观看 | 国产91全国探花系列在线播放 | 人人涩 | 久草在线播放视频 | 国产又粗又猛又色又黄视频 | av片子在线观看 | 最新的av网站 | 九九精品视频在线观看 | 国产精品一区二区三区免费看 | 在线免费视频a | 青青河边草手机免费 | 欧美性粗大hdvideo | 欧美亚洲一区二区在线 | 视频三区在线 | 91xav| 91亚洲精品国产 | 精品国产伦一区二区三区观看说明 | 国产黄在线观看 | 91热视频 | 免费一级黄色 | 综合激情网 | 91在线网址 | 在线亚洲精品 | 五月婷婷综合在线视频 | 久久久久久在线观看 | 久久精品激情 | 成人av网址大全 | 久久99国产精品免费网站 | 日韩av黄| 久久视影 | 国产精品成人自产拍在线观看 | 日本bbbb摸bbbb | 国内综合精品午夜久久资源 | 在线观看一区二区精品 | 狠日日 | 免费观看第二部31集 | av超碰在线 | av夜夜操 | 日韩激情网 | 国产手机视频在线观看 | 精品国产精品一区二区夜夜嗨 | 日韩一级片网址 | 国产91对白在线播 | 国产亚洲成人精品 | 91麻豆精品国产91久久久久久 | 五月在线| 久久国产精品影视 | 成人国产综合 | 免费看黄色91 | 国产裸体永久免费视频网站 | 在线观看av网站 | 成人动漫一区二区 | 91免费黄视频 | 欧美另类tv | 国产免费av一区二区三区 | 国产精品免费视频一区二区 | 九九av| 波多在线视频 | 久久久免费精品视频 | 欧美精品做受xxx性少妇 | 日韩视频在线不卡 | 午夜久久久久久久久久久 | 9999在线观看 | 婷婷播播网| 成人黄色大片在线免费观看 | 久久久久国 | 久久久久女教师免费一区 | 丁香激情综合国产 | 欧美日韩国产在线一区 | www五月天| 丁香九月激情 | 国产麻豆剧果冻传媒视频播放量 | 黄色av电影在线观看 | a电影免费看 | 在线a人片免费观看视频 | 国产精品久久精品国产 | 亚洲国产欧洲综合997久久, | 国产福利免费看 | 国产小视频网站 | 亚洲激情在线 | 色小说av| 免费视频一区二区 | 美女视频黄是免费的 | 久久免费视频在线观看6 | 日韩精品一区二区在线视频 | 午夜婷婷在线观看 | 99精品久久久久久久 | 久久夜色电影 | 欧洲精品在线视频 | 在线免费国产视频 | wwwwww色 | 国产va饥渴难耐女保洁员在线观看 | 婷婷av网 | 丁香九月激情 | 亚洲一片黄| 国产精品久久久久久久久岛 | 狠狠干夜夜爽 | 久久久久久久久久久国产精品 | 国产成人一区二区三区在线观看 | 国产亚洲精品久久 | 亚洲精品久久久久中文字幕二区 | 久久国产精品99精国产 | 免费av试看| 正在播放五月婷婷狠狠干 | 黄色特级片 | 国产成人福利片 | 亚洲电影第一页av | 91av超碰 | 欧美一区日韩一区 | 中国一级片在线观看 | 久久情网 | 久久蜜臀一区二区三区av | 亚洲专区免费观看 | 一区二区三区高清在线 | 亚洲人成免费 | 免费看的黄网站 | 精品中文字幕在线观看 | 国产在线91精品 | 久色小说 | 日本一区二区不卡高清 | 888av| 久青草视频在线观看 | 91精品视频免费看 | 高清av在线 | 九九久久电影 | 精品在线播放视频 | 亚洲精品婷婷 | 国产999免费视频 | 日韩xxxxxxxxx | 亚洲影视九九影院在线观看 | 国产精品第54页 | 国产精品地址 | 色噜噜日韩精品欧美一区二区 | 久久不卡av | 欧洲精品久久久久毛片完整版 | 就操操久久 | 国产999精品久久久久久 | 久久成人在线视频 | 一区二区三区在线观看免费 | 国产不卡视频在线 | 中文字幕在线观看视频网站 | 国产美女免费观看 | 中文字幕在线免费播放 | 欧美日韩久久久 | 欧美久久久影院 | 黄色h在线观看 | 99久久精品国产欧美主题曲 | 成人午夜毛片 | 99麻豆久久久国产精品免费 | 久久精品4 | 日韩sese | 91丨九色丨91啦蝌蚪老版 | 国产在线a免费观看 | 日韩欧美综合在线视频 | 久久综合九色综合欧美就去吻 | 麻豆免费在线视频 | 99综合影院在线 | 久久人人爽爽人人爽人人片av | 国产精品区二区三区日本 | 超碰公开97 | 婷婷久久网站 | 成 人 免费 黄 色 视频 | 精品96久久久久久中文字幕无 | 国产一性一爱一乱一交 | 日韩欧美在线播放 | 久久久免费观看视频 | 在线观看午夜 | 欧美热久久 | 国产一区免费视频 | 欧美一级性 | 国产一性一爱一乱一交 | 97人人模人人爽人人喊中文字 | 免费日韩av电影 | 中文字幕在线看视频 | 超碰在线观看av | 国产日韩欧美在线观看视频 | 国产原创在线 | 日本特黄特色aaa大片免费 | 亚洲人在线视频 | av中文字幕在线电影 | 天天操天天干天天干 | 中文字幕在线观看完整 | 午夜色场 | 久久国产香蕉视频 | 国产精品99久久久精品免费观看 | 精品久久九九 | 日韩精品免费在线播放 | 99在线看 | 99久e精品热线免费 99国产精品久久久久久久久久 | 美女视频黄在线观看 | 久草在线久草在线2 | 久久 地址 | 免费在线观看国产黄 | 欧美 激情在线 | 婷婷国产精品 | 一级性视频| 一区二区男女 | 99在线精品免费视频九九视 | 国产精品免费久久久久 | www.五月婷| 国产黑丝一区二区三区 | 狠狠色狠狠综合久久 | 国产中文| 免费观看视频的网站 | 亚洲成人av在线电影 | 天堂av一区二区 | 骄小bbw搡bbbb揉bbbb | 国产精品专区h在线观看 | 午夜视频在线网站 | 在线观看国产永久免费视频 | 免费色视频网址 | 久久精彩免费视频 | 国产伦精品一区二区三区高清 | 日本在线观看一区二区 | 久久综合射 | 麻豆果冻剧传媒在线播放 | 在线亚洲高清视频 | 日韩av片在线 | 日日天天| 一区二区三区在线观看免费 | 久99精品 | a国产精品 | 成人动漫视频在线 | 欧美日韩高清国产 | 婷婷五天天在线视频 | japanesexxxxfreehd乱熟 | 少妇性xxx| 色午夜影院 | 99久高清在线观看视频99精品热在线观看视频 | 激情久久久久久久久久久久久久久久 | 色五月激情五月 | 国产一级高清视频 | 国产精品成人自产拍在线观看 | 久久精品国产一区 | 视频91| 国产精品99精品 | 99久久夜色精品国产亚洲96 | 在线观看日韩国产 | 五月婷婷在线视频 | 国产一区播放 | 五月婷av| 午夜精品电影 | 91手机视频 | 久久久国产日韩 | 最新色站 | 99 视频 高清 | 日韩影片在线观看 | 国产乱对白刺激视频不卡 | 操操操综合 | 久久免费精品一区二区三区 | 久草新在线 | 久久综合九色欧美综合狠狠 | 国产精品va视频 | 色综合久久天天 | 成人h电影在线观看 | 亚洲免费在线视频 | 99热手机在线 | 日韩在线观看视频免费 | 超碰在线免费福利 | 精品麻豆 | 麻豆国产露脸在线观看 | 亚洲精品中文字幕视频 | 免费观看一级 | 97国产在线 | 成人在线一区二区三区 | 国产原创在线 | 99久久夜色精品国产亚洲 | 欧美电影在线观看 | 精品免费在线视频 | 成人av资源在线 | 最近中文字幕在线播放 | 操操操com | 国产永久免费高清在线观看视频 | 国产成人亚洲精品自产在线 | 欧美精品国产综合久久 | 久久久久久久国产精品 | 精品国产1区2区3区 国产欧美精品在线观看 | 99热国内精品 | 美女性爽视频国产免费app | 天天干夜夜干 | 黄色免费大全 | av日韩国产 | 免费黄色在线播放 | 国产午夜精品福利视频 | 成人a视频 | 激情av五月婷婷 | 91亚洲影院| 国产精品乱码久久久久久1区2区 | 国产精品一区二区免费 | 777奇米四色 | 欧美亚洲另类在线视频 | 97国产精品 | 少妇视频在线播放 | 欧美日韩大片在线观看 | av九九| 九九在线视频 | 麻豆视频大全 | 97超碰人人澡人人爱 | 2021国产精品视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 亚洲国产美女精品久久久久∴ | 精品免费一区 | av片免费播放 | 丰满少妇在线观看网站 | 日韩av偷拍 | 色丁香婷婷 | 中国黄色一级大片 | 男女日麻批 | 中文字幕成人网 | 蜜桃视频在线观看一区 | 成年一级片| 99精品色 | aaa毛片视频 | 久久avav | 视频福利在线观看 | 97视频人人澡人人爽 | 久久污视频 | 天天干人人 | 精品久久亚洲 | 精品久久久一区二区 | 久久理论电影网 | 国产精品福利一区 | 亚洲理论电影网 | 夜夜夜| 精品九九久久 | 国产视频网站在线观看 | 欧美一二区视频 | 青青草国产精品视频 | 日韩大片在线 | 午夜精品一二三区 | 麻豆视频在线看 | 五月天久久婷 | 亚洲欧洲一区二区在线观看 | 99精品免费久久久久久久久日本 | 麻豆视频在线观看免费 | 天天综合色天天综合 | 久久免费99精品久久久久久 | 欧美精品在线观看免费 | 黄色三级免费网址 | 99久久99久久综合 | 97韩国电影| 五月婷影院 | 国产高清在线视频 | 婷久久| 亚洲丝袜一区 | 91九色成人 | 久久激情久久 | 少妇高潮冒白浆 | 4438全国亚洲精品在线观看视频 | 国产日韩精品一区二区在线观看播放 | 婷婷播播网 | 国产精品一区二区三区免费看 | 亚洲精品国偷自产在线99热 | 麻豆视频在线播放 | 麻豆精品视频在线 | 日本久久中文 | 中文字幕4 | 一级免费片| 国产高清免费在线观看 | 在线免费视 | 91九色在线视频观看 | 国产又粗又猛又色又黄视频 | 天天干天天搞天天射 | 999在线视频 | 亚洲欧洲国产视频 | 亚洲日b视频 | 亚洲播播 | 国产玖玖在线 | adn—256中文在线观看 | 激情亚洲综合在线 | 最新国产中文字幕 | 国产精品乱码久久久久久1区2区 | 波多野结衣一区三区 | 日韩一三区 | 一区二区三区视频网站 | 国产精品美女久久久免费 | 日日操日日操 | 91大神精品视频 | 97电影院网 | 久久999精品 | 蜜臀av性久久久久av蜜臀妖精 | 免费黄色网址大全 | 亚洲深爱激情 | 99久久精品久久久久久动态片 | 亚洲女人天堂成人av在线 | av黄色在线观看 | 中文字幕av有码 | 日日碰狠狠添天天爽超碰97久久 | 久久久久久久久毛片精品 | 久久久久久久久黄色 | 日本精品xxxx | 久草精品电影 | 在线a人片免费观看视频 | 中文字幕免费一区 | 免费黄色在线网址 | 精品国产一区二区三区久久 | 久久久久亚洲国产精品 | 一区av在线播放 | 九九热免费在线视频 | 久久国产精品99精国产 | 久久精品国产一区二区三 | 成人黄色小视频 | 国产在线播放观看 | 久久久毛片 | 精品一区精品二区 | 亚洲区视频在线观看 | 久久久久久久国产精品视频 | 中文字幕一区二区三区精华液 | 96国产在线 | 国产美女网站视频 | 91精品久久久久久综合五月天 | 国产精品女人久久久 | 综合色在线观看 | 久久久久久久久久久久久久免费看 | 欧美激情精品久久 | 精品久久久久国产免费第一页 | 亚洲区视频在线观看 | 成人91在线观看 | 日本中文在线播放 | 国产一区二区不卡在线 | 午夜精品一区二区三区视频免费看 | 中文字幕在线观看一区二区三区 | 超碰人人av | 又黄又网站 | 亚洲特级毛片 | 亚洲美女在线国产 | 色香网| 欧美一级特黄高清视频 | 黄色在线小网站 | 操操操com| 九九热视频在线 | 激情深爱| 亚洲激情六月 | 美女视频免费一区二区 | 免费观看福利视频 | 国产裸体bbb视频 | 国产精品扒开做爽爽的视频 | 亚洲国产综合在线 | 国产高清免费 | 午夜丰满寂寞少妇精品 | 国产精品乱码高清在线看 | 欧美日韩伦理一区 | a视频免费 | 久久开心激情 | 九色一区二区 | 精品久久久久久电影 | 国产精品大全 | 免费在线观看黄色网 | 成人黄色一级视频 | 日韩免费福利 | 欧美日韩啪啪 | 久久综合九色综合久99 | 国产日韩在线观看一区 | 2019天天干天天色 | 国产精品门事件 | 91一区二区三区久久久久国产乱 | 色香蕉网 | 日韩欧美成人网 | 人人爽人人乐 | 亚洲 精品在线视频 | 久久精品这里精品 | 欧美a级片网站 | 国产人成精品一区二区三 | 天天摸天天操天天爽 | www.97色.com | 成年性视频 | 久草在线免费看视频 | 精品一区 在线 | 久久久国产一区二区三区四区小说 | 五月婷婷伊人网 | 手机av在线网站 | 超碰999| 精品资源在线 | 国产一区二区不卡视频 | 国产精品123 | 亚洲精品 在线视频 | 国产精品专区h在线观看 | 少妇资源站 | 99久久精品免费看国产 | 亚洲精品18p| 98涩涩国产露脸精品国产网 | 亚洲精品美女 | 亚洲一区不卡视频 | 亚洲黄色一级视频 | 欧美日韩在线观看一区二区三区 | 久久a级片 | 最新国产精品拍自在线播放 | www.玖玖玖| 免费看污污视频的网站 | 欧美日韩中文在线观看 | 精品视频成人 | 亚洲成av片人久久久 | 中文字幕一区二 | 国产精品一区二区三区在线 | 激情喷水 | 国产精品久久久久一区二区三区 | 69国产精品成人在线播放 | 日韩欧美91| 欧美日韩国产综合网 | 98久久| 久久免费的精品国产v∧ | 一本一本久久a久久精品综合小说 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩中午字幕 | 91传媒在线 | 日韩精品第一区 | 亚洲国产精品视频在线观看 | 久久久99精品免费观看app | 欧美激情视频免费看 | 人人玩人人添人人澡97 | 午夜电影久久 | 日韩视频一二三区 | 91av在线免费播放 | 黄色免费看片网站 | 久草在线91 | 久久精品99国产精品日本 | 欧美色图狠狠干 | 色播激情五月 | 久久国产精品视频观看 | 亚洲视频精品 | 中文永久字幕 | 一区二区三区免费在线观看视频 | 欧美日韩视频在线一区 | 欧美日韩亚洲在线观看 | 欧美视频日韩视频 | 欧美精品做受xxx性少妇 | 成人av影视 | 欧美性精品 | 日韩综合一区二区三区 | 婷婷在线免费 | 色香蕉网| 天天干天天拍天天操 | 中文字幕一区在线观看视频 | 国产精品久久久久久999 | 青青河边草观看完整版高清 | 黄色一区二区在线观看 | a在线一区 | 欧美在线18| 99久久婷婷 | 在线观看免费av网站 | 久久久免费电影 | 麻豆传媒视频在线播放 | 9色在线视频 | 久久久午夜精品理论片中文字幕 | 精品国产三级 | 色婷婷综合久久久久中文字幕1 | 国产免费三级在线观看 | 亚洲精品一区二区三区四区高清 | 国产专区精品视频 | 欧美与欧洲交xxxx免费观看 | 超碰成人网 | 久久 在线 | 一本一道久久a久久精品蜜桃 | 一本一本久久a久久 | 久久精品一二三区 | 久久天天综合网 | 国产精品久久久久久爽爽爽 | 国产人成看黄久久久久久久久 | 日韩系列在线观看 | 91人人视频在线观看 | 探花系列在线 | 青春草免费在线视频 | 中文有码在线 | 久久免费观看少妇a级毛片 久久久久成人免费 | 久久国产亚洲视频 | 五月天天在线 | 911香蕉视频 | 91九色蝌蚪视频在线 | 免费在线观看成年人视频 | 99精品国产成人一区二区 | 欧美日韩在线精品一区二区 | 天天草天天色 | 中文字幕第一页在线 | 久久精品小视频 | 国产午夜视频在线观看 | 人人澡人人模 | 亚洲一区二区三区四区精品 | 日韩在线第一区 | 久久大视频 | 亚洲精品五月 | h动漫中文字幕 | 亚洲综合色站 | 西西4444www大胆艺术 | 成人91视频 | 日韩中午字幕 | 国内三级在线观看 | 亚洲精品男女 | 综合色播 | 91免费的视频在线播放 | 高清国产一区 | 手机av在线网站 | 久久免费激情视频 | 午夜久久网 | 国产日韩精品一区二区三区在线 | 麻豆成人精品 | 欧美一区二区在线刺激视频 | 99精品免费在线 | 夜色成人av | 午夜在线资源 | 亚洲欧美日本一区二区三区 | 中文字幕国产精品一区二区 | 久久久国产精品人人片99精片欧美一 | 美女视频黄在线 | 国内精品久久久久久中文字幕 | av 一区二区三区四区 | 伊香蕉大综综综合久久啪 | 久久免费公开视频 | 成人性生交大片免费观看网站 | 久久99国产精品 | www日韩在线观看 | 伊甸园av在线 | 亚洲高清激情 | 精品国产一二三四区 | www视频免费在线观看 | 黄色三级在线观看 | 日日骑| 91传媒激情理伦片 | 午夜av一区二区三区 | 欧美亚洲成人免费 | 69av视频在线观看 | 国产精品麻豆果冻传媒在线播放 | 欧美十八 | 97电影网手机版 | www色com| 国产91大片 | 欧美精品在线免费 | 成年人在线观看免费视频 | 午夜色大片在线观看 | 久久在现| 久久九九久久九九 | 99热高清| 中文字幕在线观看1 | 夜夜躁狠狠躁日日躁 | 久久精品xxx| 黄色资源在线 | 香蕉网址| 高清不卡毛片 | 亚洲国产69 | 九九九九精品 | 亚洲精品视频在线观看免费 | 日韩午夜电影院 | 精品国产成人 | 久草香蕉在线视频 | 中文字幕 婷婷 | 在线观看一区二区视频 | 久99精品 | 一本色道久久精品 | 国产国产人免费人成免费视频 | 国内久久久久 | 精品国内自产拍在线观看视频 | 九九热视频在线 | 色悠悠久久综合 | 99r国产精品 | 欧美视频在线观看免费网址 | 久久久久久免费视频 | 人人讲下载 | 日日夜夜干 | 精品国产电影 | 亚洲一区免费在线 | 黄色aaa级片 | 国产精品福利午夜在线观看 | 欧美精品久久久久久久亚洲调教 | 又黄又爽免费视频 | 在线观看av网 | 激情五月六月婷婷 | 制服丝袜亚洲 | 亚洲精品久久久久中文字幕二区 | av东方在线 | 欧美老少交 | 国产精品久久三 | 色天天久久 | 欧美一区二区精品在线 | 97超碰在线久草超碰在线观看 | 欧美极品久久 | 中文字幕在线专区 | 久久视频网址 | 色99网| 国产一区二区在线视频观看 | 久久精品99国产精品酒店日本 | 国产高清av免费在线观看 | 日韩视频在线不卡 | 国产精品69av | 久草资源在线 | 91免费在线看片 | 日韩国产精品毛片 | 国产又黄又硬又爽 | 麻豆一二三精选视频 | 天堂av在线网 | 国产亚洲精品久久久久秋 | 日韩精品久久中文字幕 | www天天干 | 欧美一二三视频 | 久久 精品一区 | 麻豆av一区二区三区在线观看 | 国产精品一区二区三区视频免费 | 国产成人99久久亚洲综合精品 | 国产精品福利无圣光在线一区 | 天天干夜夜夜 | 成人国产综合 | 久久精品99国产精品亚洲最刺激 | 成人黄色片免费看 | 亚洲欧美日本国产 | 激情婷婷丁香 | 五月天激情视频在线观看 | 日韩黄色一区 | 亚洲高清精品在线 | 日韩在线免费高清视频 | 少妇av片 | 在线国产能看的 | 四虎国产精品永久在线国在线 | 极品中文字幕 | 91精品国自产在线观看 | 欧美日韩久 | 成人一级在线观看 | 免费av试看 | 国产精品久久久久久高潮 | 精品久久片 | 天天色成人网 | 精品在线播放视频 | 毛片的网址 | 欧美一区二区在线免费观看 | 欧美性色19p| 成片人卡1卡2卡3手机免费看 | 精品一区二区三区在线播放 | 视频高清 | 在线免费黄色毛片 | 国产一卡久久电影永久 | 九九日九九操 | 国产高清av在线播放 | 婷婷久久综合网 | 久久视频在线看 | 亚洲.www | 91一区啪爱嗯打偷拍欧美 | 日韩欧美精选 | 亚洲精品tv久久久久久久久久 | 日本视频不卡 | 在线观看成人福利 | 国产精品一区在线 | 国产无遮挡又黄又爽在线观看 | 精品一区二区三区电影 | 久久综合精品一区 | 午夜.dj高清免费观看视频 | 成人性生活大片 | 久久久久亚洲精品成人网小说 | 日韩爱爱片 | 日韩中文字幕免费在线播放 | 国产亚洲精品女人久久久久久 | 日韩精品一区二区三区在线播放 | 精品久久久久久久久亚洲 | 九色视频网 | 国产高清网站 | 久久草精品 | 黄色一级动作片 | 激情久久五月天 | 久久精品视频在线观看 | 国产精品麻豆91 | 日韩欧美在线影院 | 午夜久操 | 亚洲第一区在线播放 | 亚洲成a人片在线观看网站口工 | 97在线精品视频 | 久久超碰网 | 成年人视频在线免费 | 九九久久精品 | 成人免费在线网 | 天天综合网 天天综合色 | 国产高清久久 | 午夜精品av在线 | 91精品国产成人观看 | 91爱爱免费观看 | www.com黄| 国产超碰在线观看 | 99久免费精品视频在线观看 | 国产在线成人 | 国产精品嫩草55av | 精品在线99 | 在线免费观看国产精品 | 91桃色在线免费观看 | 久久久久国产成人精品亚洲午夜 | 国产 在线 日韩 | 久久国色夜色精品国产 | 69久久99精品久久久久婷婷 | 在线免费看片 | 日本精品视频在线观看 | 四虎影视www| 爱射综合 | 五月天激情视频在线观看 | 国产一区私人高清影院 | 超碰人人干人人 | 日韩一区二区三免费高清在线观看 | 中文字幕在线电影 | 日韩激情视频在线 | 三级av片 | 亚洲全部视频 | 99999精品 | 亚洲综合欧美激情 | 日韩试看 | 久久精品男人的天堂 | 欧美日韩视频一区二区三区 | 日韩精品大片 | 少妇按摩av| 日韩一区二区三区高清免费看看 | 国产手机在线播放 | 美女国产精品 | 97视频在线观看免费 | 超级av在线 | 97影视 | 综合国产在线 | 91黄色在线视频 | 91精品综合在线观看 | av三级在线免费观看 | 中文字幕乱码亚洲精品一区 | 欧美色就是色 | 麻豆国产网站入口 | 91视频 - v11av| 波多野结衣日韩 | 视频成人永久免费视频 | 成人av片免费看 | av在线进入| 国产精品久久久久久婷婷天堂 | 美女在线国产 | 正在播放一区二区 | 日本爱爱免费 | 91亚洲狠狠婷婷综合久久久 | 99精品久久精品一区二区 | 亚洲天堂色婷婷 | 欧美 日韩 久久 | 日日日视频 | 精品免费观看 | 97国产超碰在线 | 三级在线视频观看 | 中文字幕 91 | 欧美激情视频在线观看免费 | 国产高清中文字幕 | 日韩免费高清在线 | 日日操操操 | 色大片免费看 | 日韩videos高潮hd | 99精品偷拍视频一区二区三区 | 国产免费作爱视频 | www.久久色 | 国产区免费 | 在线国产视频 | 天天干,天天操 | 欧美成人影音 | 成人在线观看av | 免费观看一区二区三区视频 | 在线 你懂 | www..com黄色片 | 中文字幕在线视频一区 | av在线播放快速免费阴 | 午夜骚影 | 狠狠五月婷婷 | 国产小视频在线免费观看 | 国产精品国产三级国产 | 天天色综合久久 | 美女视频黄在线观看 | 精品国产伦一区二区三区 | 国产一二区在线观看 | 日韩在线大片 | 97电影手机 | 视频1区2区 | 欧美激情综合色综合啪啪五月 | 色综合网| 久艹在线免费观看 | 国产一级电影免费观看 | 日韩中文字幕第一页 | 射射射av | 久草在线久 | 国产一级做a爱片久久毛片a | 国产精品视频在线观看 | 在线观看香蕉视频 | 中文字幕人成乱码在线观看 | 日韩精品第一区 | 免费精品国产 | 亚洲精品中文在线观看 | 久久国产欧美日韩精品 | 中文字幕在线视频一区二区 | 在线观看国产一区二区 | av在线超碰 | 久久久激情网 | 精品久久久久久久久久久久 | 国产精品毛片久久蜜 | 亚洲va在线va天堂 | 亚洲黄电影 | 精品婷婷| 久久试看| 日韩精品国产一区 | 天天天干天天天操 | 美国人与动物xxxx | 最近最新最好看中文视频 | 国内精品一区二区 | 精品免费在线视频 | 日韩中文字幕免费在线观看 | 五月婷婷电影网 | 国产精品一区二区视频 | 成人看片 | 西西4444www大胆艺术 | 久久精品一区二区 | 亚洲精品国产精品乱码不99热 | 国产成人亚洲精品自产在线 | 超碰97人| 日韩午夜一级片 | 国产高清一区二区 | 日日干美女 | 国产亚洲aⅴaaaaaa毛片 | 午夜精品久久 | 婷婷激情综合网 | 国产精品99久久久久人中文网介绍 | 日韩小视频 | 天天爽天天爽 | 91免费高清在线观看 | 91福利免费 | 国产成人精品亚洲 | 狠狠色噜噜狠狠狠狠 | 麻豆精品传媒视频 | 在线a人v观看视频 | 高清视频一区 | 91精品国自产在线观看 | 亚洲精品777| 国产亚洲一区二区在线观看 | 免费在线播放av电影 | 亚洲天堂网在线观看视频 | 综合视频在线 | 五月天久久狠狠 | 日韩高清一区二区 | 中文字幕无吗 | 麻豆果冻剧传媒在线播放 | 91在线看视频免费 | 久久国语 | 久久99国产综合精品免费 | 91福利在线导航 | 五月婷婷激情 | 日韩电影精品 | 亚洲精品777 | 久久人人97超碰精品888 | 久久精品欧美一区二区三区麻豆 | 激情久久久久久久久久久久久久久久 | 免费看黄在线看 | 国产精品精品久久久久久 | 日韩高清av在线 | 91麻豆国产福利在线观看 | 精品久久久久久亚洲综合网 | 人人爽人人爽人人片av免 | 久久久男人的天堂 | 国产97在线播放 | 中文字幕在线观看第二页 | 国产专区视频在线 | 中文国产成人精品久久一 | 激情综合亚洲精品 | 亚洲国产精品成人女人久久 | 天天曰夜夜爽 | 日本超碰在线 | 午夜精品久久久久久久爽 | 亚洲午夜精品一区二区三区电影院 | 国产精品女同一区二区三区久久夜 | 91女人18片女毛片60分钟 | 亚洲精品欧美精品 | 992tv在线成人免费观看 | 91av官网| 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 国产黄色精品 | 91在线porny国产在线看 | 美女一级毛片视频 | 在线精品视频在线观看高清 | 精品一区二区三区四区在线 | 992tv人人草 黄色国产区 | 日韩在线观看中文字幕 | 欧美韩国日本在线观看 | 激情婷婷在线 | 超碰在线cao| 在线直播av | 久久精品视频一 | 婷婷六月丁香激情 | 久久天堂亚洲 | 中文字幕亚洲精品在线观看 | 国产亚洲精品成人av久久ww | 丁香五香天综合情 |