邮件发送系统设计——忘记密码发送邮件的设计(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)


0 0