ASP.NET Core Web API - 如何发送没有链接和令牌的注册通知电子邮件

问题描述 投票:0回答:2

在我的 ASP.NET Core-6 Web API 中,当用户注册帐户创建时,我会向用户发送电子邮件通知。

邮件服务:

public class MailService : IMailService
{
    private readonly MailSettings _mailSettings;
    private readonly ILogger _logger;
    public MailService(MailSettings mailSettings, ILogger logger)

    {
        _logger = logger;
        _mailSettings = mailSettings;
    }


    public async Task<bool> SendEmailAsync(MailRequest mailRequest)
    {
        var email = new MimeMessage { Sender = MailboxAddress.Parse(_mailSettings.Mail) };
        email.To.Add(MailboxAddress.Parse(mailRequest.ToEmail));
        email.Subject = mailRequest.Subject;
        var builder = new BodyBuilder();
        if (mailRequest.Attachments != null)
        {
            foreach (var file in mailRequest.Attachments.Where(file => file.Length > 0))
            {
                byte[] fileBytes;
                await using (var ms = new MemoryStream())
                {
                    file.CopyTo(ms);
                    fileBytes = ms.ToArray();
                }
                builder.Attachments.Add((file.FileName + Guid.NewGuid().ToString()), fileBytes, ContentType.Parse(file.ContentType));
            }
        }

        builder.HtmlBody = mailRequest.Body;
        email.Body = builder.ToMessageBody();

        try
        {
            using var smtp = new SmtpClient();
            smtp.Connect(_mailSettings.Host, _mailSettings.Port, SecureSocketOptions.StartTls);
            smtp.Authenticate(_mailSettings.Mail, _mailSettings.Password);
            await smtp.SendAsync(email);
            smtp.Disconnect(true);
            return true;
        }
        catch (Exception e)
        {
            _logger.Error(e, e.Source, e.InnerException, e.Message, e.ToString());
            return false;
        }
    }
}

邮件请求:

public class MailRequest
{
    public string ToEmail { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
    public List<IFormFile> Attachments { get; set; }
}

获取电子邮件正文:

public static async Task<string> GetEmailBody(string emailTempPath, string token, string email)
{
    var link = $"https://myapp.com/Manager/RegisterManager?email={email}&token={token}";
    var temp = await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), emailTempPath));
    var emailBody = temp.Replace("**link**", link);
    return emailBody;
}

注册:

    public async Task<Response<string>> Register(RegisterUserDto model)
    {
        var user = _mapper.Map<AppUser>(model);
        user.IsActive = true;
        var response = new Response<string>();
        using (var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
        {
            var result = await _userManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await _userManager.AddToRoleAsync(user, UserRoles.Customer);
                var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                var encodedToken = TokenConverter.EncodeToken(token);
                var userRole = await _userManager.GetRolesAsync(user);
                var mailBody = await EmailBodyBuilder.GetEmailBody(user, userRole.ToList(), emailTempPath: "StaticFiles/Html/ConfirmEmail.html", linkName: "ConfirmEmail", encodedToken, controllerName: "Authentication");
                var mailRequest = new MailRequest()
                {
                    Subject = "Registration Notification",
                    Body = mailBody,
                    ToEmail = model.Email
                };

                bool emailResult = await _mailService.SendEmailAsync(mailRequest); 
                if (emailResult)
                {
                    _logger.Information("Mail sent successfully");
                    var customer = new Customer
                    {
                        AppUser = user
                    };
                    await _unitOfWork.Customers.InsertAsync(customer);
                    await _unitOfWork.Save();
                    response.StatusCode = (int)HttpStatusCode.Created;
                    response.Succeeded = true;
                    response.Data = user.Id;
                    response.Message = "User created successfully! Please check your mail to verify your account.";
                    transaction.Complete();
                    return response;
                }
                _logger.Information("Mail service failed");
                transaction.Dispose();
                response.StatusCode = (int)HttpStatusCode.BadRequest;
                response.Succeeded = false;
                response.Message = "Registration failed. Please try again";
                return response;
            }
            response.Message = GetErrors(result);
            response.StatusCode = (int)HttpStatusCode.BadRequest;
            response.Succeeded = false;
            transaction.Complete();
            return response;
        };
    }

我想将用户名和密码作为电子邮件通知发送给用户。这不包括链接和令牌。并且不会确认,只是知道他的用户名和密码。

如何修改上面的代码来实现这一点?

谢谢

asp.net-core asp.net-web-api mailkit
2个回答
0
投票

您似乎正在使用

Microsoft.AspNetCore.Identity
来实现该功能。 您可以禁用电子邮件验证,因为您不想使用用户功能。

services.AddIdentity<ApplicationUser, IdentityRole>(config =>
{
   config.SignIn.RequireConfirmedEmail = false;
})

您可以从 var user = _mapper.Map<AppUser>(model); 获取您的

用户名
信息,从
RegisterUserDto model
获取密码,只需使用这些值构建电子邮件正文并将其放入
mailBody
变量中即可。


0
投票

请分享代码或github链接

© www.soinside.com 2019 - 2024. All rights reserved.