邮件发送系统设计——忘记密码发送邮件的设计(1)
来源:互联网 发布:linux退出for循环 编辑:程序博客网 时间:2024/06/07 21:58
在项目中,经常会有一个忘记密码,找回密码的功能
简单的流程是这样子的:
(1) 用户单击忘记密码超链接,然后进入忘记密码独立页面(ForgetPassword)
(2) 在ForgetPassword页面中,提示用户输入绑定的邮箱,然后单击发送邮件
(3) 用户在邮箱中找到这封邮件,邮件中提示用户单击超链接跳转到更新密码页面(UpdatePassword)
(4) 在UpdatePassword页面中,用户输入新密码,然后确定密码修改成功
那么,具体程序中应该怎么实现呢?应该注意什么问题呢?
(1) 当用户输入邮箱,单击发送邮件的时候,执行如下流程程序:
1.首先根据邮箱名称获取用户信息.
Var staff=_staffService.getEntityByLoginName(email);
2.根据获得的用户信息初始化EmailTags(邮件标签)类
EmailTags = new EmailTags().InitEmailTags(staff.MerchantInfo);
邮件标签EmailTag类中包含有邮件内容的各个部分。代码如下所示:
public class EmailTags { public EmailTags() { } /// <summary> /// 商户名称 /// </summary> [DisplayName("商户名称")] public string MerchantName { get; set; } [DisplayName("邮箱")] public string Email { get; set; } [DisplayName("用户名")] public string UserName { get; set; } [DisplayName("找回密码连接")] public string ForgetPasswordLink { get; set; } [DisplayName("有效期")] public int Expires { get; set; } /// <summary> /// 根据商户信息初始化邮件标签 /// </summary> /// <param name="merchant"></param> /// <returns></returns> public EmailTags InitEmailTags(MerchantInfo merchant) { var emailTags = new EmailTags() { Email = merchant.Email, MerchantName = merchant.SupplierName, UserName = merchant.Staff.LoginName }; return emailTags; } }
3.随机生成10位数字和字符混合的随机字符串dynamicCode,并获取生成的时间dynamicTime,并赋值给Staff保存(因此在用户表中需要添加保存DynamicCode和和DynamicTime的字段,DynamicTime用于邮件的失效验证,DynamicCode用于邮件的加密验证)
string dynamicCode =RandomUtil.GenerateCheckCode(10);
staff.DynamicCode = dynamicCode;
staff.DynamicTime = DateTime.Now;
4.将用户Id,用户名,用户手机以及动态码进行MD5加密,生成code
string code =SignUtil.DoubleMD5Sign(staff.Id + "_" + staff.LoginName +"_" + staff.TelePhone, dynamicCode);
MD5签名如下:/// <summary> /// MD5签名 /// </summary> /// <param name="value"></param> /// <returns></returns> public static string MD5Sign(string value) { // 使用MD5加密 MD5 md5 = MD5.Create(); byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(value)); // 把二进制转化为大写的十六进制 StringBuilder result = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { result.Append(bytes[i].ToString("X2")); } return result.ToString(); } /// <summary> /// 双MD5盐值签名 /// </summary> /// <param name="value"></param> /// <param name="salt"></param> /// <returns></returns> public static string DoubleMD5Sign(string value, string salt) { string result = MD5Sign(value); result = MD5Sign(string.Concat(result, salt)); return result; }
5.生成修改密码链接,并赋值给EmailTags,设置邮件标签的过期时间为24小时
tags.ForgetPasswordLink=string.Format("http://XXX.com/user/UpdatePassword?uid={0}&code={1}",staff.Id, code);
tags.Expires = 24;
6.发送邮件任务EmailTask并更新Staff的DynamicCode和DynamicTime字段值
_emailTaskService.SaveEmailTask(new int[] { staff.Id }, new EmailTask() { CreateTime = DateTime.Now, CustomerID = staff.Id, Email = staff.LoginName, EmailContent = "", EmailTempID = 2, EmailTitle = "找回密码", SendType = 0, SendTime = DateTime.Now, PlanSendTime = DateTime.Now, Status = 0, Remark = string.Empty }, tags); _staffService.Update(staff);
6.1 邮件任务EmailTask类如下所示:
public partial class EmailTask { public EmailTask() { } /// <summary> /// ID_bigint /// </summary> public long Id { get; set; } /// <summary> /// 客户Id /// </summary> public int CustomerID { get; set; } /// <summary> /// 邮件地址 /// </summary> public string Email { get; set; } /// <summary> /// 邮件模版ID /// </summary> public int EmailTempID { get; set; } /// <summary> /// 邮件标题 /// </summary> public string EmailTitle { get; set; } /// <summary> /// 邮件内容 /// </summary> public string EmailContent { get; set; } /// <summary> /// 任务状态 0未发送 1发送中 2发送成功 3发送失败 /// </summary> public byte Status { get; set; } /// <summary> /// 任务备注 /// </summary> public string Remark { get; set; } /// <summary> /// 发送类型 0及时发送 1定时发送 /// </summary> public byte SendType { get; set; } /// <summary> /// 计划发送时间 /// </summary> public System.DateTime? PlanSendTime { get; set; } /// <summary> /// 邮件发送时间 /// </summary> public System.DateTime? SendTime { get; set; } /// <summary> /// 任务创建时间 /// </summary> public System.DateTime CreateTime { get; set; } }6.2 SaveEmailTask发送邮件任务代码分为4步:
(1)初始化EmailTask基本信息
(2)根据邮件发送模板获取EmailTask的EmailContent
(3)对邮件发送数量的控制
(4)发送邮件
具体代码见 邮件发送系统设计——忘记密码发送邮件的设计(2)
- 邮件发送系统设计——忘记密码发送邮件的设计(1)
- 邮件发送系统设计——忘记密码发送邮件的设计(2)
- 邮件发送系统设计——忘记密码发送邮件的设计(3)
- 邮件发送系统设计——数据库的设计
- 用户忘记密码之后发送邮件
- QT5.5 发送忘记密码邮件
- QT5.5 发送忘记密码邮件
- Rails — devise 发送修改密码邮件
- 发送邮件 找回密码
- Java—邮件发送
- 基于Freemarker模板技术的邮件发送模块设计
- 基于Freemarker模板技术的邮件发送模块设计
- 基于Freemarker模板技术的邮件发送模块设计
- 关于java模拟邮箱发送邮件的设计与实现
- php 邮件发送系统
- PHP 邮件发送系统
- 邮件发送系统
- javaMail邮件发送系统
- Android 3.1 r1 API中文文档(6)——ImageView 结构
- a标签中有点击事件
- PHP编译选项
- 在libuv之上做的简单C++封装
- Window平台Lua编译和环境搭建
- 邮件发送系统设计——忘记密码发送邮件的设计(1)
- NDK开发(三):JNI数据类型的详解
- UVa 1594 - Ducci Sequence
- IOS中UIScrollView的contentSize、contentOffset属性
- 系统性能事务监控(监控数据库耗时等)
- NDK开发(四):JNI数据结构之JNINativeMethod
- Android Performance(1) StrictMode
- Oracle迁移Postgresql 遇到的一些问题记录
- ffmpeg + x264 编译成给Android开发端用的 动态库