簡體   English   中英

“忘記電子郵件”功能不發送電子郵件

[英]'Forgot Email' function not sending email

我正在構建我的第一個 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"));
}

我的代碼構建沒有錯誤。

使用斷點,我可以看到當我運行應用程序並單擊Forgot your Password 時,會調用EmailSender構造函數並且EmailSettings實例具有預期值。 當我輸入我的電子郵件地址並單擊Reset Password 時,第二次調用EmailSender構造函數。 但是,從不調用EmailSender.SendEmailAsync() ,也不會發送電子郵件。

我確信我的EmailSender類設置正確,因為正在調用構造函數。 但我不知道如何隔離從未調用SendEmailAsync()的原因。

有人有建議嗎?

腳手架標識

您需要搭建 Identity 以調試代碼。

右鍵單擊 Identity 文件夾,然后單擊

  • 添加 >> 新腳手架項目..

在左側菜單中單擊

  • 身份 >> 添加

然后

  • 檢查帳戶\\忘記密碼
  • 選擇您的數據庫上下文類
  • 點擊添加

現在您的剃刀頁面帶有隱藏代碼,因此單擊箭頭以展開隱藏代碼文件。

PostAsync() ,在 if 語句上放置一個斷點。

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

運行應用程序並執行忘記密碼請求。

您的斷點將被擊中,您將能夠進行調試。 它不會退出 if 語句,因為 await _userManager.IsEmailConfirmedAsync(user)false

通過將調試器拖到該循環之外來解決該問題,並讓它繼續。 現在您將看到您的電子郵件發件人將被調用並且您的 SendEmailAsync 將被命中。

把它們加起來

  • “魔法”登錄、注銷和帳戶頁面由身份團隊通過庫包提供給您。
  • 為了訪問代碼,您需要搭建它們。
  • 您沒有點擊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>");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM