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();