开发环境: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博客