diff --git a/Unitagram.Application/Contracts/Email/IEmailSender.cs b/Unitagram.Application/Contracts/Email/IEmailSender.cs new file mode 100644 index 0000000..cfde20c --- /dev/null +++ b/Unitagram.Application/Contracts/Email/IEmailSender.cs @@ -0,0 +1,8 @@ +using Unitagram.Application.Models.Email; + +namespace Unitagram.Application.Contracts.Email; + +public interface IEmailSender +{ + Task SendEmail(EmailMessage email); +} \ No newline at end of file diff --git a/Unitagram.Application/Models/Email/EmailMessage.cs b/Unitagram.Application/Models/Email/EmailMessage.cs new file mode 100644 index 0000000..ab59e60 --- /dev/null +++ b/Unitagram.Application/Models/Email/EmailMessage.cs @@ -0,0 +1,8 @@ +namespace Unitagram.Application.Models.Email; + +public record EmailMessage +{ + public string To { get; init; } = string.Empty; + public string Subject { get; init; } = string.Empty; + public string Body { get; init; } = string.Empty; +} \ No newline at end of file diff --git a/Unitagram.Application/Models/Email/EmailSettings.cs b/Unitagram.Application/Models/Email/EmailSettings.cs new file mode 100644 index 0000000..d7b02f6 --- /dev/null +++ b/Unitagram.Application/Models/Email/EmailSettings.cs @@ -0,0 +1,9 @@ +namespace Unitagram.Application.Models.Email; + +public record EmailSettings() +{ + public string SmtpServer { get; init; } = string.Empty; + public int SmtpPort { get; init; } + public string Email { get; init; } = string.Empty; + public string Password { get; init; } = string.Empty; +} \ No newline at end of file diff --git a/Unitagram.Application/Unitagram.Application.csproj b/Unitagram.Application/Unitagram.Application.csproj index 58eb601..697d53d 100644 --- a/Unitagram.Application/Unitagram.Application.csproj +++ b/Unitagram.Application/Unitagram.Application.csproj @@ -4,6 +4,7 @@ net7.0 enable enable + 33D56772-14E9-426F-9754-5334A96CF6D3 @@ -39,6 +40,14 @@ + + + + + + + + diff --git a/Unitagram.Infrastructure/EmailService/EmailSender.cs b/Unitagram.Infrastructure/EmailService/EmailSender.cs new file mode 100644 index 0000000..3f0700b --- /dev/null +++ b/Unitagram.Infrastructure/EmailService/EmailSender.cs @@ -0,0 +1,47 @@ +using System.Net; +using System.Net.Mail; +using Microsoft.Extensions.Options; +using Unitagram.Application.Contracts.Email; +using Unitagram.Application.Contracts.Logging; +using Unitagram.Application.Models.Email; + +namespace Unitagram.Infrastructure.EmailService; + +public class EmailSender : IEmailSender +{ + private readonly EmailSettings _emailSettings; + private readonly IAppLogger _appLogger; + + public EmailSender(IOptions emailSettings, IAppLogger appLogger) + { + _appLogger = appLogger; + _emailSettings = emailSettings.Value; + } + + + public Task SendEmail(EmailMessage emailMessage) + { + try + { + using (SmtpClient smtpClient = new SmtpClient(_emailSettings.SmtpServer, _emailSettings.SmtpPort)) + { + smtpClient.Credentials = new NetworkCredential(_emailSettings.Email, _emailSettings.Password); + smtpClient.EnableSsl = true; // Enable SSL encryption + + MailMessage mail = new MailMessage(); + mail.From = new MailAddress(_emailSettings.Email); + mail.To.Add(emailMessage.To); + mail.Subject = emailMessage.Subject; + mail.Body = emailMessage.Body; + + smtpClient.Send(mail); + return Task.FromResult(true); + } + } + catch (Exception ex) + { + _appLogger.LogError("EmailError", ex); + return Task.FromResult(false); + } + } +} \ No newline at end of file diff --git a/Unitagram.Infrastructure/InfrastructureServicesRegistration.cs b/Unitagram.Infrastructure/InfrastructureServicesRegistration.cs index cce51dd..16726a5 100644 --- a/Unitagram.Infrastructure/InfrastructureServicesRegistration.cs +++ b/Unitagram.Infrastructure/InfrastructureServicesRegistration.cs @@ -1,6 +1,9 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Unitagram.Application.Contracts.Email; using Unitagram.Application.Contracts.Logging; +using Unitagram.Application.Models.Email; +using Unitagram.Infrastructure.EmailService; using Unitagram.Infrastructure.Logging; namespace Unitagram.Infrastructure; @@ -9,7 +12,9 @@ public static class InfrastructureServicesRegistration { public static IServiceCollection AddInfrastructureServices(this IServiceCollection services, IConfiguration configuration) { + services.Configure(configuration.GetSection("EmailSettings")); services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>)); + services.AddTransient(); return services; } } \ No newline at end of file diff --git a/Unitagram.Infrastructure/Unitagram.Infrastructure.csproj b/Unitagram.Infrastructure/Unitagram.Infrastructure.csproj index 6f0516d..b3d615e 100644 --- a/Unitagram.Infrastructure/Unitagram.Infrastructure.csproj +++ b/Unitagram.Infrastructure/Unitagram.Infrastructure.csproj @@ -23,4 +23,5 @@ + diff --git a/Unitagram.WebAPI/Unitagram.WebAPI.csproj b/Unitagram.WebAPI/Unitagram.WebAPI.csproj index 9e497af..236e47c 100644 --- a/Unitagram.WebAPI/Unitagram.WebAPI.csproj +++ b/Unitagram.WebAPI/Unitagram.WebAPI.csproj @@ -1,4 +1,4 @@ - + net7.0 @@ -7,6 +7,7 @@ True api.xml False + 80c0d955-c54a-4767-bb71-481b5e067bcc diff --git a/Unitagram.WebAPI/api.xml b/Unitagram.WebAPI/api.xml index e072399..741f485 100644 --- a/Unitagram.WebAPI/api.xml +++ b/Unitagram.WebAPI/api.xml @@ -28,7 +28,7 @@ Controller responsible for user account-related actions. - + Initializes a new instance of the class.