'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
因为您尝试为其请求密码的用户不存在 或 最有可能的是,您的用户的电子邮件是'已确认!
我正在构建我的第一个 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
因为您尝试为其请求密码的用户不存在 或 最有可能的是,您的用户的电子邮件是'已确认!