提醒:阅读本文需提前领会的相干知识 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;">..." />

运用Ali云邮件推送服务架构自个儿邮件验证与推送类别

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;”>http://baike.baidu.com/view/2367542.htm style=”font-family: 微软雅黑; font-size: medium;”>)

style=”font-family: 微软雅黑; font-size: medium;”>② 、阿里云邮件推送( 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;”>② 、成效设计

ca88手机版登录网页, 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;”>三 、详细实现步骤

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

 



引:

引:

大家会发觉,越来越多的网络应用和商社级应用,开端选用邮件验证码认证替代邮件链接验证,例如下图:

小编们会发觉,更多的互连网使用和店铺级应用,起初运用邮件验证码验证替代邮件链接验证,例如下图:

ca88手机版登录网页 1

ca88手机版登录网页 2

又例如:

又例如:

ca88手机版登录网页 3

ca88手机版登录网页 4

理所当然,也有愈来愈多的使用使用了美丽的HTML代码来装饰邮件,例如:

理所当然,也有更加多的施用使用了美妙的HTML代码来装点邮件,例如:

ca88手机版登录网页 5

ca88手机版登录网页 6

又例如:

又例如:

ca88手机版登录网页 7

ca88手机版登录网页 8

style=”font-family: 微软雅黑; font-size: medium;”>作者想,二个名特别减价的网络使用也许个体经营的站长站点,假使在注册、身份证验证、音讯推送等功效上,加上如上效益的邮件服务,一定能拉动越发优质的用户体验

style=”font-family: 微软雅黑; font-size: medium;”>作者想,叁个美观的网络应用大概个体经营的站长站点,假使在登记、身份证验证、音信推送等效果上,加上如上功效的邮件服务,一定能拉动越来越优质的用户体验

而邮件服务也不是前几天才有,大家得以回看一下进步历史

而邮件服务也不是当今才有,我们能够回顾一下腾飞历史

过多站长应该都纪念,在诸如Discuz、WordPress等CMS中,都得以配备SMTP音信,开通了163等邮箱的SMTP功能就足以填入账号密码,从而实现出殡和埋葬邮件的成效。

众多站长应该都回忆,在比如Discuz、WordPress等CMS中,都足以配备SMTP消息,开通了163等邮箱的SMTP作用就足以填入账号密码,从而达到殡葬邮件的效益。

诸多商厦在若干年前,也热衷于选用大型如ExchangeServer,中型小型型如UMail等软件搭建本人的公司邮件服务系统。

广大店铺在多少年前,也热衷于接纳大型如ExchangeServer,中型小型型如UMail等软件搭建自身的店堂邮件服务连串。

只是随着互连网的前行,伴随着QQ等邮件服务商的盛名,守旧的海外那一套邮件规则和秩序已经发生了改观,有时候正是你有许多IP,做了反向解析,在Spamhaus白名单,又大概虚拟了差异的helo域,QQ邮箱如故照拦不误,最后依旧得单独花钱向国内外各大ESP购买独立通道

而是随着互连网的迈入,伴随着QQ等邮件服务商的走红,古板的国外那一套邮件规则和秩序已经发生了转移,有时候正是你有为数不少IP,做了反向解析,在Spamhaus白名单,又或许虚拟了差异的helo域,QQ邮箱依旧照拦不误,最后依旧得单独花钱向国内外各大ESP购买独立通道

在那种情景下,自行建造邮局系统恐怕邮件SMTP服务,就呈现贪小失大了,所以一方面各大企业邮箱服务越做越好,获得公司的肯定,另一方面,国内外如SendGrid,SendCloud等第二方邮件PUSH服务商也慢慢做大,他们用更标准的手腕,去化解通道、白名单、信誉度等各个邮件服务难题,而客户只要求经过SMTP协议可能封装的API接口,就能够11分简便的给用户发送邮件

在那种状态下,自行建造邮局系统或许邮件SMTP服务,就展现寸进尺退了,所以一方面各大公司邮箱服务越做越好,获得企业的承认,另一方面,国内外如SendGrid,SendCloud等第①方邮件PUSH服务商也逐年做大,他们用更规范的招数,去消除通道、白名单、信誉度等种种邮件服务难题,而客户只须求经过SMTP协议大概封装的API接口,就能够格外便利的给用户发送邮件

就本身所知,如今境内做的最好的当属天涯论坛的SendCloud,可是SendCloud发展了如此多年,也越加复杂和规范,小编觉着更适合有重型EDM要求的施用使用,作为中小企和创业者以及站长,首推依然是Ali云的邮件推送服务,一如既往秉持Ali云的特色:使用傻瓜,上手快捷,文书档案俱全,但漏洞和题材多多**不过作为AWS的追赶者,能在短期内高速达成那几个应用级作用,也究竟值得鼓励的。故而上面也依据阿里云邮件推送服务,来完毕贰个要好的邮件验证与推送系列**。

就本身所知,目前国内做的最好的当属网易的SendCloud,不过SendCloud发展了那样多年,也特别复杂和正式,笔者以为更合乎有大型EDM要求的利用使用,作为中型小型集团和创业者以及站长,首推依旧是Ali云的邮件推送服务,一如既往秉持阿里云的特征:应用傻瓜,上手火速,文书档案俱全,但漏洞和题材多多**而是作为AWS的追赶者,能在长时间内火速完毕这么些应用级成效,也终究值得鼓励的。于是下边也根据Ali云邮件推送服务,来完毕二个和好的邮件验证与推送连串**。

壹 、须要分析

一 、须求分析

做别的业务,顶层规划相当重庆大学,卓绝的宏图反复让未来的政工一箭双雕,所以在设计总体邮件验证与推送连串前,大家先看看有怎么样功能是愿意能够落到实处的

做别的工作,顶层设计丰富重庆大学,突出的安排性反复让今后的政工一石二鸟,所以在规划总体邮件验证与推送类别前,大家先看看有哪些职能是梦想能够落到实处的

  • 支持邮件发送验证码邮件经营销售推送
  • 能够通过支付在程序逻辑只怕管制界面中自行触发发送

  • 能够协理HTML的邮件内容,而HTML内容能够随时随处实行改动,方便美术工作和支出去调动

  • 验证类邮件能够补助IP总括、次数总计,能够进行时间范围、幸免恶意发送

  • 推送类邮件能够援助总结算与发放送数量、发送成功率等反馈数据。

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

  • 支持邮件发送验证码邮件经营销售推送
  • 能够透过付出在程序逻辑或然管制界面中机动触发发送

  • 可见协理HTML的邮件内容,而HTML内容能够随时四处实行修改,方便美术工作和付出去调动

  • 验证类邮件可以匡助IP计算、次数总计,能够实行时间范围、防止恶意发送

  • 推送类邮件能够帮衬总计算与发放送数量、发送成功率等报告数据。

  • 推送类邮件,用户可以退订。

本来,最要害的,验证邮件要能在5-10秒内发送成功,到达率高

自然,最关键的,验证邮件要能在5-10秒内发送成功,到达率高

贰 、功用设计

二 、效率设计

因此以上需要分析,能够一目掌握出以下一些生死攸关的规划思路

由此上述须要分析,可以肯定出以下部分至关心重视要的安排性思路

① 、需求统一筹划模板作用。通过沙盘功能来支撑HTML邮件内容以及天天可更新替换的供给,通过沙盘里的显要词参数设计,来达成验证码、用户名、营销内容的动态输入。

壹 、供给规划模板作用。通过沙盘成效来支撑HTML邮件内容以及每十三日可更新替换的须求,通过沙盘里的主要性词参数设计,来达成验证码、用户名、经营销售内容的动态输入。

二 、需求统一筹划一个验证码相关表。用来支撑邮件验证码校验、请求限制等功能。

② 、须求规划1个验证码相关表。用来支撑邮件验证码校验、请求限制等成效。

③ 、须求规划2个出殡和埋葬记录相关表。记录全体发送记录,用于总括和剖析。

三 、要求规划二个出殡和埋葬记录相关表。记录全数发送记录,用于计算和剖析。

肆 、管理后台尽量界面化管理。用户管理、邮件模板配置、发送记录查询等着力援救成效,在后台尽量以界面化达成管理。

④ 、管理后台尽量界面化管理。用户管理、邮件模板配置、发送记录查询等着力协理效果,在后台尽量以界面化完毕管理。

5、将集团邮局和邮件推送服务分开。以域名XXX.com为例,一般公司邮局部为zhangsan@XXX.com,邮件服务不宜以XXX.com为域,会和集团邮局服务互相干扰(也不是全然不容许,只是安插起来很费劲),应当扩大多少个二级域名,例如mail.XXX.com,邮件服务地点便是service@mail.XXX.com。

5、将集团邮局和邮件推送服务分开。以域名XXX.com为例,一般公司邮局地为zhangsan@XXX.com,邮件服务不宜以XXX.com为域,会和集团邮局服务互相干扰(也不是一点一滴不容许,只是计划起来很辛勤),应当扩充2个二级域名,例如mail.XXX.com,邮件服务地点就是service@mail.XXX.com

总体功用架构图如下:

完整效益架构图如下:

ca88手机版登录网页 9

ca88手机版登录网页 10

③ 、详细完结步骤

叁 、详细实现步骤

正巧手上有个网站,含有注册邮件验证成效,那就依照那一个网站的支出,一步一步的讲解一下详实的贯彻步骤

无独有偶手上有个网站,含有注册邮件验证功用,那就依据这么些网站的支付,一步一步的任课一下详尽的落到实处步骤

末尾落到实处际效果益如下:

最终促成效益如下:

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

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

合法企业邮箱域是@阿尔法ms.cn,客服邮件地址为:kefu@alphams.cn

官方公司邮箱域是@阿尔法ms.cn,客服邮件地址为:kefu@alphams.cn

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

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

具体的落到实处步骤为:

实际的兑现步骤为:

一 、注册Ali云公司邮箱免费版,完毕客服邮件地址

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

我们的公司邮局服务应用了Ali云集团邮箱免费版。(吐槽一下,竟然要转正博客园才能注册还捆绑消费6元邮件推送)

大家的公司邮局服务应用了Ali云集团邮箱免费版。(吐槽一下,竟然要转化今日头条才能注册还捆绑消费6元邮件推送)

ca88手机版登录网页 11

ca88手机版登录网页 12

ca88手机版登录网页 13

ca88手机版登录网页 14

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

付出成功后,可以在公司邮箱列表中见到

ca88手机版登录网页 15

ca88手机版登录网页 16

下边继续设置解析,能够到协助页面来看什么样设置解析

上面继续设置解析,可以到帮衬页面见到怎么着设置解析

ca88手机版登录网页 17

ca88手机版登录网页 18

前往域名解析处举办剖析设置

前往域名解析处举行分析设置

ca88手机版登录网页 19

ca88手机版登录网页 20

浅析后,集团邮箱生效,举办管理员用户密码开首化

分析后,集团邮箱生效,举行管理员用户密码先河化

ca88手机版登录网页 21

ca88手机版登录网页 22

选拔管理员账号进入
https://qiye.aliyun.com/

应用管理员账号进入
https://qiye.aliyun.com/ 

再而三设置安全难点并绑定手提式有线电电话机号

持续设置安全难题并绑定手提式有线电话机号

ca88手机版登录网页 23

ca88手机版登录网页 24

事业有成跻身后持续添加客户账号

打响进去后持续添加客户账号

ca88手机版登录网页 25

ca88手机版登录网页 26

至此,公司邮局账号添加成功,到Foxmail中开始展览登录。

迄今结束,集团邮局账号添加成功,到Foxmail中开始展览登录。

② 、配置Ali云邮件服务

贰 、配置Ali云邮件服务

率先要添加二个发信域名

先是要添加2个发信域名

ca88手机版登录网页 27

ca88手机版登录网页 28

ca88手机版登录网页 29

ca88手机版登录网页 30

此处大家也能够小心到,Ali云也提醒不要添加集团邮箱域名,那和大家事先设计中的思路同样,那里我们抬高的域名是
mail.阿尔法ms.cn

那里我们也能够小心到,阿里云也提醒不要添加集团邮箱域名,这和我们事先设计中的思路同样,这里大家抬高的域名是
mail.阿尔法ms.cn

然后Ali云提醒须求铺排部分分析音讯,从而生效域名

然后Ali云提醒须求安顿部分分析音讯,从而生效域名

ca88手机版登录网页 31

ca88手机版登录网页 32

下前边往Ali云的域名解析中实行安装

下前边往Ali云的域名解析中展开安装

ca88手机版登录网页 33

ca88手机版登录网页 34

安装好了随后回到刚才的页面举行表明

设置好驾驭后回到刚才的页面进行验证

ca88手机版登录网页 35

ca88手机版登录网页 36

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

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

ca88手机版登录网页 37

ca88手机版登录网页 38

上边继续添加发信地址

下边继续添加发信地址

ca88手机版登录网页 39

ca88手机版登录网页 40

ca88手机版登录网页 41

ca88手机版登录网页 42

那里我们能够看到,发信账号如小编辈前边所说,是service@mail.阿尔法ms.cn

此间大家得以见见,发信账号如我们事先所说,是service@mail.alphams.cn

寄信类型采用了批量邮件(那里有个难题,在实地衡量中发觉,Ali云这么些推送服务有接触邮件和批量邮件,触发邮件类型偶尔会发不出去或许收受不到,不明白原因是怎么着,有尖锐研讨的人致谢告知本身弹指间)

寄信类型选拔了批量邮件(那里有个难题,在实测中窥见,Ali云那么些推送服务有接触邮件和批量邮件,触发邮件类型偶尔会发不出去或许接到不到,不明白原因是什么样,有深入钻研的人致谢告知自个儿眨眼间间)

ca88手机版登录网页 43

ca88手机版登录网页 44

那时回信地址还未经过认证,大家点击验证回信地址,然后前往此前申请的QQ集团邮箱中,来验证

那会儿回信地址还未通过验证,大家点击验证回信地址,然后前往以前申请的QQ集团邮箱中,来注明

ca88手机版登录网页 45

ca88手机版登录网页 46

诸如此类就开始展览了证实

那般就实行了印证

ca88手机版登录网页 47

ca88手机版登录网页 48

此时还亟需安装一下SMTP密码,大家设置为XXX

那儿还亟需设置一下SMTP密码,大家设置为XXX

ca88手机版登录网页 49

ca88手机版登录网页 50

ca88手机版登录网页 51

ca88手机版登录网页 52

此处尤其要求注意的是Ali云的官方认证

此地特别需求专注的是Ali云的官方认证

ca88手机版登录网页 53

ca88手机版登录网页 54

寄信域名在创建在此以前要致密,因为不可能给删除和改动。

寄信域名在开立以前要细心,因为无法给删除和修改。

如此,Ali云邮件服务的布置就马到成功了。

诸如此类,Ali云邮件服务的铺排就做到了。

SMTP服务地方为:smtpdm.aliyun.com,SMTP账号正是service@mail.阿尔法ms.cn,密码就是刚刚设置的密码

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

到这一步截至,已经能够为许多站长网站的邮件服务提供支撑了,在有些CMS里面平昔配备入SMTP音信即可使用

到这一步截至,已经足以为无数站长网站的邮件服务提供支持了,在有个别CMS里面平素配备入SMTP音信即可使用

可是,网站和选拔多数都以单身开发,大家更供给规划协调的邮件发送和成效处理种类,因而上面大家接二连三

而是,网站和运用多数都是单独开发,大家更亟待规划协调的邮件发送和功力处理系统,由此上边我们后续

三 、用户注册页面包车型地铁准备工作

三 、用户注册页面包车型客车准备工作

切切实实的页面编码和程序逻辑因为非明天所讲重点,所以那里大约若干字以及若干代码,把重点的步调列出来,源码可邮件找小编要:

实际的页面编码和程序逻辑因为非后天所讲重点,所以那边差不离若干字以及若干代码,把重点的步子列出来,源码可邮件找作者要:

出于要加入邮件地址的验证,所以先对登记页面包车型地铁完全流程展开规划,逻辑图如下:

出于要参加邮件地址的求证,所以先对注册页面包车型大巴欧洲经济共同体流程展开统筹,逻辑图如下:

ca88手机版登录网页 55

ca88手机版登录网页 56

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

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

注册会话表结构如下:

注册会话表结构如下:

ca88手机版登录网页 57

ca88手机版登录网页 58

一时验证成功的邮件地址,存入会话表,并向客户端反回多少个会话编号,最后形成注册时,需求用户名密码连同这一个会话编号一起传入后台验证注册

权且验证成功的邮件地址,存入会话表,并向客户端反回1个对话编号,最后成功注册时,必要用户名密码连同那几个会话编号一起传入后台验证注册

接下去正是邮件验证表的设计

接下去就是邮件验证表的布署性

其一表既要能支撑没有用户意况的求证,例如挂号认证,又要能帮助用户运转时的证实,例如修改密码验证等。

其一表既要能支撑没有用户景况的求证,例如挂号认证,又要能接济用户运维时的表达,例如修改密码验证等。

表结构如下:

表结构如下:

ca88手机版登录网页 59

ca88手机版登录网页 60

中间渠道为现实的利用情状,状态和过期时间三个字段用来再一次控制有效性,预留的八个参数,用于存款和储蓄用户编号、注册会话编号等额外的数量

内部渠道为现实的运用处境,状态和过期时间五个字段用来重新控制有效性,预留的多少个参数,用于存储用户编号、注册会话编号等额外的多少

理所当然,也不可或缺用户表,因为那里并没有啥特殊的用户场景,所以用户表较为简便,结构如下:

理所当然,也不可或缺用户表,因为那里并没有怎么新鲜的用户场景,所以用户表较为简便,结构如下:

ca88手机版登录网页 61

ca88手机版登录网页 62

④ 、邮件模板的设计

④ 、邮件模板的安插

接下去就进去具体的支付,在支付中,肯定会用到对邮件的出殡和埋葬,在我们那几个设计的系列之中,最上边也说了,须要规划模板机制,那么大家就先规划邮件模板功能

接下去就进去具体的开销,在开发中,肯定会用到对邮件的出殡,在大家那些企划的种类之中,最下边也说了,要求规划模板机制,那么大家就先规划邮件模板功能

实际的成效架构为:

切实的效益架构为:

ca88手机版登录网页 63

ca88手机版登录网页 64

style=”color: #9b00d3; font-family: 微软雅黑; font-size: medium;”>此间设计了最简便易行的沙盘作用,首要思路即数据仓库储存款和储蓄HTML模板内容,参数直接放入HTML代码中,在支付时进行轮换

style=”color: #9b00d3; font-family: 微软雅黑; font-size: medium;”>此地设计了最不难易行的沙盘功效,主要思路即数据仓库储存款和储蓄HTML模板内容,参数直接放入HTML代码中,在支付时进行轮换

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

下边是邮件模板表的筹划,表结构如下:

ca88手机版登录网页 65

ca88手机版登录网页 66

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

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

先创设三个用于新用户注册的HTML模板

先构建二个用以新用户注册的HTML模板

ca88手机版登录网页 67

ca88手机版登录网页 68

接下来在管理界面添加消息和HTML代码

接下来在治本界面添加音信和HTML代码

ca88手机版登录网页 69

ca88手机版登录网页 70

下一场添加事业有成

然后添加事业有成

ca88手机版登录网页 71

ca88手机版登录网页 72

⑤ 、邮件发送的技能准备

伍 、邮件发送的技艺准备

经过Ali云的技巧文书档案能够通晓,Ali云邮件服务的调用情势有三种

经过Ali云的技能文书档案能够清楚,Ali云邮件服务的调用方式有二种

ca88手机版登录网页 73

ca88手机版登录网页 74

原来准备利用API接口进行包装,但是近日太忙了,所以先采纳STMP接口格局实行了一遍封装,首要代码如下:

原先准备利用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>
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="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    {        MyResponse.SetResult(-1, "邮件已经存在");        return MyResponse;    }    else    {        //再检查和最近一次的发送是否已经超过1分钟了        DateTime CheckDateTime = DateTime.Now.AddMinutes;//增加4分钟        var VerifyCreateCheckQuery = CheckQueryDataContexter.ams_email_verify_table.Where(e => e.AEVT_EMAILADDRESS == _Request.EMailAddress && e.AEVT_EXPIRETIME >= CheckDateTime);        if (VerifyCreateCheckQuery.Count        {            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秒,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                            {                                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="_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    {        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分钟            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;    }}

重点代码如下:

捌 、前端注册页面包车型大巴贯彻

/// <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("重新获取;                            var T = 60;//倒计时60秒                            PageControl.GetVerifyCodeTimeLeft = setInterval(function () {                                T = T - 1;                                if  {                                    //结束倒计时                                    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;                                });                                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 ;    }}

捌 、前端注册页面包车型地铁完毕

下边来看一下说到底邮件验证的作用

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

    }
}

输入邮件地址

上面来看一下尾声邮件验证的成效

ca88手机版登录网页 75

输入邮件地址

获取验证码

 

ca88手机版登录网页 76

ca88手机版登录网页 77

收起邮件

获得验证码

ca88手机版登录网页 78

ca88手机版登录网页 79

表达成功,继续填写用户消息

收取邮件

ca88手机版登录网页 80

ca88手机版登录网页 81

ca88手机版登录网页 82

注脚成功,继续填写用户消息

挂号成功

ca88手机版登录网页 83

ca88手机版登录网页 84

ca88手机版登录网页 85

四 、总括与思考

挂号成功

由此,我们就接纳Ali云邮件推送,完结了整机的邮件验证与推送体系的架构(主动推送、数据总计等尚未写出来,不过在代码里面有,有须求代码的能够邮件向本身索要),一句话总计正是之类:

ca88手机版登录网页 86

style=”color: #ff0000; font-family: 微软雅黑; font-size: medium;”>小编想,互连网再怎么发展,QQ号能够没有,微信也说不定衰落,但邮件没有的可能性十分低,作为一种工作办法和服务章程,在可预感的前程内,邮件系统一定会陪伴着消息体系的发展而更上一层楼,而从技术的角度出发,对邮件技术和服务的中肯钻探与思考,一定能够带动尤其突出的软件系统和利用。由此,建议每二个网络创业者和采纳,都能够注重对邮件数量的搜集和拍卖,也在邮件服务上多花点精力和金钱,带给用户更好的经验。

四 、总括与沉思


因此,我们就使用Ali云邮件推送,达成了完全的邮件验证与推送连串的架构(主动推送、数据总计等没有写出来,可是在代码里面有,有亟待代码的能够邮件向自己索要),一句话总计正是之类:

作者:张柔,揭橥于
和讯 与 初码博客

style=”color: #ff0000; font-family: 微软雅黑; font-size: medium;”>作者想,网络再怎么进步,QQ号能够没有,微信也说不定衰落,但邮件没有的恐怕性十分低,作为一种工作章程和服务章程,在可预言的前景内,邮件系统一定会陪伴着音讯体系的上进而上扬,而从技术的角度出发,对邮件技术和服务的深刻钻研与思维,一定能够推动更为雅观的软件系统和动用。由此,提议每几个网络创业者和接纳,都能够尊重对邮件数量的搜集和拍卖,也在邮件服务上多花点精力和金钱,带给用户更好的经验。

转发请评释出处,欢迎邮件调换:zhangrou@printhelloworld.com,或许加QQ群:11444444


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

转发请注明出处,欢迎邮件交换:zhangrou@printhelloworld.com,或者加QQ群:11444444

相关文章

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图