[英]'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.