C#实现邮箱验证码

开发环境:C#,VS2019,.NET Core 3.1,ASP.NET Core Web API,163邮箱

1、在163邮箱的设置中开通IMAP/SMTP的服务,授权成功后会弹出一个窗体(如下图所示),上面显示了授权密码,这个授权密码替代了邮箱的登录密码,后面配置时会用到。

C#实现邮箱验证码_第1张图片

2、建立一个验证码控制器

新建两个方法Create和Check,Create用于创建验证码,发送邮件,Check用于验证它是否有效。

声明一个静态类变量存放列表,列表中存放包含邮箱和验证码的对象。

        /// 
        /// 返回邮件发送状态.
        /// 
        /// 邮件地址.
        /// 
        [HttpGet]
        public string Create(string emailAddress)
        {
            try
            {
                VCodeEmailModel model = new VCodeEmailModel();
                model.emailAddress = emailAddress;
                var vcode = Utils.GetVCode();    // 生成验证码
                model.code = vcode;
                _list.Add(model);

                // 将邮件记录到缓存中
                this._cache.GetOrCreate(emailAddress, m =>
                {
                    // 设置缓存有效期
                    m.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(60);
                    return "";
                });

                // 发送邮件
                EmailMessage email_model = new EmailMessage();
                email_model.Send(emailAddress, vcode);

                // 返回发送状态
                ReceiveObject result = new ReceiveObject();
                result.code = "0";
                result.msg = "验证成功";
                var json = JsonConvert.SerializeObject(result);
                return json;
            }
            catch(Exception ex)
            {
                _logger.LogError(exception: ex, message: ex.Message);
                ReceiveObject result = new ReceiveObject();
                result.code = "999999";
                result.msg = "系统异常";
                var json = JsonConvert.SerializeObject(result);
                return json;
            }
        }

        /// 
        /// 检查验证码是否有效.
        /// 
        /// 邮件地址.
        /// 验证码.
        /// 
        [HttpGet]
        public string Check(string emailAddress, string code)
        {
            try
            {
                ReceiveObject result = new ReceiveObject();
                if (this._cache.Get(emailAddress) == null)
                {
                    _list.Remove(_list.Find(m => m.emailAddress == emailAddress));    // 发现过期的邮箱,将它从变量中剔除
                    result.code = "2";
                    result.msg = "验证码已过期";
                    var json = JsonConvert.SerializeObject(result);
                    return json;
                }

                var index = _list.FindIndex(m =>
                {
                    if (m.emailAddress.Equals(emailAddress) && m.code.Equals(code))
                    {
                        return true;
                    }

                    return false;
                });

                if (index >= 0)
                {
                    _list.RemoveAt(index);
                    result.code = "0";
                    result.msg = "验证成功";
                    var json = JsonConvert.SerializeObject(result);
                    return json;
                }
                else
                {
                    result.code = "1";
                    result.msg = "验证失败";
                    var json = JsonConvert.SerializeObject(result);
                    return json;
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(exception: ex, message: ex.Message);
                ReceiveObject result = new ReceiveObject();
                result.code = "999999";
                result.msg = "系统异常";
                var json = JsonConvert.SerializeObject(result);
                return json;
            }
        }

3、建立一个发送电子邮箱的帮助类

代码可以参考:如何在 Asp.Net Core 中发送 Email_51CTO博客_.net core发送邮件

这里使用的是MailKit类库来实现发送邮件的功能。

163邮箱的smtp服务器是smtp.163.com,端口是465,密码使用第一步提供的授权密码。

注意:为了避免敏感暴露请使用用户机密,将敏感信息保持到本地,避免上传到代码管理服务器

4、建立一个验证码模型

验证码模型类包括:邮件地址和验证码属性。

    public class VCodeEmailModel
    {
        /// 
        /// 邮箱地址.
        /// 
        public string emailAddress { get; set; }

        /// 
        /// 验证码.
        /// 
        public string code { get; set; }
    }

参考:

如何在 Asp.Net Core 中发送 Email_51CTO博客_.net core发送邮件

关于发邮件报错535 Error:authentication failed解决方法_smtplib.smtpauthenticationerror: (535, b'error: au_逸尘️的博客-CSDN博客

你可能感兴趣的:(#,ASP.NET,Core,c#,asp.net)