【发布时间】:2020-11-30 08:53:38
【问题描述】:
在 ASP.NET 中,根据我自己的回答 here,在 App_Start 文件夹中的 IdentityConfig.cs 中为 Identity 配置电子邮件。
ASP.NET Core 身份is now a library。并且默认情况下不包含此 IdentityConfig.cs 文件。那么如何配置电子邮件发送,例如注册确认?
【问题讨论】:
标签: c# asp.net-core
在 ASP.NET 中,根据我自己的回答 here,在 App_Start 文件夹中的 IdentityConfig.cs 中为 Identity 配置电子邮件。
ASP.NET Core 身份is now a library。并且默认情况下不包含此 IdentityConfig.cs 文件。那么如何配置电子邮件发送,例如注册确认?
【问题讨论】:
标签: c# asp.net-core
ASP.NET Core 2 很大程度上依赖于依赖注入。 身份库的 RegisterModel(以及其他依赖于电子邮件的模型)具有以下字段:
private readonly IEmailSender _emailSender;
你只需要使用 Startup.cs 的 ConfigureServices 方法注入一个自己实现的 IEmailSender:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient<IEmailSender, EmailSender>();
}
您可以在项目中名为 Services 的文件夹中定义此 EmailSender 类:
一个可能的实现是:
using Microsoft.AspNetCore.Identity.UI.Services;
using System.Net;
using System.Net.Mail;
using System.Threading.Tasks;
namespace YourProject.Services
{
public class EmailSender : IEmailSender
{
public Task SendEmailAsync(string email, string subject, string htmlMessage)
{
SmtpClient client = new SmtpClient
{
Port = 587,
Host = "smtp.gmail.com", //or another email sender provider
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential("your email sender", "password")
};
return client.SendMailAsync("your email sender", email, subject, htmlMessage);
}
}
}
【讨论】:
您可以参考以下步骤使用 SMTP 发送电子邮件:
创建一个 EmailSender 类,并包含以下方法:
public interface IMyEmailSender
{
void SendEmail(string email, string subject, string HtmlMessage);
}
public class MyEmailSender : IMyEmailSender
{
public IConfiguration Configuration { get; }
public MyEmailSender(IConfiguration configuration)
{
Configuration = configuration;
}
public void SendEmail(string email, string subject, string HtmlMessage)
{
using (MailMessage mm = new MailMessage(Configuration["NetMail:sender"], email))
{
mm.Subject = subject;
string body = HtmlMessage;
mm.Body = body;
mm.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Host = Configuration["NetMail:smtpHost"];
smtp.EnableSsl = true;
NetworkCredential NetworkCred = new NetworkCredential(Configuration["NetMail:sender"], Configuration["NetMail:senderpassword"]);
smtp.UseDefaultCredentials = false;
smtp.Credentials = NetworkCred;
smtp.Port = 587;
smtp.Send(mm);
}
}
}
将 SMTP 配置信息存储在 appsettings.json 中
“网络邮件”:{ "smtpHost": "smtp.live.com", “发件人”:“发件人电子邮件”, “发件人密码”:“密码” },
在 Startup.cs 文件的 ConfigureServices 方法中注册 EmailSernder。
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddTransient<IMyEmailSender, MyEmailSender>();
在Register.cs文件中,创建用户后,可以通过UserManager获取EmailConfirmationToken,获取callbackurl,然后调用SendEmail()方法发送邮件。
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
_myEmailSender.SendEmail(Input.Email, "Confirm your Email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
之后,你会收到这样的邮件:
点击链接后会跳转到Confirm Email页面,然后查看数据库,EmailConfirmed改为True。
参考:Account confirmation and password recovery in ASP.NET Core
【讨论】: