.NET MVC 4 实现邮箱激活账户功能
这篇文章是《.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");
}
至此,发送激活邮件的基本功能就完成了,不过这只是最基本的功能,正常情况下还应该处理用户超时没有点击链接,销毁激活码的工作,发送邮件时应该采用异步发送等等。
.NET MVC 4 实现邮箱激活账户功能的更多相关文章
- javamail实现邮箱验证功能
javamail是基于SMTP协议和POP3协议的邮件发送与接收系统,在用户注册与登陆的过程中,常需要用到邮箱验证功能,下面是基于javamail的一个简单实现 用户注册后通过servlet得到邮箱地 ...
- DEDECMS会员注册如何配置邮箱发送邮件功能
网站邮件功能是一个非常基础和有效的通信工具,配合dede会员注册邮件验证功能可以大量的拒绝垃圾注册用户.那么如何配置DEDECMS会员注册邮箱发送邮件功能? 1:配置dedecms网站发信EMAI ...
- discuz3.2x增加邮箱验证功能
为防止垃圾用户多次注册,为disczu增加邮箱验证功能. 大致分为二步: 1.申请邮箱,这里推荐使用腾讯免费企业邮箱:https://exmail.qq.com/portal/introducefre ...
- 为ASP.NET MVC应用程序使用高级功能
为ASP.NET MVC应用程序使用高级功能 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译, ...
- ASP.NET MVC应用程序实现下载功能
ASP.NET MVC应用程序实现下载功能 上次Insus.NET有在MVC应用程序实现了上传文件的功能<MVC应用程序显示上传的图片> http://www.cnblogs.com/in ...
- php实现邮箱激活功能
php实现邮箱激活功能 一.样例 二.文件结构 其中swiftmailer-master是第三方插件,用来发验证邮件 三.核心代码 doAction.php 响应页面 <?php header( ...
- Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能
Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能 开篇 现在的网站基本都有邮件注册功能,毕竟可以通过邮件定期的给用户发送一些 垃圾邮件 精选推荐
- 关于MVC WebAPI 中加入任务调度功能的问题 (MVC WebAPI 任务调度)
在MVC WebAPI中加入任务调度功能.即在MVC WebAPI启动时,启用任务调度程序. 但是这里有一个问题点,就是部署好IIS站点后,发现任务调度并没有启用.原因为何? 原因是部署好IIS站点后 ...
- asp.net mvc 注册中的邮箱激活功能实现(一)
基本流程图 注册页面就不再写出,现在将发送邮件的代码粘贴出来 public ActionResult SendEmial() { ; string validataCode = System.Guid ...
随机推荐
- BZOJ-1036 [ZJOI2008]树的统计
树链剖分模版题. #include <cstdlib> #include <cstdio> #include <cstring> #include <algo ...
- 【HDOJ5974】A Simple Math Problem(构造,解方程)
题意:给定A与B,要求构造出一组X,Y,使得X+Y=A,lcm(X,Y)=B A<=2e4,B<=1e9 思路:A的范围较小,考虑以A为突破口 枚举A的约数k,复杂度O(sqrt(A)) ...
- 标准C程序设计七---117
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 标准C程序设计七---36
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 40深入理解C指针之---指针与单链表
一.指针与单链表 1.定义:通过使用指针将节点(结点)链接起来成为链表 2.节点(结点): 1).数据域:主要用来存储数据,可以基本数据类型,也可以是构造数据类型: 2).指针域:主要用来当前节点(结 ...
- 打印倒序NxN乘法表
一.实验要求: 给定任意一个字符N(N>0),然后打印NxN的倒序乘法表. 二.解决问题: #/!bin/bash# #define functionNxN_fun(){ local i=$1 ...
- HDU 1754:I Hate It(线段树-单点更新)
题意: 1~N这些人有一些分数,之后有M条操作.要求支持两种操作:更新其中某个人的成绩,查询[A,B]区间内的人的最高成绩. ( 0<N<=200000,0<M<5000 ) ...
- LeetCode OJ--Gray Code **
http://oj.leetcode.com/problems/gray-code/ 求格雷码的表示,主要应用递归. 递归生成码表 这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造: 1位格 ...
- bzoj 1453: [Wc]Dface双面棋盘
1453: [Wc]Dface双面棋盘 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 617 Solved: 317[Submit][Status][ ...
- JAVA中获取不重复的随机数
我们知道 Random random = new Random() 中可能会获取到重复的随机数 那么假设要获取1到33之间的六个不重复随机数应该怎么做呢? 首先定义一个数字数组存储1到33 int[ ...