由于邮箱的全球唯一性,网站上的用户账户注册和找回密码中,往往使用邮箱来辅助完成这个功能。那么在.NET开发中怎么进行邮件的发送成为这个问题的关键,下面使用.NET中使用C#的代码进行邮件发送的示例:
/// <summary> /// 实现邮件发送 /// </summary> /// <param name="strSmtpServer">如果是163邮箱就写smtp.163.com </param> /// <param name="strName">发件人的帐号 </param> /// <param name="strPwd">发件人密码 </param> /// <param name="strToName">收件人帐号 </param> /// <param name="strSubject">主题 </param> /// <param name="strBody">内容</param> public static bool Email_Send(string eMailName, long userId, string activationCode, DateTime registerTime, DateTime activationTime, ref string errMsg) { bool bSendSuccess = true; try { //类MailAddress和MailMessage所在的命名空间为:using System.Net.Mail; MailAddress from = new MailAddress("stone@mskj.cc", "民生科技"); //邮件的发件人 MailMessage mail = new MailMessage(); //设置邮件的标题 mail.Subject = "民生科技给您发送的邮件"; //设置邮件的发件人 //Pass:如果不想显示自己的邮箱地址,这里可以填符合mail格式的任意名称,真正发mail的用户不在这里设定,这个仅仅只做显示用 mail.From = from; //设置邮件的收件人 string address = ""; string displayName = ""; /* 这里这样写是因为可能发给多个联系人,每个地址用 ; 号隔开 一般从地址簿中直接选择联系人的时候格式都会是 :用户名1 < mail1 >; 用户名2 < mail 2>; 如果永远都只需要发给一个收件人那么就简单了 mail.To.Add("收件人mail"); */ string[] mailNames = (eMailName + ";").Split(';'); foreach (string name in mailNames) { if (name != string.Empty) { if (name.IndexOf('<') > 0) { displayName = name.Substring(0, name.IndexOf('<')); address = name.Substring(name.IndexOf('<') + 1).Replace('>', ' '); } else { displayName = string.Empty; address = name.Substring(name.IndexOf('<') + 1).Replace('>', ' '); } mail.To.Add(new MailAddress(address, displayName)); } } //设置邮件的抄送收件人 //这个就简单多了,如果不想快点下岗重要文件还是CC一份给领导比较好 mail.CC.Add(new MailAddress("stone@qq.com", "尊敬的管理员")); //设置邮件的内容 mail.Body = string.Format("<html><head></head><body>html格式的邮件的具体内容</body></html>"); //设置邮件的格式 mail.BodyEncoding = Encoding.UTF8; mail.IsBodyHtml = true; //类型MailPriority、DeliveryNotificationOptions所在的命名空间为:using System.Net.Mail; //设置邮件的发送级别 mail.Priority = MailPriority.Normal; ////设置邮件的附件,将在客户端选择的附件先上传到服务器保存一个,然后加入到mail中 mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess; //类型SmtpClient、SmtpDeliveryMethod所在的命名空间为:using System.Net.Mail; SmtpClient client = new SmtpClient(); //设置用于 SMTP 事务的主机的名称,填IP地址也可以了 //腾讯免费企业邮箱对应的POP为:pop.biz.mail.qq.com,SMTP为:smtp.biz.mail.qq.com client.Host = "smtp.biz.mail.qq.com"; //设置用于 SMTP 事务的端口,默认的是 25 //client.Port = 25; client.UseDefaultCredentials = false; //这里才是真正的邮箱登陆名和密码,比如我的邮箱地址是 stone@mskj.cc,邮箱用户密码为sms123456 client.Credentials = new System.Net.NetworkCredential("stone@mskj.cc", "sms123456"); client.DeliveryMethod = SmtpDeliveryMethod.Network; //都定义完了,正式发送了,很是简单吧! client.Send(mail); } catch (Exception ex) { bSendSuccess = false; errMsg = ex.Message; //throw; } return bSendSuccess; }
知道了如何发送邮件,对于使用邮箱注册来激活账号和通过邮箱找回密码就属于你的策略问题了。通过邮箱来激活账号一般地可以考虑使用按时间随机生产一个字符串,通过Cookie保存到客户端或者通过数据库保存到服务器上,注意失效时间的设置,这个字符串和失效时间要与发送到邮箱中的保持一致,这样当用户通过邮箱链接激活时通过比较Cookie或者数据库中的字符串和设置的失效时间就可以确定是否可以激活成功,即字符串一致且在有效期内。找回密码和此原理差不多,首先通过发送到到账号关联邮箱一条类似地激活地链接来来确认是否是用户本人,确认成功后给出有效的修改密码链接地址即可。