ASP.NET MVC 到 ASP.NET CORE 2.2 迁移:如何发送消息(短信、电子邮件等)
ASP.NET MVC to ASP.NET CORE 2.2 migration: How to send messages (SMS, email, etc.)
MVC 程序集: Microsoft.AspNet.Identity.UserManager
核心组件: Microsoft.Extensions.Identity.Core
我正在从 MVC 迁移到 .NET CORE 2.2。我创建了一个继承自 UserManager
的 MyManager
class。 MVC中的UserManager
class有如下属性:
public IIdentityMessageService EmailService { get; set; }
public IIdentityMessageService SmsService { get; set; }
在 .NET CORE 2.2 中,UserManager
没有这些属性。我猜测 MVC UserManager
使用这些属性来自动发送消息。看起来它使用 EmailService
自动发送验证电子邮件地址的消息。但是,这种行为似乎不会发生在 .NET CORE 中。所以,看起来 UserManager
不再处理这个问题。
问题是:如何验证用户的电子邮件地址?
这是在不同的 Microsoft 程序集中处理,还是 Microsoft 退出该业务并将其委托给第 3 方程序集?或者,还有别的吗?
这就是我在 asp.net 核心中使用 Sendgrid 发送电子邮件验证的方式。
第 1 步: 创建一个名为 EmailSender 的 class 实现 IEmailSender 接口(需要包括 using Microsoft.AspNetCore.Identity.UI.Services; 对于 IEmailSender) :
public class EmailSender : IEmailSender
{
public async Task SendEmailAsync(string email, string subject, string htmlMessage)
{
var apiKey = "send grid api key";
//it looks like this :
// var apiKey = "SG.2MpCzyTvIQ.WhHMg6-VBjuqbn9k-8P9m6X9cHM73fk2fzAT5sA4zKc";
var client = new SendGridClient(apiKey);
var from = new EmailAddress($"noreply@domaimName.com", "Email title");
var to = new EmailAddress(email, email);
var plainTextContent = htmlMessage;
var htmlContent = htmlMessage;
var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
try
{
var response = await client.SendEmailAsync(msg);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
//return Task.CompletedTask;
}
}
第 2 步: 您需要在 Startup.cs 文件 [=17] 中使用 依赖注入 将其添加为服务=]
services.AddTransient<IEmailSender, EmailSender>();
第 3 步: 将其注入到要使用它的 class 的构造函数中。
[AllowAnonymous]
public class RegisterModel : PageModel
{
private readonly IEmailSender _emailSender;
public RegisterModel(IEmailSender emailSender)
{
_emailSender = emailSender;
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
UserName = Input.Email,
Email = Input.Email,
DateCreated = DateTime.Now
};
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
returnUrl = Url.Action("ConfirmEmail", "Home");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
await _userManager.AddToRoleAsync(user,"ROleName");
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
return LocalRedirect(returnUrl);
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
这应该会发送您的电子邮件。它对我有用,对你也应该有用。
MVC 程序集: Microsoft.AspNet.Identity.UserManager
核心组件: Microsoft.Extensions.Identity.Core
我正在从 MVC 迁移到 .NET CORE 2.2。我创建了一个继承自 UserManager
的 MyManager
class。 MVC中的UserManager
class有如下属性:
public IIdentityMessageService EmailService { get; set; }
public IIdentityMessageService SmsService { get; set; }
在 .NET CORE 2.2 中,UserManager
没有这些属性。我猜测 MVC UserManager
使用这些属性来自动发送消息。看起来它使用 EmailService
自动发送验证电子邮件地址的消息。但是,这种行为似乎不会发生在 .NET CORE 中。所以,看起来 UserManager
不再处理这个问题。
问题是:如何验证用户的电子邮件地址?
这是在不同的 Microsoft 程序集中处理,还是 Microsoft 退出该业务并将其委托给第 3 方程序集?或者,还有别的吗?
这就是我在 asp.net 核心中使用 Sendgrid 发送电子邮件验证的方式。
第 1 步: 创建一个名为 EmailSender 的 class 实现 IEmailSender 接口(需要包括 using Microsoft.AspNetCore.Identity.UI.Services; 对于 IEmailSender) :
public class EmailSender : IEmailSender
{
public async Task SendEmailAsync(string email, string subject, string htmlMessage)
{
var apiKey = "send grid api key";
//it looks like this :
// var apiKey = "SG.2MpCzyTvIQ.WhHMg6-VBjuqbn9k-8P9m6X9cHM73fk2fzAT5sA4zKc";
var client = new SendGridClient(apiKey);
var from = new EmailAddress($"noreply@domaimName.com", "Email title");
var to = new EmailAddress(email, email);
var plainTextContent = htmlMessage;
var htmlContent = htmlMessage;
var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
try
{
var response = await client.SendEmailAsync(msg);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
//return Task.CompletedTask;
}
}
第 2 步: 您需要在 Startup.cs 文件 [=17] 中使用 依赖注入 将其添加为服务=]
services.AddTransient<IEmailSender, EmailSender>();
第 3 步: 将其注入到要使用它的 class 的构造函数中。
[AllowAnonymous]
public class RegisterModel : PageModel
{
private readonly IEmailSender _emailSender;
public RegisterModel(IEmailSender emailSender)
{
_emailSender = emailSender;
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
UserName = Input.Email,
Email = Input.Email,
DateCreated = DateTime.Now
};
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
returnUrl = Url.Action("ConfirmEmail", "Home");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
await _userManager.AddToRoleAsync(user,"ROleName");
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
return LocalRedirect(returnUrl);
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
这应该会发送您的电子邮件。它对我有用,对你也应该有用。