这篇文章是《.NET MVC 4 实现用户注册功能》的后续开发,实现发送激活链接到注册用户邮箱,用户在邮箱打开链接后激活账户的功能。
首先实现发送邮件的功能,在管理用户注册的controller中新增一个class MailService:
using System.Net.Mail; public class MailService
{
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="target">收件人</param>
/// <param name="title">邮件标题</param>
/// <param name="content">邮件正文</param>
public void SendMail(string target,string title,string content)
{
MailMessage mailMessage = new MailMessage();
SmtpClient client = new SmtpClient(); //设置编码,否则接收到的邮件会是乱码
mailMessage.To.Add(new MailAddress(target, target.ToString(), Encoding.UTF8)); //标题
mailMessage.Subject = title;
mailMessage.SubjectEncoding = Encoding.UTF8; //正文
mailMessage.Body = content;
mailMessage.BodyEncoding = Encoding.UTF8; //是否允许html
mailMessage.IsBodyHtml = true; //优先级
mailMessage.Priority = MailPriority.Normal; //同步发送
client.Send(mailMessage);
}
用户注册成功后,会跳转到一个提示注册成功的新页,在这个页面里调用刚才的发送邮件方法。
public ActionResult RegSuccess()
{
string username = Session["username"].ToString();
if (username == null)
{
return View("~/Views/Account/Register.cshtml");
} //生成激活码
string code = Guid.NewGuid().ToString("N"); //找到刚才注册成功的用户
var result = db.userInfo.Where(a =>
a.UserName == username).SingleOrDefault(); //将生成的激活码保存到数据库对应的用户上
result.ActiveCode = code; db.SaveChanges(); //邮件正文
string content = "<a href='http://"+Request.Url.Host+":"+Request.Url.Port+"/Account/Active/"+result.UserID+"/"+code+"'>请点击激活您的账户</a>"; MailService ms = new MailService();
ms.SendMail(result.UserEmail, "测试", content); return View();
}
不过只是这样邮件还不能发送成功,因为还缺少相应的smtp配置,在web.config中添加如下代码(这里使用的是163邮箱),填上作为发件人的邮箱和163邮箱服务器的端口号:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="youremail@163.com">
<network defaultCredentials="false" host="smtp.163.com" port="25" userName="youremailusername" password="*****"/>
</smtp>
</mailSettings>
</system.net>
测试一下上面的发送邮件功能,如果配置正确,应该可以成功发送邮件了,如果有错误,检查一下防火墙和邮箱服务器的配置。
下面应该处理用户收到激活邮件并点击里面的链接来激活账户后的工作。
这里采用 /Account/Active/userid/activecode 这个路由来处理。
首先在路由里添加一个新的路由:
routes.MapRoute(
name:"ActiveCode",
url:"{controller}/{action}/{userid}/{activecode}",
constraints:new { userid= @"\d+",activecode = @"[a-zA-Z0-9]+" },
defaults: new { controller = "Account", action = "Active" }
);
然后在controller里添加一个action:
[HttpGet]
//注意这里的参数名userid必须和路由里constraints一样,否则会接收不到参数
public ActionResult Active(int userid,string activecode)
{
var result = db.userInfo.Where(a => a.UserID == userid).SingleOrDefault(); //匹配数据库中的激活码
if(result.ActiveCode.Equals(activecode))
{
result.IsActived = ;
db.SaveChanges(); return RedirectToAction("Index", "Home");
} return View("~/Views/Account/RegSuccess.cshtml");
}
至此,发送激活邮件的基本功能就完成了,不过这只是最基本的功能,正常情况下还应该处理用户超时没有点击链接,销毁激活码的工作,发送邮件时应该采用异步发送等等。