初码干货

style=”font-family: 微软雅黑; font-size: medium;”>提醒:阅读本文需提前精通的连锁文化

style=”font-family: 微软雅黑; font-size: medium;”>壹 、电子邮件协议( style=”font-family: 微软雅黑; font-size: medium;”>http://baike.baidu.com/view/2367542.htm style=”font-family: 微软雅黑; font-size: medium;”>)

style=”font-family: 微软雅黑; font-size: medium;”>贰 、Ali云邮件推送( style=”font-family: 微软雅黑; font-size: medium;”>https://www.aliyun.com/product/directmail style=”font-family: 微软雅黑; font-size: medium;”>)

style=”font-family: 微软雅黑; font-size: medium;”>三 、EDM(电子邮件经营销售)( style=”font-family: 微软雅黑; font-size: medium;”>http://baike.baidu.com/subview/1212416/8602812.htm style=”font-family: 微软雅黑; font-size: medium;”>)

style=”font-family: 微软雅黑; font-size: medium;”>四 、SendCloud邮件服务( style=”font-family: 微软雅黑; font-size: medium;”>http://sendcloud.sohu.com/ style=”font-family: 微软雅黑; font-size: medium;”>)

读书目录结构

引:

style=”font-family: 微软雅黑; font-size: medium;”>一 、供给分析

style=”font-family: 微软雅黑; font-size: medium;”>② 、功效设计

style=”font-family: 微软雅黑; font-size: medium;”>叁 、详细完成步骤

style=”font-family: 微软雅黑; font-size: medium;”>肆 、总计与沉思

 


引:

大家会意识,越多的互连网使用和商号级应用,起头运用邮件验证码验证替代邮件链接验证,例如下图:

发展历史 1

又例如:

发展历史 2

本来,也有越来越多的选用使用了精良的HTML代码来装点邮件,例如:

发展历史 3

又例如:

发展历史 4

style=”font-family: 微软雅黑; font-size: medium;”>笔者想,三个得天独厚的互连网选拔可能个体经营的站长站点,若是在登记、身份证申明、消息推送等效率上,加上如上效果的邮件服务,一定能推动更为优质的用户体验

而邮件服务也不是今后才有,大家能够回忆一下前进历史

如拾草芥站长应该都回忆,在比如Discuz、WordPress等CMS中,都足以安顿SMTP音讯,开通了163等邮箱的SMTP作用就能够填入账号密码,从而达到出殡和埋葬邮件的效率。

广大商家在若干年前,也喜爱于选择大型如ExchangeServer,中型小型型如UMail等软件搭建自个儿的同盟社邮件服务系统。

但是随着互连网的发展,伴随着QQ等邮件服务商的成名,古板的海外那一套邮件规则和秩序已经发生了改动,有时候纵然你有很多IP,做了反向解析,在Spamhaus白名单,又大概虚拟了差别的helo域,QQ邮箱依然照拦不误,最后依旧得单独花钱向国内外各大ESP购买独立通道

在那种景况下,自行建造邮局系统或然邮件SMTP服务,就显得因小失大了,所以一方面各大公司邮箱服务越做越好,获得集团的认同,另一方面,国内外如SendGrid,SendCloud等第壹方邮件PUSH服务商也日趋做大,他们用更标准的手法,去化解通道、白名单、信誉度等各样邮件服务难点,而客户只需求通过SMTP协议只怕封装的API接口,就足以丰富便捷的给用户发送邮件

就自小编所知,近来国内做的最棒的当属腾讯网的SendCloud,不过SendCloud发展了那般长年累月,也越来越复杂和专业,作者认为更契合有重型EDM须要的运用使用,作为中型小型集团和创业者以及站长,首推依然是Ali云的邮件推送服务,一如既往秉持Ali云的特色:动用傻瓜,上手火速,文书档案俱全,但漏洞和难点多多**不过作为AWS的追赶者,能在短期内非常的慢完毕这么些应用级功效,也毕竟值得鼓励的。因而上边也根据Ali云邮件推送服务,来贯彻两个体协会调的邮件验证与推送连串**。

① 、必要分析

做其它业务,顶层设计丰硕首要,优异的规划反复让以往的业务一石二鸟,所以在筹划总体邮件验证与推送体系前,大家先看看有啥效用是期待能够落实的

  • 支持邮件发送验证码邮件经营销售推送
  • 可见通过支付在程序逻辑恐怕管理界面中自行触发发送

  • 可见帮忙HTML的邮件内容,而HTML内容能够随时随处进行修改,方便美术工作和支出去调整

  • 验证类邮件能够援助IP总计、次数总计,能够举办时间范围、防止恶意发送

  • 推送类邮件能够援中国人民救济总会结算与发放送数量、发送成功率等报告数据。

  • 推送类邮件,用户能够退订。

理所当然,最珍视的,验证邮件要能在5-10秒内发送成功,到达率高

贰 、效用设计

经过上述急需分析,能够肯定出以下部分至关主要的安插性思路

一 、要求统一筹划模板功效。通过沙盘功用来支撑HTML邮件内容以及每天可更新替换的须求,通过沙盘里的主要词参数设计,来完成验证码、用户名、经营销售内容的动态输入。

二 、须要规划2个验证码相关表。用来支撑邮件验证码校验、请求限制等作用。

③ 、须求统一筹划3个发送记录相关表。记录全部发送记录,用于总括和分析。

肆 、管理后台尽量界面化管理。用户管理、邮件模板配置、发送记录查询等大旨支持功用,在后台尽量以界面化完结管理。

5、将公司邮局和邮件推送服务分开。以域名XXX.com为例,一般集团邮局部为zhangsan@XXX.com,邮件服务不宜以XXX.com为域,会和公司邮局服务相互干扰(也不是一点一滴不可能,只是布署起来很麻烦),应当扩展五个二级域名,例如mail.XXX.com,邮件服务地点正是service@mail.XXX.com

一体化功用架构图如下:

发展历史 5

三 、详细完结步骤

碰巧手上有个网站,含有注册邮件验证功效,那就根据那一个网站的付出,一步一步的执教一下详细的兑现步骤

终极完结效益如下:

网站域名是:阿尔法ms.cn,地址为 https://www.alphams.cn,用户注册地址为https://www.alphams.cn/Register

合法公司邮箱域是@alphams.cn,客服邮件地址为:kefu@alphams.cn

在Ali云申请的邮件服务域为:@mail.阿尔法ms.cn,服务邮件地址为:service@mail.alphams.cn

切实的完毕步骤为:

壹 、注册Ali云集团邮箱免费版,落成客服邮件地址

咱们的公司邮局服务使用了Ali云公司邮箱免费版。(吐槽一下,竟然要转会腾讯网才能注册还捆绑消费6元邮件推送)

发展历史 6

发展历史 7

付出成功后,能够在公司邮箱列表中看出

发展历史 8

上面继续设置解析,能够到支援页面阅览哪些设置解析

发展历史 9

前去域名解析处举办分析设置

发展历史 10

浅析后,公司邮箱生效,举行管理员用户密码开头化

发展历史 11

发展历史,行使管理员账号进入
https://qiye.aliyun.com/ 

接轨设置安全题材并绑定手提式有线电话机号

发展历史 12

中标进去后接二连三添加客户账号

发展历史 13

时至后天,公司邮局账号添加成功,到Foxmail中展开登录。

贰 、配置Ali云邮件服务

先是要添加贰个发信域名

发展历史 14

发展历史 15

那里大家也足以小心到,Ali云也唤起不要添加公司邮箱域名,这和我们事先设计中的思路一致,那里我们抬高的域名是
mail.阿尔法ms.cn

接下来Ali云提醒要求安顿部分解析消息,从而生效域名

发展历史 16

下前边往Ali云的域名解析中举办安装

发展历史 17

设置好了以往回到刚才的页面进行认证

发展历史 18

那般,域名就添加事业有成了

发展历史 19

上边继续添加发信地址

发展历史 20

发展历史 21

这里我们得以看看,发信账号如作者辈后面所说,是service@mail.alphams.cn

寄信类型选用了批量邮件(那里有个难点,在实地衡量中发觉,Ali云那么些推送服务有接触邮件和批量邮件,触发邮件类型偶尔会发不出去大概接到不到,不知道原因是哪些,有深深研商的人致谢告知本身瞬间)

发展历史 22

那时候回信地址还未通过验证,我们点击验证回信地址,然后前往以前申请的QQ集团邮箱中,来证实

发展历史 23

诸如此类就开始展览了申明

发展历史 24

此刻还必要安装一下SMTP密码,大家设置为XXX

发展历史 25

发展历史 26

此间越发必要小心的是Ali云的官方认证

发展历史 27

寄信域名在创制在此之前要密切,因为不能给删除和修改。

那般,Ali云邮件服务的计划就大功告成了。

SMTP服务地点为:smtpdm.aliyun.com,SMTP账号正是service@mail.alphams.cn,密码正是刚刚设置的密码

到这一步截止,已经得以为无数站长网站的邮件服务提供帮忙了,在局地CMS里面一贯配备入SMTP音讯即可使用

不过,网站和选用多数都以独自开发,大家更亟待统一筹划自个儿的邮件发送和作用处理系统,因而上边我们继承

3、用户注册页面包车型大巴备选工作

切实的页面编码和程序逻辑因为非昨日所讲重点,所以那里差不多若干字以及若干代码,把首要的手续列出来,源码可邮件找笔者要:

是因为要投入邮件地址的评释,所以先对登记页面包车型地铁一体化流程展开统一筹划,逻辑图如下:

发展历史 28

style=”color: #9b00d3; font-family: 微软雅黑; font-size: medium;”>当中,为了增强用户体验,先验证邮件地址,再输入用户名,而那种中间的关联和强逻辑用二个注册会话表来拓展支配

注册会话表结构如下:

发展历史 29

一时半刻验证成功的邮件地址,存入会话表,并向客户端反回二个会话编号,最终成就登记时,需求用户名密码连同那些会话编号一起传入后台验证注册

接下去正是邮件验证表的安排

其一表既要能扶助没有用户意况的验证,例如挂号认证,又要能接济用户运行时的认证,例如修改密码验证等。

表结构如下:

发展历史 30

中间渠道为切实的行使处境,状态和过期时间多个字段用来重新控制有效性,预留的七个参数,用于存款和储蓄用户编号、注册会话编号等额外的多少

自然,也少不了用户表,因为那边并不曾什么尤其的用户场景,所以用户表较为简便,结构如下:

发展历史 31

④ 、邮件模板的铺排性

接下去就进去实际的支付,在支付中,肯定会用到对邮件的出殡和埋葬,在大家以此企划的系统里面,最上边也说了,须求统一筹划模板机制,那么大家就先规划邮件模板成效

具体的功能架构为:

发展历史 32

style=”color: #9b00d3; font-family: 微软雅黑; font-size: medium;”>那里设计了最不难易行的模版功效,主要思路即数据仓库储存款和储蓄HTML模板内容,参数直接放入HTML代码中,在付出时开始展览沟通

上边是邮件模板表的宏图,表结构如下:

发展历史 33

在后端对模板进行增加和删除改查管理,省略代码若干,最后效果如下:

先营造1个用于新用户注册的HTML模板

发展历史 34

然后在管制界面添加消息和HTML代码

发展历史 35

然后添加事业有成

发展历史 36

五 、邮件发送的技术准备

透过Ali云的技巧文书档案能够知道,Ali云邮件服务的调用形式有三种

发展历史 37

原先准备利用API接口举办李包裹装,不过近期太忙了,所以先利用STMP接口格局实行了2次封装,主要代码如下:

实体:

/// <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 () { });

    }
}

下边来看一下末尾邮件验证的效力

输入邮件地址

 

发展历史 38

赢得验证码

发展历史 39

接收邮件

发展历史 40

证实成功,继续填写用户音信

发展历史 41

发展历史 42

登记成功

发展历史 43

肆 、计算与思考

就此,大家就动用Ali云邮件推送,完毕了总体的邮件验证与推送类别的架构(主动推送、数据总括等没有写出来,但是在代码里面有,有亟待代码的可以邮件向小编急需),一句话总计便是之类:

style=”color: #ff0000; font-family: 微软雅黑; font-size: medium;”>笔者想,互连网再怎么进步,QQ号能够没有,微信也或者衰落,但邮件没有的恐怕相当低,作为一种工作方法和服务章程,在可预言的前程内,邮件系统一定会陪伴着音讯类别的升华而更上一层楼,而从技术的角度出发,对邮件技术和服务的中肯探讨与思考,一定能够推动尤其非凡的软件系统和选择。由此,提议每多少个互连网创业者和平运动用,都可以尊重对邮件数量的征集和处理,也在邮件服务上多花点精力和钱财,带给用户更好的体验。


作者:张柔,发布于 
博客园  与  初码博客

转发请注脚出处,欢迎邮件沟通:zhangrou@printhelloworld.com,或者加QQ群:11444444

发表评论

电子邮件地址不会被公开。 必填项已用*标注