简体   繁体   English

ASP.NET Core 3.1 创建服务发送email确认

[英]ASP.NET Core 3.1 create a service to send email confirmation

I call the method EmailConfirmation on several pages so I decided to create a service for this.我在多个页面上调用了EmailConfirmation方法,因此我决定为此创建一个服务。

But I have a problem with GetEmailConfirmCallback : Url is null.但我对GetEmailConfirmCallback有疑问: Url是 null。

I would like to change Identity area pages also and use this service instead of in some pages like register and externalLogin,... each time do the same task.我也想更改身份区域页面并使用此服务,而不是在注册和外部登录等某些页面中使用此服务...每次都执行相同的任务。

This is my class:这是我的 class:

public class ApplicationServices : ControllerBase
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly IEmailSender _emailSender;
    private readonly IWebHostEnvironment _webHostEnvironment;

    public ApplicationServices(IEmailSender emailSender, UserManager<ApplicationUser> userManager, IWebHostEnvironment webHostEnvironment)
    {
        _emailSender = emailSender;
        _userManager = userManager;
        _webHostEnvironment = webHostEnvironment;
    }

    public async Task<ResultModel> EmailConfirmation(ApplicationUser user, string returnUrl = "/Identity/Account/Login")
    {
        ResultModel resultModel = new ResultModel();

        try
        {
            var pathToEmailTemplate = _webHostEnvironment.WebRootPath
            + Path.DirectorySeparatorChar.ToString()
            + "templates"
            + Path.DirectorySeparatorChar.ToString()
            + "email_templates"
            + Path.DirectorySeparatorChar.ToString()
            + "confirm-email-reset-password.html";

            string emailTemplateString = string.Empty;

            using (StreamReader SourceReader = System.IO.File.OpenText(pathToEmailTemplate))
            {
                emailTemplateString = SourceReader.ReadToEnd();
            }

            string messageSubject = "Confirm your email";
            string messageBody = $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(await GetEmailConfirmCallback(user, returnUrl))}'>clicking here</a>.";

            string messageSenderName = "Support team.";

            string emailMessage = string.Format(emailTemplateString, messageSubject, string.IsNullOrEmpty(user.FullName) ? user.FullName : "User", messageBody, messageSenderName);

            await _emailSender.SendEmailAsync(user.Email, messageSubject, emailMessage);

            resultModel.IsSucceed = true;
            return resultModel;
        }
        catch (Exception e)
        {
            resultModel.IsSucceed = false;
            resultModel.Message = e.Message;
            return resultModel;
        }
    }
    
    private async Task<string> GetEmailConfirmCallback(ApplicationUser user, string returnUrl)
    {
        var codeEmail = await _userManager.GenerateEmailConfirmationTokenAsync(user);
        codeEmail = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(codeEmail));
        var callbackUrlEmail = Url.Page(
        "/Account/ConfirmEmail",
        pageHandler: null,
        values: new { area = "Identity", userId = user.Id, code = codeEmail, returnUrl },
        protocol: Request.Scheme);

        return callbackUrlEmail;
    }
}

调试图像 1

调试图像 2

Any advice or assistance would be greatly appreciated.任何建议或帮助将不胜感激。

Have you tried using Url.Action instead of Url.Page ?您是否尝试过使用Url.Action而不是Url.Page Url.Action is for MVC and Url.Page is for Razor. Url.Action用于 MVC, Url.Page用于 Razor。 You are not specifying if you are using Razor or MVC.您没有指定您使用的是 Razor 还是 MVC。

Ok, here are some detail from the past link好的,这是过去链接中的一些细节

They used a URL.Action like this example:他们使用了一个 URL.Action 像这个例子: 在此处输入图像描述

In your code you're using Url.Page.在您的代码中,您使用的是 Url.Page。

This is other exmaple that uses Url.Action:这是使用 Url.Action 的其他示例: 在此处输入图像描述

  1. Register HttpContextAccessor in Startup.cs在 Startup.cs 中注册HttpContextAccessor
services.AddHttpContextAccessor();
  1. Add IHttpContextAccessor and LinkGenerator as dependency injections in the service class在服务中添加IHttpContextAccessorLinkGenerator作为依赖注入 class
private readonly UserManager<ApplicationUser> _userManager;
private readonly IEmailSender _emailSender;
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly LinkGenerator _generator;

public ApplicationServices(UserManager<ApplicationUser> userManager, 
                            IEmailSender emailSender, 
                            IWebHostEnvironment webHostEnvironment, 
                            IHttpContextAccessor httpContextAccessor, 
                            LinkGenerator generator)
{
    _userManager = userManager;
    _emailSender = emailSender;
    _webHostEnvironment = webHostEnvironment;
    _httpContextAccessor = httpContextAccessor;
    _generator = generator;
}
  1. Change method GetEmailConfirmCallback更改方法GetEmailConfirmCallback
private async Task<string> GetEmailConfirmCallback(ApplicationUser user, HttpContext context, string returnUrl)
{
    var codeEmail = await _userManager.GenerateEmailConfirmationTokenAsync(user);
    codeEmail = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(codeEmail));


    var callbackUrlEmail = _generator.GetUriByPage(_httpContextAccessor.HttpContext,
    page:"/Account/ConfirmEmail",
    handler: null,
    values: new { area = "Identity", userId = user.Id, code = codeEmail, returnUrl });


    return callbackUrlEmail;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Sendgrid 不发送确认 email asp.net core 3.1 - Sendgrid does not send confirmation email asp.net core 3.1 无法在 ASP.NET Core 3.1 MVC 中发送电子邮件以进行确认 - Unable to send email for conformation in ASP.NET Core 3.1 MVC 在 ASP.NET 核心 Web Z72664DC0959F3B0C0470479 中注册后,将 email 确认令牌作为可点击链接发送给用户 - Send email confirmation token as clickable link to user upon registration in ASP.NET Core Web Api Asp.net核心电子邮件确认有时会说InvalidToken - Asp.net Core Email confirmation sometimes says InvalidToken ASP.NET Core Identity email React 路由确认 URL - ASP.NET Core Identity email confirmation URL for React routes 如何更改 ASP.NET 核心标识 email 确认消息 - How to change the ASP.NET Core Identity email confirmation message 我如何在asp.net mvc中发送确认电子邮件 - How can I send a Confirmation Email in asp.net mvc ASP.NET Identity 2.2.1 - 发送包含代码的确认电子邮件,而不是链接 - ASP.NET Identity 2.2.1 - send confirmation email with code, not with link 如何在 asp.net 核心 3.1 中从存储库 class 创建确认 email 回调 - How to create confirm email callback from repository class in asp.net core 3.1 ASP.Net MVC 4 SimpleMembership“重新发送确认电子邮件” - ASP.Net MVC 4 SimpleMembership “Re-Send Confirmation Email”
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM