网站建设公司利润怎么样,长沙网站制作作,作网站流程,wordpress 付费模版前言网站开发中#xff0c;经常碰到需要发送邮件的场景。比如#xff0c;重置用户密码#xff0c;需要执行下列流程#xff1a;用户在重置页面输入邮箱地址进入邮箱#xff0c;使用获得的重置链接打开重置页面输入新密码一般来说#xff0c;重置链接都需要包含一个token值… 前言网站开发中经常碰到需要发送邮件的场景。比如重置用户密码需要执行下列流程用户在重置页面输入邮箱地址进入邮箱使用获得的重置链接打开重置页面输入新密码一般来说重置链接都需要包含一个token值用于保证当前重置操作是正确的来源如下图:问题为了将上面的业务实现示例代码如下[ApiController]
[Route([controller])]
public class ResetController : ControllerBase
{private readonly Dictionarystring,string _cache new Dictionarystring, string();[HttpGet]public void Get([FromQuery] string email){var token Guid.NewGuid().ToString(N);_cache.Add(token, email);//发送邮件smtpServer、from来源于配置using (var smtpClient new SmtpClient(smtpServer,25)){smtpClient.Send(from, email, 重置密码, token);}}[HttpPost]public string Post(string token, string newPassword){var email _cache[token];//重置密码逻辑return email;}
}可以发现如果要拿到token我们必须获得邮件内容。怎么办当然有很多种解决方案比如从缓存获取token但是那样会与业务内部实现强耦合。在这里我们用Smtp4dev去真实的获得邮件。Smtp4devSmtp4devhttps://github.com/rnwood/smtp4dev用于开发和测试的虚拟SMTP电子邮件服务器。可以让你在测试应用程序时无需向真实客户发送邮件也无需使用特殊配置设置复杂的真实电子邮件服务器。安装非常简单直接执行下列命令dotnet tool install -g Rnwood.Smtp4dev然后执行下列命令运行Smtp4devsmtp4dev --urlshttps://localhost:9000 --dbd:\codes\smtp4dev.db--urls 管理页面访问地址--db 邮件存储Sqlite数据库后面测试会用到smtp4dev对应的SMTP服务器地址为localhost:25。测试用例测试用例代码很简单[Fact]
public void Test1()
{var controller new ResetController();var email user_Guid.NewGuid().ToString(N) localhost;controller.Get(email);var token GetToken(email);var result controller.Post(token,111);Assert.Equal(email, result);
}GetToken将从邮件中获取token。获取邮件虽然smtp4dev提供了API来获取邮件但是我们这里使用更简单的方式直接从数据库读取邮件。首先创建DbContext:public class Smtp4devContext : DbContext
{public DbSetMessage Messages { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlite(DataSourced:\codes\smtp4dev.db);}
}public class Message
{ public string Id { get; set; }public string To { get; set; }public string ReceivedDate { get; set; }public string Data { get; set; }
}然后获取指定收件人的最新邮件private static Message GetMessage(string email)
{return new Smtp4devContext().Messages.Where(p p.To email).OrderByDescending(p p.ReceivedDate).First();
}最后从邮件的Data属性中分析出token:private string GetToken(string email)
{var message GetMessage(email);var lines message.Data.Split(\r\n, StringSplitOptions.RemoveEmptyEntries);return lines.Last();
}运行测试成功结论如果你在开发和测试时需要发送邮件试试Smtp4dev吧如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“记住我