开发环境:C#,VS2019,.NET Core 3.1,ASP.NET Core Web API,163邮箱
1、在163邮箱的设置中开通IMAP/SMTP的服务,授权成功后会弹出一个窗体(如下图所示),上面显示了授权密码,这个授权密码替代了邮箱的登录密码,后面配置时会用到。
2、建立一个验证码控制器
新建两个方法Create和Check,Create用于创建验证码,发送邮件,Check用于验证它是否有效。
声明一个静态类变量存放列表,列表中存放包含邮箱和验证码的对象。
/// <summary>/// 返回邮件发送状态./// </summary>/// <param name="emailAddress">邮件地址.</param>/// <returns></returns>[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;}}/// <summary>/// 检查验证码是否有效./// </summary>/// <param name="emailAddress">邮件地址.</param>/// <param name="code">验证码.</param>/// <returns></returns>[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{/// <summary>/// 邮箱地址./// </summary>public string emailAddress { get; set; }/// <summary>/// 验证码./// </summary>public string code { get; set; }}
参考:
如何在 Asp.Net Core 中发送 Email_51CTO博客_.net core发送邮件
关于发邮件报错535 Error:authentication failed解决方法_smtplib.smtpauthenticationerror: (535, b'error: au_逸尘️的博客-CSDN博客