【问题标题】:How to configure email sending in asp.net core for identity library?如何在 asp.net core 中为身份库配置电子邮件发送?
【发布时间】: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


    【解决方案1】:

    根据https://medium.com/@MisterKevin_js/enabling-email-verification-in-asp-net-core-identity-ui-2-1-b87f028a97e0

    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);
            }
        }
    }
    

    【讨论】:

    • 是否必须新建 SmtpClient 还是建议通过 DI 注入?
    【解决方案2】:

    您可以参考以下步骤使用 SMTP 发送电子邮件:

    1. 创建一个 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);
               }
           } 
       }
      
    2. 将 SMTP 配置信息存储在 appsettings.json 中

      “网络邮件”:{ "smtpHost": "smtp.live.com", “发件人”:“发件人电子邮件”, “发件人密码”:“密码” },

    3. 在 Startup.cs 文件的 ConfigureServices 方法中注册 EmailSernder。

           services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
               .AddEntityFrameworkStores<ApplicationDbContext>();
      
           services.AddTransient<IMyEmailSender, MyEmailSender>();
      
    4. 在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

    【讨论】:

    • 是否必须新建 SmtpClient 还是建议通过 DI 注入?
    猜你喜欢
    • 1970-01-01
    • 2016-11-02
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2016-10-04
    • 2013-07-06
    相关资源
    最近更新 更多