diff --git a/AutoWorkshopBusinessLogic/AutoWorkshopBusinessLogic.csproj b/AutoWorkshopBusinessLogic/AutoWorkshopBusinessLogic.csproj index 9a90c74..13785bc 100644 --- a/AutoWorkshopBusinessLogic/AutoWorkshopBusinessLogic.csproj +++ b/AutoWorkshopBusinessLogic/AutoWorkshopBusinessLogic.csproj @@ -8,6 +8,7 @@ + diff --git a/AutoWorkshopBusinessLogic/MailWorker/AbstractMailWorker.cs b/AutoWorkshopBusinessLogic/MailWorker/AbstractMailWorker.cs new file mode 100644 index 0000000..a1c4491 --- /dev/null +++ b/AutoWorkshopBusinessLogic/MailWorker/AbstractMailWorker.cs @@ -0,0 +1,84 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.BusinessLogicContracts; +using Microsoft.Extensions.Logging; + +namespace AutoWorkshopBusinessLogic.MailWorker +{ + public abstract class AbstractMailWorker + { + protected string _mailLogin = string.Empty; + + protected string _mailPassword = string.Empty; + + protected string _smtpClientHost = string.Empty; + + protected int _smtpClientPort; + + protected string _popHost = string.Empty; + + protected int _popPort; + + private readonly IMessageInfoLogic _messageInfoLogic; + + private readonly ILogger _logger; + + public AbstractMailWorker(ILogger Logger, IMessageInfoLogic MessageInfoLogic) + { + _logger = Logger; + _messageInfoLogic = MessageInfoLogic; + } + + public void MailConfig(MailConfigBindingModel Config) + { + _mailLogin = Config.MailLogin; + _mailPassword = Config.MailPassword; + _smtpClientHost = Config.SmtpClientHost; + _smtpClientPort = Config.SmtpClientPort; + _popHost = Config.PopHost; + _popPort = Config.PopPort; + + _logger.LogDebug("MailConfig: {Login}, {Password}, {ClientHost},\r\n{ClientPort}, {PopHost}, {PopPort}", + _mailLogin, _mailPassword, _smtpClientHost, _smtpClientPort, _popHost, _popPort); + } + + public async void SendMailAsync(MailSendInfoBindingModel Info) + { + if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword)) + return; + + if (string.IsNullOrEmpty(_smtpClientHost) || _smtpClientPort == 0) + return; + + if (string.IsNullOrEmpty(Info.MailAddress) || string.IsNullOrEmpty(Info.Subject) || string.IsNullOrEmpty(Info.Text)) + return; + + _logger.LogDebug("MailSendAsync: {To}, {Subject}", Info.MailAddress, Info.Subject); + + await SendMailImpl(Info); + } + + public async void CheckMailAsync() + { + if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword)) + return; + + if (string.IsNullOrEmpty(_popHost) || _popPort == 0) + return; + + if (_messageInfoLogic == null) + return; + + var List = await ReceiveMailImpl(); + _logger.LogDebug("CheckMailAsync: New mails: {Count}", List.Count); + + foreach (var Mail in List) + { + _messageInfoLogic.Create(Mail); + } + } + + protected abstract Task SendMailImpl(MailSendInfoBindingModel Info); + + protected abstract Task> ReceiveMailImpl(); + } +} diff --git a/AutoWorkshopBusinessLogic/MailWorker/MailKitWorker.cs b/AutoWorkshopBusinessLogic/MailWorker/MailKitWorker.cs new file mode 100644 index 0000000..9bdb1af --- /dev/null +++ b/AutoWorkshopBusinessLogic/MailWorker/MailKitWorker.cs @@ -0,0 +1,91 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.BusinessLogicContracts; +using DocumentFormat.OpenXml.EMMA; +using DocumentFormat.OpenXml.Spreadsheet; +using MailKit.Net.Pop3; +using MailKit.Security; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Mail; +using System.Text; +using System.Threading.Tasks; + +namespace AutoWorkshopBusinessLogic.MailWorker +{ + public class MailKitWorker : AbstractMailWorker + { + public MailKitWorker(ILogger Logger, IMessageInfoLogic MessageInfoLogic) + : base(Logger, MessageInfoLogic) { } + + protected override async Task SendMailImpl(MailSendInfoBindingModel Info) + { + using var MailMessage = new MailMessage(); + using var SmtpClient = new SmtpClient(_smtpClientHost, _smtpClientPort); + + try + { + MailMessage.From = new MailAddress(_mailLogin); + MailMessage.To.Add(new MailAddress(Info.MailAddress)); + MailMessage.Subject = Info.Subject; + MailMessage.Body = Info.Text; + MailMessage.SubjectEncoding = Encoding.UTF8; + MailMessage.BodyEncoding = Encoding.UTF8; + + SmtpClient.UseDefaultCredentials = false; + SmtpClient.EnableSsl = true; + SmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; + SmtpClient.Credentials = new NetworkCredential(_mailLogin, _mailPassword); + + await Task.Run(() => SmtpClient.Send(MailMessage)); + } + catch (Exception) + { + throw; + } + } + + protected override async Task> ReceiveMailImpl() + { + var Result = new List(); + + using var Client = new Pop3Client(); + + await Task.Run(() => + { + try + { + Client.Connect(_popHost, _popPort, SecureSocketOptions.SslOnConnect); + Client.Authenticate(_mailLogin, _mailPassword); + + for (int i = 0; i < Client.Count; i++) + { + var Message = Client.GetMessage(i); + + foreach (var Mail in Message.From.Mailboxes) + { + Result.Add(new MessageInfoBindingModel + { + DateDelivery = Message.Date.DateTime, + MessageId = Message.MessageId, + SenderName = Mail.Address, + Subject = Message.Subject, + Body = Message.TextBody + }); + } + } + } + catch (AuthenticationException) + { } + finally + { + Client.Disconnect(true); + } + }); + + return Result; + } + } +} diff --git a/AutoWorkshopContracts/BindingModels/MailConfigBindingModel.cs b/AutoWorkshopContracts/BindingModels/MailConfigBindingModel.cs new file mode 100644 index 0000000..e5b83ac --- /dev/null +++ b/AutoWorkshopContracts/BindingModels/MailConfigBindingModel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutoWorkshopContracts.BindingModels +{ + public class MailConfigBindingModel + { + public string MailLogin { get; set; } = string.Empty; + + public string MailPassword { get; set; } = string.Empty; + + public string SmtpClientHost { get; set; } = string.Empty; + + public int SmtpClientPort { get; set; } + + public string PopHost { get; set; } = string.Empty; + + public int PopPort { get; set; } + } +} diff --git a/AutoWorkshopContracts/BindingModels/MailSendInfoBindingModel.cs b/AutoWorkshopContracts/BindingModels/MailSendInfoBindingModel.cs new file mode 100644 index 0000000..f392764 --- /dev/null +++ b/AutoWorkshopContracts/BindingModels/MailSendInfoBindingModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutoWorkshopContracts.BindingModels +{ + public class MailSendInfoBindingModel + { + public string MailAddress { get; set; } = string.Empty; + + public string Subject { get; set; } = string.Empty; + + public string Text { get; set; } = string.Empty; + } +} diff --git a/AutoWorkshopDatabaseImplement/Implements/ClientStorage.cs b/AutoWorkshopDatabaseImplement/Implements/ClientStorage.cs index 4151748..8722c95 100644 --- a/AutoWorkshopDatabaseImplement/Implements/ClientStorage.cs +++ b/AutoWorkshopDatabaseImplement/Implements/ClientStorage.cs @@ -19,7 +19,7 @@ namespace AutoWorkshopDatabaseImplement.Implements public List GetFilteredList(ClientSearchModel Model) { - if (string.IsNullOrEmpty(Model.ClientFIO) && string.IsNullOrEmpty(Model.Email)) + if (string.IsNullOrEmpty(Model.ClientFIO) && string.IsNullOrEmpty(Model.Email)) // TODO: check selecting by email return new(); using var Context = new AutoWorkshopDatabase();