'Forgot Email' 函数不发送电子邮件

'Forgot Email' function not sending email

我正在构建我的第一个 ASP.NET Core Razor Pages 应用程序。

我创建了一个 EmailSender class,它实现了 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 class 设置正确,因为正在调用构造函数。但我不知道如何找出从未调用 SendEmailAsync() 的原因。

有人有什么建议吗?

请确认您的 AccountController 调用了 IEmailSender.SendEmailAsync 方法。示例见此处:https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/security/authentication/identity/sample/src/ASPNETCore-IdentityDemoComplete/IdentityDemo/Controllers/AccountController.cs#L375

ForgotPassword动作中有一行:

await _emailSender.SendEmailAsync(model.Email, "Reset Password",
                   $"Please reset your password by clicking here: <a href='{callbackUrl}'>link</a>");

脚手架身份

您需要搭建 Identity 脚手架才能调试代码。

右键单击身份文件夹,然后单击

  • 添加 >> 新的脚手架项目..

在左侧菜单中点击

  • 身份>>添加

然后

  • 勾选Account\ForgotPassword
  • 选择您的数据库上下文class
  • 点击添加

现在您的 razor 页面带有代码隐藏,因此请单击箭头展开代码隐藏文件。

PostAsync() 中,在 if 语句上放置一个断点。

if (user == null || !(await _userManager.IsEmailConfirmedAsync(user))) // Breakpoint here
{
    ...
}

运行 应用程序并执行忘记密码请求。

您的断点将会命中,您将能够进行调试。它不会退出 if 语句,因为 await _userManager.IsEmailConfirmedAsync(user)false.

通过将调试器拖到该循环之外解决该问题,并让它继续。现在您将看到您的电子邮件发件人将被调用并且您的 SendEmailAsync 将命中。

总结一下

  • 'magic' 登录、注销和帐户页面由身份团队通过库包提供给您。
  • 为了访问代码,您需要搭建它们的脚手架。
  • 您没有点击 SendEmailAsync 因为您尝试为其请求密码的用户不存在 最有可能的是,您的用户的电子邮件是'已确认!