4、邮件模板的设计
接下来就进入具体的开发,在开发中,肯定会用到对邮件的发送,在我们这个设计的体系里面,最上面也说了,需要设计模板机制,那么我们就先设计邮件模板功能
具体的功能架构为:
引用这里设计了最简单的模板功能,主要思路即数据库存储HTML模板内容,参数直接放入HTML代码中,在开发时进行替换
下面是邮件模板表的设计,表结构如下:
在后端对模板进行增删改查管理,省略代码若干,最终效果如下:先构建一个用于新用户注册的HTML模板
然后在管理界面添加信息和HTML代码
然后添加成功
5、邮件发送的技术准备通过阿里云的技术文档可以知道,阿里云邮件服务的调用方式有三种
原本准备使用API接口进行封装,但是最近太忙了,所以先使用STMP接口方式进行了一次封装,主要代码如下:
实体:
- ///
- /// 邮件直推请求
- ///
- public class AliyunEMailDirectPushRequest
- {
- ///
- /// 目标邮件地址列表
- ///
- public Dictionary<String, String> AimAddressList { get; set; }
- ///
- /// 来源邮件地址
- ///
- public KeyValuePair<String, String> FromAddress { get; set; }
- ///
- /// 回复邮件地址列表
- ///
- public Dictionary<String, String> ReplyAddressList { get; set; }
- ///
- /// 邮件标题
- ///
- public String Subject { get; set; }
- ///
- /// 邮件文本
- ///
- public String Text { get; set; }
- ///
- /// 邮件HTML
- ///
- public String HTML { get; set; }
- ///
- /// 类型
- ///
- public Int32 Type { get; set; }
- ///
- /// SMTP用户名
- ///
- public String SMTPUserName { get; set; }
- ///
- /// SMTP密码
- ///
- public String SMTPPassword { get; set; }
- }
- ///
- /// 邮件直推响应
- ///
- public class AliyunEMailDirectPushResponse
- {
- ///
- /// 推送结果
- ///
- public Int32 Result { get; set; }
- ///
- /// 推送结果消息
- ///
- public String ResultMessage { get; set; }
- }
发送业务代码:
- ///
- /// 邮件直接推送
- ///
- ///
- ///
- public static AliyunEMailDirectPushResponse EMailDirectPush(AliyunEMailDirectPushRequest _Request)
- {
- AliyunEMailDirectPushResponse MyReturn = new AliyunEMailDirectPushResponse();
- MailMessage MyMailMessage = new MailMessage();
- //填充目标邮件地址
- foreach (var e in _Request.AimAddressList)
- {
- MyMailMessage.To.Add(new MailAddress(e.Key, e.Value));
- }
- //填充来源邮件地址
- MyMailMessage.From = new MailAddress(_Request.FromAddress.Key, _Request.FromAddress.Value);
- //填充回复邮件地址
- foreach (var e in _Request.ReplyAddressList)
- {
- MyMailMessage.ReplyToList.Add(new MailAddress(e.Key, e.Value));
- }
- // 邮件主题
- MyMailMessage.Subject = _Request.Subject;
- // 邮件正文内容
- String Text = _Request.Text;
- String HTML = _Request.HTML;
- if (_Request.Type == 1)
- {
- //文本发送方式
- MyMailMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(Text, null, MediaTypeNames.Text.Plain));
- }
- if (_Request.Type == 2)
- {
- //HTML发送方式
- MyMailMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(HTML, null, MediaTypeNames.Text.Html));
- }
- //邮件推送的SMTP地址和端口
- SmtpClient MySmtpClient = new SmtpClient(“smtpdm.aliyun.com”, 25);
- // 使用SMTP用户名和密码进行验证
- System.Net.NetworkCredential MyNetworkCredential = new System.Net.NetworkCredential(_Request.SMTPUserName, _Request.SMTPPassword);
- MySmtpClient.Credentials = MyNetworkCredential;
- MySmtpClient.Timeout = 5000;//设置5秒超时
- try
- {
- MySmtpClient.Send(MyMailMessage);
- MyReturn.Result = 1;
- MyReturn.ResultMessage = “发送成功”;
- return MyReturn;
- }
- catch (Exception e)
- {
- MyReturn.Result = -1;
- MyReturn.ResultMessage = e.Message;
- return MyReturn;
- }
- }
6、邮件验证码生成与发送的实现主要代码如下:
- ///
- /// 创建注册邮件验证
- ///
- ///
- ///
- private DWebAccountCreateRegisterEMailVerifyResponse CreateRegisterEMailVerify(DWebAccountCreateRegisterEMailVerifyRequest _Request, HttpRequestMessage _HttpRequest)
- {
- DWebAccountCreateRegisterEMailVerifyResponse MyResponse = new DWebAccountCreateRegisterEMailVerifyResponse();
- DWebMySQLDataContexter CheckQueryDataContexter = CreateNewDataContexter();
- //首先检查是否存在邮件
- var UserCheckQuery = CheckQueryDataContexter.ams_user_table.Where(e => e.AUT_EMAILADDRESS == _Request.EMailAddress);
- if (UserCheckQuery.Count() > 0)
- {
- MyResponse.SetResult(-1, “邮件已经存在”);
- return MyResponse;
- }
- else
- {
- //再检查和最近一次的发送是否已经超过1分钟了
- DateTime CheckDateTime = DateTime.Now.AddMinutes(4);//增加4分钟
- var VerifyCreateCheckQuery = CheckQueryDataContexter.ams_email_verify_table.Where(e => e.AEVT_EMAILADDRESS == _Request.EMailAddress && e.AEVT_EXPIRETIME >= CheckDateTime);
- if (VerifyCreateCheckQuery.Count() > 0)
- {
- MyResponse.SetResult(-2, “一分钟内只能发送一次邮件,请稍后再试!”);
- return MyResponse;
- }
- else
- {
- //将之前发送的验证码全部失效
- DWebMySQLDataContexter UpdateQueryDataContexter = CreateNewDataContexter();
- var EMailVerifyClearUpdateQuery = UpdateQueryDataContexter.ams_email_verify_table.Where(e => e.AEVT_EMAILADDRESS == _Request.EMailAddress);
- var RegisterSessionClearUpdateQuery = UpdateQueryDataContexter.ams_register_session_table.Where(e => e.ARST_EMAILADDRESS == _Request.EMailAddress);
- foreach (var e in EMailVerifyClearUpdateQuery)
- {
- e.AEVT_STATE = -1;//表示失效
- }
- foreach (var e in RegisterSessionClearUpdateQuery)
- {
- e.ARST_STATE = -1;//表示失效
- }
- try
- {
- UpdateQueryDataContexter.SaveChanges();
- //下面发起一个新的验证
- DWebMySQLDataContexter NewTableDataContexter = CreateNewDataContexter();
- //生成验证码
- Random MyRandom = new Random();
- String VerifyCode = MyRandom.Next(1000, 10000).ToString();//获得一个4位随机码
- DateTime NowDateTime = DateTime.Now;
- ams_email_verify_table TempEMailVerifyTable = new ams_email_verify_table();
- TempEMailVerifyTable.AEVT_ID = BLHelper.NewGuid();
- TempEMailVerifyTable.AEVT_CHANNEL = 1;//表示注册验证
- TempEMailVerifyTable.AEVT_CHANNELDESCRIPTION = “注册验证”;
- TempEMailVerifyTable.AEVT_CREATETIME = NowDateTime;
- TempEMailVerifyTable.AEVT_EXPIRETIME = NowDateTime.AddSeconds(300);//有效期300秒,5分钟
- TempEMailVerifyTable.AEVT_EMAILADDRESS = _Request.EMailAddress;
- TempEMailVerifyTable.AEVT_PARAMETER1 = “”;//参数暂时为空
- TempEMailVerifyTable.AEVT_PARAMETER2 = “”;//参数暂时为空
- TempEMailVerifyTable.AEVT_REQUESTIPNUMBERADDRESS = _HttpRequest.GetClientIPAddress().StringIPToNumberIP();//获得IP地址
- TempEMailVerifyTable.AEVT_STATE = 1;//刚刚创建
- TempEMailVerifyTable.AEVT_VERIFYCODE = VerifyCode;
- TempEMailVerifyTable.AEVT_VERIFYTYPE = 1;//默认类型为1
- //插入数据库
- NewTableDataContexter.ams_email_verify_table.Add(TempEMailVerifyTable);
- try
- {
- //保存
- NewTableDataContexter.SaveChanges();
- //下面就开启一个多线程发送邮件,然后返回获取成功,这里这样写不妥,但是为了用户体验,立即返回发送成功,就暂且相信阿里云的到达率吧
- //下面在线程中发送邮件
- Task TempTask;
- TempTask = Task.Factory.StartNew(() =>
- {
- try
- {
- //下面继续用阿里云邮件推送发送邮件
- //先读取邮件验证模板
- String TaskVerifyCode = VerifyCode;
- DWebMySQLDataContexter EMailTemplateDataContexter = CreateNewDataContexter();
- String EMailTemplateUniqueIdentity = “NewRegisterVerify”;
- var EMailTemplateQuery = EMailTemplateDataContexter.ams_email_template_table.Where(e => e.AETT_UNIQUEIDENTITY == EMailTemplateUniqueIdentity).ToList();
- if (EMailTemplateQuery.Count() > 0)
- {
- AliyunEMailDirectPushRequest MyRequest = new AliyunEMailDirectPushRequest();
- //目标地址
- MyRequest.AimAddressList = new Dictionary<String, String>();
- MyRequest.AimAddressList.Add(_Request.EMailAddress, “AlphaMS门户注册邮箱【” _Request.EMailAddress “】”);
- //来源地址
- MyRequest.FromAddress = new KeyValuePair<String, String>(“service@mail.alphams.cn”, “AlphaMS门户邮件服务”);
- //回复地址
- MyRequest.ReplyAddressList = new Dictionary<String, String>();
- MyRequest.ReplyAddressList.Add(“kefu@alphams.cn”, “AlphaMS门户客服”);
- String EMailHTML = EMailTemplateQuery.FirstOrDefault().AETT_CONTENT;
- EMailHTML = EMailHTML.Replace(“##EMailAddress##”, _Request.EMailAddress);
- EMailHTML = EMailHTML.Replace(“##VerifyCode##”, TaskVerifyCode);
- MyRequest.HTML = EMailHTML;
- MyRequest.Subject = “AlphaMS门户用户注册邮件验证”;
- MyRequest.Type = 2;//HTML方式发送邮件
- MyRequest.SMTPUserName = “service@mail.alphams.cn”;
- MyRequest.SMTPPassword = “XXXXXX”;
- //下面发送
- AliyunEMailDirectPushResponse TempAliyunEMailDirectPushResponse = AliyunControl.EMailDirectPush(MyRequest);
- }
- else
- {
- //模板不存在,也不报错
- }
- }
- catch (Exception)
- {
- //在线程中不报错
- }
- });
- MyResponse.SetResult(1, “发送成功”);
- return MyResponse;
- }
- catch (Exception NewTableSaveException)
- {
- return (DWebAccountCreateRegisterEMailVerifyResponse)SetExceptionError(MyResponse, NewTableSaveException, -5, “数据库错误”);
- }
- }
- catch (Exception UpdateStateSaveException)
- {
- return (DWebAccountCreateRegisterEMailVerifyResponse)SetExceptionError(MyResponse, UpdateStateSaveException, -5, “数据库错误”);
- }
- }
- }
- }
7、验证码验证逻辑的实现
主要代码如下:
- ///
- /// 检查注册邮件验证码
- ///
- ///
- ///
- private DWebAccountCheckRegisterEMailVerifyCodeResponse CheckRegisterEMailVerifyCode(DWebAccountCheckRegisterEMailVerifyCodeRequest _Request, HttpRequestMessage _HttpRequest)
- {
- DWebAccountCheckRegisterEMailVerifyCodeResponse MyResponse = new DWebAccountCheckRegisterEMailVerifyCodeResponse();
- //先检查是否有验证记录
- DWebMySQLDataContexter CheckQueryDataContexter = CreateNewDataContexter();
- DateTime NowDateTime = DateTime.Now;
- var CheckQuery = CheckQueryDataContexter.ams_email_verify_table.Where(e => e.AEVT_EMAILADDRESS == _Request.EMailAddress && e.AEVT_STATE == 1 && e.AEVT_EXPIRETIME >= NowDateTime);
- if (CheckQuery.Count() > 0)
- {
- String VerifyCode = CheckQuery.FirstOrDefault().AEVT_VERIFYCODE;
- if (VerifyCode == _Request.VerifyCode)
- {
- //验证成功,设置这个验证失效
- CheckQuery.FirstOrDefault().AEVT_STATE = -1;//设置失效
- //所有的注册会话先失效
- DWebMySQLDataContexter UpdateClearDataContexter = CreateNewDataContexter();
- var ClearQuery = UpdateClearDataContexter.ams_register_session_table.Where(e => e.ARST_EMAILADDRESS == _Request.EMailAddress);
- foreach (var e in ClearQuery)
- {
- e.ARST_STATE = -1;//全部失效
- }
- //下面就要新建一个注册会话
- DWebMySQLDataContexter NewTableDataContexter = CreateNewDataContexter();
- ams_register_session_table TempRegisterSessionTable = new ams_register_session_table();
- TempRegisterSessionTable.ARST_ID = BLHelper.NewGuid();
- CheckQuery.FirstOrDefault().AEVT_PARAMETER1 = TempRegisterSessionTable.ARST_ID;//和邮件验证建立起关联
- TempRegisterSessionTable.ARST_CREATETIME = NowDateTime;
- TempRegisterSessionTable.ARST_CLIENTIPNUMBERADDRESS = _HttpRequest.GetClientIPAddress().StringIPToNumberIP();
- TempRegisterSessionTable.ARST_EMAILADDRESS = _Request.EMailAddress;
- TempRegisterSessionTable.ARST_EXPIRETIME = NowDateTime.AddMinutes(10);//这个会话的有效期是10分钟
- TempRegisterSessionTable.ARST_STATE = 1;//刚刚创建
- NewTableDataContexter.ams_register_session_table.Add(TempRegisterSessionTable);
- try
- {
- CheckQueryDataContexter.SaveChanges();
- NewTableDataContexter.SaveChanges();
- UpdateClearDataContexter.SaveChanges();
- MyResponse.RegisterSessionID = TempRegisterSessionTable.ARST_ID;
- MyResponse.SetResult(1, “验证成功”);
- return MyResponse;
- }
- catch (Exception DataSaveException)
- {
- return (DWebAccountCheckRegisterEMailVerifyCodeResponse)SetExceptionError(MyResponse, DataSaveException, -5, “数据库错误”);
- }
- }
- else
- {
- MyResponse.SetResult(-2, “验证码错误”);
- return MyResponse;
- }
- }
- else
- {
- MyResponse.SetResult(-1, “已经过期,请重新获取验证码!”);
- return MyResponse;
- }
- }
8、前端注册页面的实现
- //页面控制器
- var PageControl = {
- //注册初始化
- RegisterInit: function () {
- PageControl.NewRegisterSessionID = “”;//重新清空会话编号
- PageControl.EMailVerifyInit();
- },
- //邮件验证初始化
- EMailVerifyInit: function () {
- clearInterval(PageControl.GetVerifyCodeTimeLeft);
- $(“#AR_Register_EMailVerify_Container”).show();
- $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).val(“”);
- $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).removeAttr(“readonly”);
- $(“#AR_Register_EMailVerify_GetVerifyCode_Button”).removeAttr(“disabled”);
- $(“#AR_Register_EMailVerify_GetVerifyCode_Button”).val(“获取验证码”);
- $(“#AR_Register_EMailVerify_Verify_Container”).hide();
- $(“#AR_Register_EMailVerify_Verify_Code_TextBox”).val(“”);
- $(“#AR_Register_UserInfo_Container”).hide();
- },
- //获取验证码时间结束
- GetVerifyCodeTimeLeft: null,
- //创建邮件验证
- CreateEMailVerify: function () {
- //先隐藏起来
- $(“#AR_Register_EMailVerify_Verify_Container”).hide();
- //检查邮件地址输入
- if ($(“#AR_Register_EMailVerify_EMailAddress_TextBox”).val() == “”) {
- AlphaMS.JSToolkit.Dialog.MessageBox(“请输入邮件地址”, function () {
- $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).focus();
- });
- return;
- }
- //检查邮件地址输入
- if (!AlphaMS.JSToolkit.Valid.CheckMail($(“#AR_Register_EMailVerify_EMailAddress_TextBox”).val())) {
- AlphaMS.JSToolkit.Dialog.MessageBox(“请输入正确的邮件地址”, function () {
- $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).focus();
- });
- return;
- }
- //AlphaMS业务逻辑请求
- AlphaMS.JSToolkit.NET.BLRequest({
- Debug: false,
- //业务逻辑方法路由名称
- FunctionRouteName: “AlphaMS.Portal.DWeb.Account.CreateRegisterEMailVerify”,
- //业务逻辑请求数据
- BLRequestObject: {
- //请求参数
- //邮件地址
- EMailAddress: $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).val()
- },
- //SBS请求返回
- BLResponse: {
- //请求成功
- Success: function (MyResponseObject) {
- switch (MyResponseObject.ResultCode) {
- case 1:
- //注册成功
- AlphaMS.JSToolkit.Dialog.MessageBox(“验证码获取成功,有效期5分钟,请到邮箱中查收验证码并填入下面框中”, function () {
- $(“#AR_Register_EMailVerify_Verify_Code_TextBox”).focus();
- });
- $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).attr(“readonly”, “readonly”);
- $(“#AR_Register_EMailVerify_GetVerifyCode_Button”).attr(“disabled”, “disabled”);
- $(“#AR_Register_EMailVerify_GetVerifyCode_Button”).html(“重新获取(剩余60秒)”);
- var T = 60;//倒计时60秒
- PageControl.GetVerifyCodeTimeLeft = setInterval(function () {
- T = T – 1;
- if (T == 0) {
- //结束倒计时
- clearInterval(PageControl.GetVerifyCodeTimeLeft);
- $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).removeAttr(“readonly”);
- $(“#AR_Register_EMailVerify_GetVerifyCode_Button”).removeAttr(“disabled”);
- $(“#AR_Register_EMailVerify_GetVerifyCode_Button”).html(“获取验证码”);
- } else {
- $(“#AR_Register_EMailVerify_GetVerifyCode_Button”).html(“重新获取(剩余” T “秒)”);
- }
- }, 1000);
- $(“#AR_Register_EMailVerify_Verify_Container”).show();
- break;
- case -1:
- AlphaMS.JSToolkit.Dialog.MessageBox(“邮件已经被其他用户使用,请换一个”, function () {
- $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).focus();
- });
- break;
- default:
- AlphaMS.JSToolkit.Dialog.MessageBox(MyResponseObject.ResultMessage);
- break;
- }
- }
- }
- }, [“Body”]);
- },
- //新注册会话编号
- NewRegisterSessionID: “”,
- //检查邮件验证码
- CheckEMailVerifyCode: function () {
- //检查验证码输入
- if ($(“#AR_Register_EMailVerify_Verify_Code_TextBox”).val() == “”) {
- AlphaMS.JSToolkit.Dialog.MessageBox(“请输入收到的验证码”, function () {
- $(“#AR_Register_EMailVerify_Verify_Code_TextBox”).focus();
- });
- return;
- }
- //AlphaMS业务逻辑请求
- AlphaMS.JSToolkit.NET.BLRequest({
- Debug: false,
- //业务逻辑方法路由名称
- FunctionRouteName: “AlphaMS.Portal.DWeb.Account.CheckRegisterEMailVerifyCode”,
- //业务逻辑请求数据
- BLRequestObject: {
- //请求参数
- //邮件地址
- EMailAddress: $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).val(),
- //验证码
- VerifyCode: $(“#AR_Register_EMailVerify_Verify_Code_TextBox”).val()
- },
- //SBS请求返回
- BLResponse: {
- //请求成功
- Success: function (MyResponseObject) {
- switch (MyResponseObject.ResultCode) {
- case 1:
- PageControl.NewRegisterSessionID = MyResponseObject.RegisterSessionID;
- $(“#AR_Register_EMailVerify_Container”).hide();
- $(“#AR_Register_UserInfo_Container”).show();
- $(“#AR_Register_EMail_TextBox”).val($(“#AR_Register_EMailVerify_EMailAddress_TextBox”).val());
- break;
- case -1:
- AlphaMS.JSToolkit.Dialog.MessageBox(“验证码过期,请重新获取!”, function () {
- //初始化邮件验证
- PageControl.EMailVerifyInit();
- });
- break;
- case -2:
- AlphaMS.JSToolkit.Dialog.MessageBox(“验证码错误,请重新输入”, function () {
- $(“#AR_Register_EMailVerify_Verify_Code_TextBox”).focus();
- });
- break;
- default:
- AlphaMS.JSToolkit.Dialog.MessageBox(MyResponseObject.ResultMessage);
- break;
- }
- }
- }
- }, [“Body”]);
- },
- //提交注册
- SubmitRegister: function () {
- //检查用户名输入
- if ($(“#AR_Register_UserName_TextBox”).val() == “”) {
- AlphaMS.JSToolkit.Dialog.MessageBox(“请输入用户名”, function () {
- $(“#AR_Register_UserName_TextBox”).focus();
- });
- return;
- }
- //检查密码输入
- if ($(“#AR_Register_Password_TextBox”).val() == “”) {
- AlphaMS.JSToolkit.Dialog.MessageBox(“请输入密码”, function () {
- $(“#AR_Register_Password_TextBox”).focus();
- });
- return;
- }
- var PreRegisterString = “您的注册信息如下:”;
- PreRegisterString = PreRegisterString “邮件地址:” $(“#AR_Register_EMailVerify_EMailAddress_TextBox”).val() “”;
- PreRegisterString = PreRegisterString “用户名:” $(“#AR_Register_UserName_TextBox”).val() “”;
- PreRegisterString = PreRegisterString “密码:” $(“#AR_Register_Password_TextBox”).val() “”;
- PreRegisterString = PreRegisterString “确认注册吗?”;
- AlphaMS.JSToolkit.Dialog.MessageBox(PreRegisterString, function () {
- //AlphaMS业务逻辑请求
- AlphaMS.JSToolkit.NET.BLRequest({
- Debug: false,
- //业务逻辑方法路由名称
- FunctionRouteName: “AlphaMS.Portal.DWeb.Account.NewRegister”,
- //业务逻辑请求数据
- BLRequestObject: {
- //请求参数
- //用户名
- UserName: $(“#AR_Register_UserName_TextBox”).val(),
- //密码
- Password: $(“#AR_Register_Password_TextBox”).val(),
- //注册会话编号
- RegisterSessionID: PageControl.NewRegisterSessionID
- },
- //SBS请求返回
- BLResponse: {
- //请求成功
- Success: function (MyResponseObject) {
- switch (MyResponseObject.ResultCode) {
- case 1:
- //注册成功
- AlphaMS.JSToolkit.Dialog.MessageBox(“注册成功,请前往登录”, function () {
- AlphaMS.JSToolkit.Action.GoToPage(“/Login”);
- });
- break;
- case -1:
- AlphaMS.JSToolkit.Dialog.MessageBox(“注册已经过期,请重新验证邮件地址!”, function () {
- PageControl.RegisterInit();
- });
- break;
- case -2:
- AlphaMS.JSToolkit.Dialog.MessageBox(“邮件地址已经存在!”, function () {
- PageControl.RegisterInit();
- });
- break;
- case -3:
- AlphaMS.JSToolkit.Dialog.MessageBox(“用户名已经存在,请重新输入!”, function () {
- $(“#AR_Register_UserName_TextBox”).focus();
- });
- break;
- default:
- AlphaMS.JSToolkit.Dialog.MessageBox(MyResponseObject.ResultMessage);
- break;
- }
- }
- }
- }, [“Body”]);
- }, function () { });
- }
- }
下面来看一下最终邮件验证的效果
输入邮件地址
获取验证码
收到邮件
验证成功,继续填写用户信息
注册成功
四、总结与思考
就此,我们就使用阿里云邮件推送,完成了完整的邮件验证与推送体系的架设(主动推送、数据统计等没有写出来,但是在代码里面有,有需要代码的可以邮件向我索要),一句话总结就是如下:
引用我想,互联网再怎么发展,QQ号可以没有,微信也可能衰落,但邮件没有的可能性很低,作为一种工作方式和服务方式,在可预见的未来内,邮件体系一定会伴随着信息系统的发展而发展,而从技术的角度出发,对邮件技术和服务的深入研究与思考,一定能够带来更加优秀的软件系统和应用。因此,建议每一个互联网创业者和应用,都能够重视对邮件数据的收集和处理,也在邮件服务上多花点精力和金钱,带给用户更好的体验。