發送郵件找回密碼功能(分析加實例)(如有錯誤請指出,謝謝)
分析:
大致思路就是發送郵件→連接郵件里的URL→修改密碼
1.為了保證安全性,需要生成發送到郵件的URL,主要參數(用戶名,過期時間,key(key 需要在每次運行是自動生成隨機碼), IP等等) 然后將URL發送到郵箱。
2.保存發送的參數(建議保存在數據庫)
3.解析url:首先根據用戶名從數據庫中查找出密鑰key和過期時間,沒有則表示該請求 是偽造的或者過期的,然后驗證簽名,驗證過期時間,都驗證通過,就可以修改密碼, 密碼修改完以后,刪除數據庫中的記錄。
.net實例代碼:
1 分為發送郵箱頁面和修改密碼頁面: 2 一.發送郵箱頁面 3 string strUserName = txtUserName.Value.Trim(); 4 string strEail = txtEmail.Value.Trim(); 5 //生成隨機密碼 6 string rand = ""; 7 Random ramPwd = new Random(); 8 string pwd = ramPwd.Next(100000, 9999999).ToString(); 9 rand = pwd; 10 string key = rand + strName + email + "Base"; 11 12 13 if (!string.IsNullOrEmpty(strUserName) && !string.IsNullOrEmpty(strEail)) 14 { 15 //發送郵件 16 StringBuilder sb = new StringBuilder(); 17 sb.Append("親愛的" + strUserName + "您好:<br/><br/>"); 18 sb.Append("點擊以下鏈接設置新密碼。<br/><br/>"); 19 sb.Append("<a href =\"http://www.xxxx.com/findpwd.aspx?key=" + key + "&time=" + time + "\">http://www.xxxx.com/findpwd.aspx?key=" + key + "&time=" + time + " </a><br/><br/>"); 20 sb.Append("(如果無法點擊該URL鏈接地址,請將它復制並粘帖到瀏覽器的地址輸入框,然后單擊回車即可。)<br/><br/>"); 21 sb.Append("注意:請您在收到郵件24小時內使用,否則該鏈接將會失效。<br/><br/>"); 22 sb.Append("我們將一如既往、熱忱的為您服務!<br/><br/>"); 23 string MessageBody = sb.ToString(); 24 Sends(strEail, "no_reply@xxxx.com", "xxxx--找回密碼", MessageBody, "123456"); 25 26 //向find_password_log表添加數據 27 AddFindPassword(strUserName, strEail,key); 28 29 Response.Write("<script>alert('郵件已發送到你的郵箱,請注意查收!');location.href='/';</script>"); 30 31 } 32 } 33 34 35 //向表find_password_log中添加數據 36 private void AddFindPassword(string strName, string email, string key) 37 { 38 //向find_password_log表中插入隨機生成的密碼(MD5加密) ,時間,IP 39 SummerBase.BLL.find_password_log bllFind = new SummerBase.BLL.find_password_log(); 40 SummerBase.Model.find_password_log modelFind = new SummerBase.Model.find_password_log(); 41 if (modelFind != null) 42 { 43 modelFind.Md5 = MFunction.Md5New(key).ToString(); 44 modelFind.CreateTime = SummerBase.Utils.Util.TimeToUnixTimes(DateTime.Now.ToString()); 45 modelFind.IP = Page.Request.UserHostAddress; 46 47 time = modelFind.CreateTime; 48 key = modelFind.Md5; 49 } 50 bllFind.Add(modelFind); 51 52 } 53 54 55 //發送郵件代碼 56 public static void Sends(string email, string formto, string content, string body, string upass) 57 { 58 string name = "no_reply@xxxx.com"; 59 60 string smtp = "smtp.exmail.sina.com"; 61 62 SmtpClient _smtpClient = new SmtpClient(); 63 _smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定電子郵件發送方式 64 _smtpClient.Host = smtp; //指定SMTP服務器 65 _smtpClient.Credentials = new System.Net.NetworkCredential(name, upass);//用戶名和密碼 66 MailMessage _mailMessage = new MailMessage(); 67 //發件人,發件人名 68 _mailMessage.From = new MailAddress(formto, "xxxx公司"); 69 //收件人 70 _mailMessage.To.Add(email); 71 _mailMessage.SubjectEncoding = System.Text.Encoding.GetEncoding("gb2312"); 72 _mailMessage.Subject = content;//主題 73 74 _mailMessage.Body = body;//內容 75 _mailMessage.BodyEncoding = System.Text.Encoding.GetEncoding("gb2312");//正文編碼 76 _mailMessage.IsBodyHtml = true;//設置為HTML格式 77 _mailMessage.Priority = MailPriority.High;//優先級 78 try 79 { 80 _smtpClient.Send(_mailMessage); 81 } 82 catch (Exception) 83 { 84 85 } 86 } 87 88 二,修改密碼頁。 89 90 這個很簡單咯,代碼就沒貼出來 91 1根據接受的參數和數據中添加的參數進行比較,如果驗證通過,就修改密碼,如果驗證失敗則給出提示,重新發送郵件。
