diff --git a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs index 96136cde..c766c5b0 100644 --- a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs +++ b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs @@ -1,11 +1,7 @@ using AsbCloudApp.Data; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Repositories; -using Microsoft.Extensions.Configuration; +using AsbCloudApp.Services.Notifications; using Microsoft.Extensions.DependencyInjection; using System; -using System.Diagnostics; -using System.Net.Mail; using System.Threading; using System.Threading.Tasks; @@ -17,69 +13,16 @@ namespace AsbCloudInfrastructure.Background internal class WorkToSendEmail : Work { private NotificationDto notification; - private string sender; - private string smtpPassword; - private string smtpServer; - private bool IsConfigured; - public WorkToSendEmail(NotificationDto notification, IConfiguration configuration) : base(MakeWorkId(notification)) + public WorkToSendEmail(NotificationDto notification) : base(MakeWorkId(notification)) { this.notification = notification; - - sender = configuration.GetValue("email:sender", string.Empty); - smtpPassword = configuration.GetValue("email:password", string.Empty); - smtpServer = configuration.GetValue("email:smtpServer", string.Empty); - - var configError = string.IsNullOrEmpty(sender) || - string.IsNullOrEmpty(smtpPassword) || - string.IsNullOrEmpty(smtpServer); - - IsConfigured = !configError; } - protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { - if (!IsConfigured) - { - Trace.TraceWarning("smtp is not configured"); - return; - } - - var notificationRepository = services.GetRequiredService(); - var userRepository = services.GetRequiredService(); - - var user = await userRepository.GetOrDefaultAsync(notification.IdUser, token) - ?? throw new ArgumentInvalidException(nameof(notification.IdUser), "Пользователь не найден"); - - if (!MailAddress.TryCreate(user.Email, out var mailAddress)) - { - Trace.TraceWarning($"Mail {user.Email} is not correct."); - throw new ArgumentInvalidException(nameof(user.Email), $"Mail {user.Email} is not null."); - } - - var from = new MailAddress(sender); - var message = new MailMessage - { - From = from - }; - - message.To.Add(mailAddress.Address); - message.BodyEncoding = System.Text.Encoding.UTF8; - message.Body = notification.Message; - message.Subject = notification.Title; - message.IsBodyHtml = true; - - using var client = new SmtpClient(smtpServer); - client.EnableSsl = true; - client.UseDefaultCredentials = false; - client.Credentials = new System.Net.NetworkCredential(sender, smtpPassword); - - await client.SendMailAsync(message, token); - notification.SentDate = DateTime.UtcNow; - await notificationRepository.UpdateAsync(notification, token); - - Trace.TraceInformation($"Send email to {user.Email} subj:{notification.Title} html body count {notification.Message.Length}"); + var notificationService = services.GetRequiredService(); + await notificationService.SendAsync(notification, token); } diff --git a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs index f41bd7ad..a0f9e208 100644 --- a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs +++ b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs @@ -1,9 +1,14 @@ using AsbCloudApp.Data; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; using AsbCloudApp.Services.Notifications; using AsbCloudInfrastructure.Background; using Microsoft.Extensions.Configuration; +using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; +using System.Net.Mail; using System.Threading; using System.Threading.Tasks; @@ -12,27 +17,73 @@ namespace AsbCloudInfrastructure.Services.Email public class EmailNotificationTransportService : INotificationTransportService { - private readonly IConfiguration configuration; - private readonly BackgroundWorker backgroundWorker; - - public EmailNotificationTransportService(BackgroundWorker backgroundWorker, - IConfiguration configuration) - { - this.configuration = configuration; - this.backgroundWorker = backgroundWorker; - } + private readonly INotificationRepository notificationRepository; + private readonly IUserRepository userRepository; + private readonly string sender; + private readonly string smtpPassword; + private readonly string smtpServer; public int IdTransportType => 1; + public bool IsConfigured { get; } - public Task SendAsync(NotificationDto notification, CancellationToken cancellationToken) + public EmailNotificationTransportService(BackgroundWorker backgroundWorker, + IConfiguration configuration, + INotificationRepository notificationRepository, + IUserRepository userRepository) { - var work = new WorkToSendEmail(notification, configuration); - if (!backgroundWorker.Works.Any(w => w.Id == work.Id)) + this.notificationRepository = notificationRepository; + this.userRepository = userRepository; + + this.sender = configuration.GetValue("email:sender", string.Empty); + this.smtpPassword = configuration.GetValue("email:password", string.Empty); + this.smtpServer = configuration.GetValue("email:smtpServer", string.Empty); + + var configError = string.IsNullOrEmpty(this.sender) || + string.IsNullOrEmpty(this.smtpPassword) || + string.IsNullOrEmpty(this.smtpServer); + + this.IsConfigured = !configError; + } + + public async Task SendAsync(NotificationDto notification, CancellationToken token) + { + if (!IsConfigured) { - backgroundWorker.Enqueue(work); + Trace.TraceWarning("smtp is not configured"); + return; } - return Task.CompletedTask; + var user = await userRepository.GetOrDefaultAsync(notification.IdUser, token) + ?? throw new ArgumentInvalidException(nameof(notification.IdUser), "Пользователь не найден"); + + if (!MailAddress.TryCreate(user.Email, out var mailAddress)) + { + Trace.TraceWarning($"Mail {user.Email} is not correct."); + throw new ArgumentInvalidException(nameof(user.Email), $"Mail {user.Email} is not null."); + } + + var from = new MailAddress(sender); + var message = new MailMessage + { + From = from + }; + + message.To.Add(mailAddress.Address); + message.BodyEncoding = System.Text.Encoding.UTF8; + message.Body = notification.Message; + message.Subject = notification.Title; + message.IsBodyHtml = true; + + using var client = new SmtpClient(smtpServer); + client.EnableSsl = true; + client.UseDefaultCredentials = false; + client.Credentials = new System.Net.NetworkCredential(sender, smtpPassword); + + await client.SendMailAsync(message, token); + notification.SentDate = DateTime.UtcNow; + await notificationRepository.UpdateAsync(notification, token); + + Trace.TraceInformation($"Send email to {user.Email} subj:{notification.Title} html body count {notification.Message.Length}"); } public Task SendRangeAsync(IEnumerable notifications, CancellationToken cancellationToken) @@ -42,7 +93,5 @@ namespace AsbCloudInfrastructure.Services.Email return Task.WhenAll(tasks); } - - } }