【发布时间】:2020-03-26 02:15:33
【问题描述】:
我正在构建我的第一个 ASP.NET Core Razor Pages 应用程序。
我创建了一个EmailSender 类,它实现了IEmailSender。
public class EmailSender : IEmailSender
{
private readonly EmailSettings Settings;
public EmailSender(IOptions<EmailSettings> emailSettings)
{
Settings = emailSettings.Value;
}
public async Task SendEmailAsync(string email, string subject, string htmlMessage)
{
using (MailMessage message = new MailMessage())
using (SmtpClient client = new SmtpClient())
{
client.Host = Settings.Host;
client.Port = Settings.Port;
client.Credentials = new NetworkCredential(Settings.UserName, Settings.Password);
client.EnableSsl = Settings.EnableSsl;
message.To.Add(email);
message.From = new MailAddress(Settings.FromAddress);
message.Subject = subject;
message.Body = htmlMessage;
message.IsBodyHtml = true;
await client.SendMailAsync(message);
}
await Task.CompletedTask;
}
}
我已经在 Startup.cs 中注册了EmailSender。
public void ConfigureServices(IServiceCollection services)
{
// Default initialization...
services.AddTransient<IEmailSender, EmailSender>();
services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
}
我的代码构建没有错误。
使用断点,我可以看到当我运行应用程序并单击忘记密码时,EmailSender 构造函数被调用,EmailSettings 实例具有预期值。当我输入我的电子邮件地址并单击重设密码时,EmailSender 构造函数被第二次调用。但是,EmailSender.SendEmailAsync()从未被调用过,也没有发送电子邮件。
我确信我的EmailSender 类设置正确,因为正在调用构造函数。但我不知道如何找出从未调用过 SendEmailAsync() 的原因。
有人有什么建议吗?
【问题讨论】:
-
我没有看到任何调用
SendEmailAsync的代码。这个方法是从哪里调用的? -
@DeanOC:我的理解是它是从 ASP.NET 调用的。我为我的应用程序选择了具有本地用户存储库的选项,实际上,它生成了包含 忘记密码 链接的页面,该链接转到提示您输入电子邮件的页面。不幸的是,我无法调试该代码,甚至无法查看它的标记 (???)。
-
@DeanOC:this example 中的
EmailSender类似乎假设它也将从 ASP.NET 调用。而且,事实上,框架显然正在创建一个类的实例,正如我的构造函数被调用的事实所证明的那样。 -
在您粘贴的链接中,有一个关于未发送电子邮件的反馈问题 #15830。这与您有关吗?
-
@DeanOC:很好的发现,因为我从没想过会这样。不幸的是,将
EmailConfirmed列设置为 true 不会改变结果。 :-(
标签: c# asp.net-core asp.net-identity razor-pages