diff --git a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs new file mode 100644 index 00000000..96136cde --- /dev/null +++ b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs @@ -0,0 +1,94 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Diagnostics; +using System.Net.Mail; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Background +{ + /// + /// Класс для отправки email + /// + 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)) + { + 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}"); + } + + + private static string MakeWorkId(NotificationDto notification) + { + var hash = notification.IdUser.GetHashCode(); + hash ^= notification.Title.GetHashCode(); + hash ^= notification.Message.GetHashCode(); + return hash.ToString("x"); + } + } +} diff --git a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs index e56e423f..f41bd7ad 100644 --- a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs +++ b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs @@ -1,62 +1,34 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Net.Mail; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Repositories; +using AsbCloudApp.Data; using AsbCloudApp.Services.Notifications; using AsbCloudInfrastructure.Background; -using DocumentFormat.OpenXml.Presentation; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.Email { public class EmailNotificationTransportService : INotificationTransportService { + private readonly IConfiguration configuration; private readonly BackgroundWorker backgroundWorker; - private readonly bool IsConfigured; - private readonly string sender; - private readonly string smtpServer; - private readonly string smtpPassword; - public EmailNotificationTransportService(BackgroundWorker backgroundWorker, + public EmailNotificationTransportService(BackgroundWorker backgroundWorker, IConfiguration configuration) { - 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; - + this.configuration = configuration; this.backgroundWorker = backgroundWorker; } public int IdTransportType => 1; - + public Task SendAsync(NotificationDto notification, CancellationToken cancellationToken) { - if (!IsConfigured) + var work = new WorkToSendEmail(notification, configuration); + if (!backgroundWorker.Works.Any(w => w.Id == work.Id)) { - Trace.TraceWarning("smtp is not configured"); - return Task.CompletedTask; - } - - var workId = MakeWorkId(notification.IdUser, notification.Title, notification.Message); - if (!backgroundWorker.Works.Any(w=>w.Id==workId)) - { - var workAction = MakeEmailSendWorkAction(notification); - - var work = Work.CreateByDelegate(workId, workAction); backgroundWorker.Enqueue(work); } @@ -70,56 +42,7 @@ namespace AsbCloudInfrastructure.Services.Email return Task.WhenAll(tasks); } - - private Func, CancellationToken, Task> MakeEmailSendWorkAction(NotificationDto notification) - { - return async (_, serviceProvider, onProgress, token) => - { - var notificationRepository = serviceProvider.GetRequiredService(); - var userRepository = serviceProvider.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}"); - }; - } - - private static string MakeWorkId(int idUser, string subject, string content) - { - var hash = idUser.GetHashCode(); - hash ^= subject.GetHashCode(); - hash ^= content.GetHashCode(); - return hash.ToString("x"); - } } }