From 5b68e1d9ebba303a6d31eefd82860385198c73d3 Mon Sep 17 00:00:00 2001 From: Mia Winter Date: Thu, 18 Jan 2024 15:24:58 +0100 Subject: [PATCH] Implemented SmtpEmailSender for Identity --- Wave/Data/SmtpConfiguration.cs | 11 +++++++ Wave/Program.cs | 10 ++++-- Wave/Services/SmtpEmailSender.cs | 55 ++++++++++++++++++++++++++++++++ Wave/Wave.csproj | 1 + 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 Wave/Data/SmtpConfiguration.cs create mode 100644 Wave/Services/SmtpEmailSender.cs diff --git a/Wave/Data/SmtpConfiguration.cs b/Wave/Data/SmtpConfiguration.cs new file mode 100644 index 0000000..f4359a5 --- /dev/null +++ b/Wave/Data/SmtpConfiguration.cs @@ -0,0 +1,11 @@ +namespace Wave.Data; + +public class SmtpConfiguration { + public required string Host { get; init; } + public required int Port { get; init; } + public required string Username { get; init; } + public required string Password { get; init; } + public required string SenderEmail { get; init; } + public required string SenderName { get; init; } + public bool Ssl { get; init; } = true; +} \ No newline at end of file diff --git a/Wave/Program.cs b/Wave/Program.cs index 111efd1..2573293 100644 --- a/Wave/Program.cs +++ b/Wave/Program.cs @@ -59,8 +59,6 @@ .AddDefaultTokenProviders() .AddClaimsPrincipalFactory(); -builder.Services.AddSingleton, IdentityNoOpEmailSender>(); - #endregion #region Services @@ -74,6 +72,14 @@ builder.Services.AddCascadingValue("TitlePrefix", sf => (sf.GetService>()?.Value.AppName ?? "Wave") + " - "); +var smtpConfig = builder.Configuration.GetSection("Email:Smtp"); +if (smtpConfig.Exists()) { + builder.Services.Configure(smtpConfig); + builder.Services.AddScoped, SmtpEmailSender>(); +} else { + builder.Services.AddSingleton, IdentityNoOpEmailSender>(); +} + #endregion var app = builder.Build(); diff --git a/Wave/Services/SmtpEmailSender.cs b/Wave/Services/SmtpEmailSender.cs new file mode 100644 index 0000000..d8dd0c5 --- /dev/null +++ b/Wave/Services/SmtpEmailSender.cs @@ -0,0 +1,55 @@ +using MailKit.Net.Smtp; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.Extensions.Options; +using MimeKit; +using Wave.Data; + +namespace Wave.Services; + +public class SmtpEmailSender(IOptions config, ILogger logger) : IEmailSender, IEmailSender { + private SmtpConfiguration Configuration { get; } = config.Value; + private ILogger Logger { get; } = logger; + + public Task SendConfirmationLinkAsync(ApplicationUser user, string email, string confirmationLink) => + SendEmailAsync(email, "Confirm your email", + $"Please confirm your account by clicking here."); + + public Task SendPasswordResetLinkAsync(ApplicationUser user, string email, string resetLink) => + SendEmailAsync(email, "Reset your password", + $"Please reset your password by clicking here."); + + public Task SendPasswordResetCodeAsync(ApplicationUser user, string email, string resetCode) => + SendEmailAsync(email, "Reset your password", + $"Please reset your password using the following code: {resetCode}"); + + + public Task SendEmailAsync(string email, string subject, string htmlMessage) { + return SendEmailAsync(email, null, subject, htmlMessage); + } + + public async Task SendEmailAsync(string email, string? name, string subject, string htmlMessage) { + try { + var message = new MimeMessage { + From = {new MailboxAddress(Configuration.SenderName, Configuration.SenderEmail)}, + To = { new MailboxAddress(name, email) }, + Subject = subject + }; + + var builder = new BodyBuilder { + HtmlBody = htmlMessage + }; + + message.Body = builder.ToMessageBody(); + + using var client = new SmtpClient(); + await client.ConnectAsync(Configuration.Host, Configuration.Port); + await client.AuthenticateAsync(Configuration.Username, Configuration.Password); + await client.SendAsync(message); + await client.DisconnectAsync(true); + } catch (Exception ex) { + Logger.LogError(ex, "Error sending E-Mail"); + throw; + } + } +} \ No newline at end of file diff --git a/Wave/Wave.csproj b/Wave/Wave.csproj index b367c58..d7e4208 100644 --- a/Wave/Wave.csproj +++ b/Wave/Wave.csproj @@ -14,6 +14,7 @@ +