邮箱认证新用户注册,也可用于重置密码

第一部分:发送邮箱

1.当用户注册完的时候,提示用户打开邮箱验证

2.当用户填写信息后,用户信息插入数据库(ischeck设置为0 未验证),并发送邮件(内容用微信的方式进行拼接和回调参数)

 public static void SendMail(string smtpserver/*SMTP服务器smtp.qq.com*/, int enablessl/*是否启用SSL加密*/, string userName/*登录帐号*/,
            string pwd/*登录密码*/, string nickName/*昵称*/, string strfrom/*发件人*/, string strto/*收件人*/, string subj/*主题*/, string bodys/*内容*/)
        {
            SmtpClient smtpClient = new SmtpClient
            {
                DeliveryMethod = SmtpDeliveryMethod.Network,
                Host = smtpserver,
                Credentials = new System.Net.NetworkCredential(userName, pwd)
            };
            if (enablessl == 1)
            {
                smtpClient.EnableSsl = true;
            }

            MailAddress from = new MailAddress(strfrom, nickName);
            MailAddress to = new MailAddress(strto);
            MailMessage mailMessage = new MailMessage(from, to)
            {
                Subject = subj,
                Body = bodys,
                BodyEncoding = System.Text.Encoding.Default,
                IsBodyHtml = true,
                Priority = MailPriority.Normal
            };
            smtpClient.Send(mailMessage);
        }

例子用的是

SMTP.qq.com服务器
需要在qq邮箱里配置,打开qq邮箱-设置-账户-开启这2个服务

普通qq邮箱是每天100封邮件,企业qq邮箱是每天500封,各种邮箱每天发送量不同

额,可以申请N个免费邮箱,在用户表里设置往哪个邮箱发送,然后.......,额,不建议这样(—_—)

第二部分:邮件的内容,其实就是一个带参数的url地址,当点击的时候,完成注册,邮件主体内容

1. 将username(用户名)、timestamp(时间戳)、randrom(随机数)三个参数进行字典序排序 
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 加密后的字符串与signature对比,标识该请求来源于邮箱回调函数
 public string Mailbody(string username, string randrom, DateTime dateTime)
        {
            string timestamp = DateTimeToUnixTimestamp(dateTime);
            string[] arrTmp = { username, timestamp,randrom};
            Array.Sort(arrTmp);     //字典排序
            string tmpStr = string.Join("", arrTmp);
            tmpStr = GetSha1(tmpStr).ToLower();
            return string.Format("{0}type=reg&uname={1}&signature={2}","www.xxx.com/reg",username,tmpStr);
        }
        public static string DateTimeToUnixTimestamp(DateTime dateTime)
        {
            var start = new DateTime(1970, 1, 1, 0, 0, 0, dateTime.Kind);
            return Convert.ToInt64((dateTime - start).TotalSeconds).ToString(CultureInfo.InvariantCulture);
        }
        public static string GetSha1(string pwd)
        {
            byte[] data = System.Text.Encoding.Default.GetBytes(pwd);//以字节方式存储
            System.Security.Cryptography.SHA1 sha1 = new System.Security.Cryptography.SHA1CryptoServiceProvider();
            byte[] result = sha1.ComputeHash(data);//得到哈希值
            return System.BitConverter.ToString(result).Replace("-", ""); //转换成为字符串的显示
        }

第三部分,接收回调函数(与数据库的数据表校队)

这一步关系凌乱(先做记录,待以后补全)

string signature = HttpContext.Current.Request.QueryString["signature"];
string type = HttpContext.Current.Request.QueryString["type"];

string username = HttpContext.Current.Request.QueryString["username"];

通过查找username和signature进行比较,是否一样,如果一样这个用户注册成功?

 

第三部分逻辑有问题,先写到这。

posted on 2015-05-28 22:09  等风起  阅读(583)  评论(0编辑  收藏  举报