From fa9c760a0b76dd99abcde0b7ed79d93aee5634e6 Mon Sep 17 00:00:00 2001
From: Ino <irisha1234517@gmail.com>
Date: Tue, 11 Apr 2023 15:29:05 +0400
Subject: [PATCH 1/2] =?UTF-8?q?7=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D0=B0?=
 =?UTF-8?q?=D1=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../BusinessLogics/MessageInfoLogic.cs        |  43 ++
 .../BusinessLogics/OrderLogic.cs              |  62 ++-
 .../IceCreamBusinessLogic.csproj              |   1 +
 .../MailWorker/AbstractMailWorker.cs          |  97 ++++
 .../MailWorker/MailKitWorker.cs               |  78 ++++
 IceCreamShop/IceCreamShop/App.config          |  11 +
 .../IceCreamShop/FormMain.Designer.cs         | 427 +++++++++---------
 IceCreamShop/IceCreamShop/FormMain.cs         | 395 ++++++++--------
 .../IceCreamShop/FormViewMail.Designer.cs     |  62 +++
 IceCreamShop/IceCreamShop/FormViewMail.cs     |  40 ++
 IceCreamShop/IceCreamShop/FormViewMail.resx   |  60 +++
 .../IceCreamShop/IceCreamShopView.csproj      |   3 +
 IceCreamShop/IceCreamShop/Program.cs          |  36 +-
 .../Controllers/HomeController.cs             |  12 +-
 .../Views/Home/Mails.cshtml                   |  54 +++
 .../Views/Shared/_Layout.cshtml               |   3 +
 .../BindingModels/MailConfigBindingModel.cs   |  17 +
 .../BindingModels/MailSendInfoBindingModel.cs |  11 +
 .../BindingModels/MessageInfoBindingModel.cs  |  19 +
 .../IMessageInfoLogic.cs                      |  13 +
 .../SearchModels/MessageInfoSearchModel.cs    |   9 +
 .../StoragesContracts/IMessageInfoStorage.cs  |  17 +
 .../ViewModels/MessageInfoViewModel.cs        |  24 +
 .../Models/IMessageInfoModel.cs               |  13 +
 .../IceCreamShopDatabase.cs                   |   2 +
 .../Implements/MessageInfoStorage.cs          |  52 +++
 .../20230411104402_LabWork07_mail.Designer.cs | 298 ++++++++++++
 .../20230411104402_LabWork07_mail.cs          |  48 ++
 .../IceCreamShopDatabaseModelSnapshot.cs      |  41 ++
 .../Models/Client.cs                          |   5 +-
 .../Models/MessageInfo.cs                     |  52 +++
 .../Models/Order.cs                           |   6 +-
 .../DataFileSingleton.cs                      |   4 +
 .../Implements/MessageInfoStorage.cs          |  53 +++
 .../Models/MessageInfo.cs                     |  75 +++
 .../DataListSingleton.cs                      |   2 +
 .../Implements/MessageInfoStorage.cs          |  60 +++
 .../Models/MessageInfo.cs                     |  49 ++
 .../Controllers/ClientController.cs           |  22 +-
 .../IceCreamShopRestApi.csproj                |   1 +
 IceCreamShop/IceCreamShopRestApi/Order.xml    |   8 +
 IceCreamShop/IceCreamShopRestApi/Program.cs   |  19 +-
 .../IceCreamShopRestApi/appsettings.json      |   9 +-
 43 files changed, 1877 insertions(+), 436 deletions(-)
 create mode 100644 IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs
 create mode 100644 IceCreamShop/IceCreamBusinessLogic/MailWorker/AbstractMailWorker.cs
 create mode 100644 IceCreamShop/IceCreamBusinessLogic/MailWorker/MailKitWorker.cs
 create mode 100644 IceCreamShop/IceCreamShop/App.config
 create mode 100644 IceCreamShop/IceCreamShop/FormViewMail.Designer.cs
 create mode 100644 IceCreamShop/IceCreamShop/FormViewMail.cs
 create mode 100644 IceCreamShop/IceCreamShop/FormViewMail.resx
 create mode 100644 IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml
 create mode 100644 IceCreamShop/IceCreamShopContracts/BindingModels/MailConfigBindingModel.cs
 create mode 100644 IceCreamShop/IceCreamShopContracts/BindingModels/MailSendInfoBindingModel.cs
 create mode 100644 IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs
 create mode 100644 IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs
 create mode 100644 IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs
 create mode 100644 IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs
 create mode 100644 IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs
 create mode 100644 IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs
 create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs
 create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs
 create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs
 create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs
 create mode 100644 IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs
 create mode 100644 IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs
 create mode 100644 IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs
 create mode 100644 IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs
 create mode 100644 IceCreamShop/IceCreamShopRestApi/Order.xml

diff --git a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs
new file mode 100644
index 0000000..06f8576
--- /dev/null
+++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs
@@ -0,0 +1,43 @@
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.BusinessLogicsContracts;
+using IceCreamShopContracts.SearchModels;
+using IceCreamShopContracts.StoragesContracts;
+using IceCreamShopContracts.ViewModels;
+using Microsoft.Extensions.Logging;
+
+namespace IceCreamBusinessLogic.BusinessLogics
+{
+    public class MessageInfoLogic : IMessageInfoLogic
+    {
+        private readonly ILogger _logger;
+        private readonly IMessageInfoStorage _messageInfoStorage;
+        public MessageInfoLogic(ILogger<MessageInfoLogic> logger, IMessageInfoStorage MessageInfoStorage)
+        {
+            _logger = logger;
+            _messageInfoStorage = MessageInfoStorage;
+        }
+
+        public bool Create(MessageInfoBindingModel model)
+        {
+            if (_messageInfoStorage.Insert(model) == null)
+            {
+                _logger.LogWarning("Insert operation failed");
+                return false;
+            }
+            return true;
+        }
+
+        public List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model)
+        {
+            _logger.LogInformation("ReadList. MessageId:{MessageId}.ClientId:{ClientId} ", model?.MessageId, model?.ClientId);
+            var list = (model == null) ? _messageInfoStorage.GetFullList() : _messageInfoStorage.GetFilteredList(model);
+            if (list == null)
+            {
+                _logger.LogWarning("ReadList return null list");
+                return null;
+            }
+            _logger.LogInformation("ReadList. Count:{Count}", list.Count);
+            return list;
+        }
+    }
+}
diff --git a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs
index 97f523b..7e6a6e1 100644
--- a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs
+++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs
@@ -10,6 +10,7 @@ using IceCreamShopContracts.SearchModels;
 using IceCreamShopContracts.StoragesContracts;
 using IceCreamShopContracts.ViewModels;
 using AbstractIceCreamShopDataModels.Enums;
+using IceCreamBusinessLogic.MailWorker;
 
 namespace IceCreamBusinessLogic.BusinessLogics
 {
@@ -17,12 +18,16 @@ namespace IceCreamBusinessLogic.BusinessLogics
     {
         private readonly ILogger _logger;
         private readonly IOrderStorage _orderStorage;
+		private readonly AbstractMailWorker _mailWorker;
+		private readonly IClientLogic _clientLogic;
 
-        public OrderLogic(IOrderStorage orderStorage, ILogger<OrderLogic> logger)
-        {
+		public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, AbstractMailWorker mailWorker, IClientLogic clientLogic)
+		{
             _orderStorage = orderStorage;
             _logger = logger;
-        }
+			_mailWorker = mailWorker;
+			_clientLogic = clientLogic;
+		}
 
         public bool CreateOrder(OrderBindingModel model)
         {
@@ -33,14 +38,15 @@ namespace IceCreamBusinessLogic.BusinessLogics
                 return false;
             }
             model.Status = OrderStatus.Принят;
-            if (_orderStorage.Insert(model) == null)
-            {
-                model.Status = OrderStatus.Неизвестен;
-                _logger.LogWarning("Insert operation failed");
-                return false;
-            }
-            return true;
-        }
+			var result = _orderStorage.Insert(model);
+			if (result == null)
+			{
+				_logger.LogWarning("Insert operation failed");
+				return false;
+			}
+			SendOrderStatusMail(result.ClientId, $"Новый заказ создан. Номер заказа #{result.Id}", $"Заказ #{result.Id} от {result.DateCreate} на сумму {result.Sum:0.00} принят");
+			return true;
+		}
 
         public bool DeliveryOrder(OrderBindingModel model)
         {
@@ -119,13 +125,15 @@ namespace IceCreamBusinessLogic.BusinessLogics
             model.IceCreamId = vmodel.IceCreamId;
             model.Sum = vmodel.Sum;
             model.Count = vmodel.Count;
-            if (_orderStorage.Update(model) == null)
-            {
-                _logger.LogWarning("Update operation failed");
-                return false;
-            }
-            return true;
-        }
+			var result = _orderStorage.Update(model);
+			if (result == null)
+			{
+				_logger.LogWarning("Update operation failed");
+				return false;
+			}
+			SendOrderStatusMail(result.ClientId, $"Изменен статус заказа #{result.Id}", $"Заказ #{model.Id} изменен статус на {result.Status}");
+			return true;
+		}
     
 
         public OrderViewModel? ReadElement(OrderSearchModel model)
@@ -144,5 +152,21 @@ namespace IceCreamBusinessLogic.BusinessLogics
             _logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
             return element;
         }
-    }
+
+		private bool SendOrderStatusMail(int clientId, string subject, string text)
+		{
+			var client = _clientLogic.ReadElement(new() { Id = clientId });
+			if (client == null)
+			{
+				return false;
+			}
+			_mailWorker.MailSendAsync(new()
+			{
+				MailAddress = client.Email,
+				Subject = subject,
+				Text = text
+			});
+			return true;
+		}
+	}
 }
diff --git a/IceCreamShop/IceCreamBusinessLogic/IceCreamBusinessLogic.csproj b/IceCreamShop/IceCreamBusinessLogic/IceCreamBusinessLogic.csproj
index b70c7ba..24e35c5 100644
--- a/IceCreamShop/IceCreamBusinessLogic/IceCreamBusinessLogic.csproj
+++ b/IceCreamShop/IceCreamBusinessLogic/IceCreamBusinessLogic.csproj
@@ -8,6 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
+    <PackageReference Include="MailKit" Version="3.6.0" />
     <PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
     <PackageReference Include="NLog.Extensions.Logging" Version="5.2.1" />
     <PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
diff --git a/IceCreamShop/IceCreamBusinessLogic/MailWorker/AbstractMailWorker.cs b/IceCreamShop/IceCreamBusinessLogic/MailWorker/AbstractMailWorker.cs
new file mode 100644
index 0000000..9c6e437
--- /dev/null
+++ b/IceCreamShop/IceCreamBusinessLogic/MailWorker/AbstractMailWorker.cs
@@ -0,0 +1,97 @@
+using IceCreamBusinessLogic.BusinessLogics;
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.BusinessLogicsContracts;
+using Microsoft.Extensions.Logging;
+
+namespace IceCreamBusinessLogic.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 IClientLogic _clientLogic;
+
+        private readonly ILogger _logger;
+
+        public AbstractMailWorker(ILogger<AbstractMailWorker> logger, IMessageInfoLogic messageInfoLogic, IClientLogic clientLogic)
+        {
+            _logger = logger;
+            _messageInfoLogic = messageInfoLogic;
+            _clientLogic = clientLogic;
+        }
+
+        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("Config: {login}, {password}, {clientHost}, {clientPOrt}, {popHost}, {popPort}", _mailLogin, _mailPassword, _smtpClientHost, _smtpClientPort, _popHost, _popPort);
+        }
+
+        public async void MailSendAsync(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("Send Mail: {To}, {Subject}", info.MailAddress, info.Subject);
+            await SendMailAsync(info);
+        }
+
+        public async void MailCheck()
+        {
+            if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
+            {
+                return;
+            }
+
+            if (string.IsNullOrEmpty(_popHost) || _popPort == 0)
+            {
+                return;
+            }
+
+            if (_messageInfoLogic == null)
+            {
+                return;
+            }
+
+            var list = await ReceiveMailAsync();
+            _logger.LogDebug("Check Mail: {Count} new mails", list.Count);
+            foreach (var mail in list)
+            {
+                mail.ClientId = _clientLogic.ReadElement(new() { Email = mail.SenderName })?.Id;
+                _messageInfoLogic.Create(mail);
+            }
+        }
+
+        protected abstract Task SendMailAsync(MailSendInfoBindingModel info);
+
+        protected abstract Task<List<MessageInfoBindingModel>> ReceiveMailAsync();
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamBusinessLogic/MailWorker/MailKitWorker.cs b/IceCreamShop/IceCreamBusinessLogic/MailWorker/MailKitWorker.cs
new file mode 100644
index 0000000..896cd31
--- /dev/null
+++ b/IceCreamShop/IceCreamBusinessLogic/MailWorker/MailKitWorker.cs
@@ -0,0 +1,78 @@
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.BusinessLogicsContracts;
+using MailKit.Net.Pop3;
+using MailKit.Security;
+using Microsoft.Extensions.Logging;
+using System.Net;
+using System.Net.Mail;
+using System.Text;
+
+namespace IceCreamBusinessLogic.MailWorker
+{
+    public class MailKitWorker : AbstractMailWorker
+    {
+        public MailKitWorker(ILogger<MailKitWorker> logger, IMessageInfoLogic messageInfoLogic, IClientLogic clientLogic) : base(logger, messageInfoLogic, clientLogic) { }
+
+        protected override async Task SendMailAsync(MailSendInfoBindingModel info)
+        {
+            using var objMailMessage = new MailMessage();
+            using var objSmtpClient = new SmtpClient(_smtpClientHost, _smtpClientPort);
+            try
+            {
+                objMailMessage.From = new MailAddress(_mailLogin);
+                objMailMessage.To.Add(new MailAddress(info.MailAddress));
+                objMailMessage.Subject = info.Subject;
+                objMailMessage.Body = info.Text;
+                objMailMessage.SubjectEncoding = Encoding.UTF8;
+                objMailMessage.BodyEncoding = Encoding.UTF8;
+
+                objSmtpClient.UseDefaultCredentials = false;
+                objSmtpClient.EnableSsl = true;
+                objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
+                objSmtpClient.Credentials = new NetworkCredential(_mailLogin, _mailPassword);
+
+                await Task.Run(() => objSmtpClient.Send(objMailMessage));
+            }
+            catch (Exception)
+            {
+                throw;
+            }
+        }
+
+        protected override async Task<List<MessageInfoBindingModel>> ReceiveMailAsync()
+        {
+            var list = new List<MessageInfoBindingModel>();
+            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)
+                        {
+                            list.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 list;
+        }
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShop/App.config b/IceCreamShop/IceCreamShop/App.config
new file mode 100644
index 0000000..8952286
--- /dev/null
+++ b/IceCreamShop/IceCreamShop/App.config
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<appSettings>
+		<add key="SmtpClientHost" value="smtp.gmail.com" />
+		<add key="SmtpClientPort" value="587" />
+		<add key="PopHost" value="pop.gmail.com" />
+		<add key="PopPort" value="995" />
+		<add key="MailLogin" value="icecreamshop2023tp@gmail.com" />
+		<add key="MailPassword" value="czts meyw wpbg miiv" />
+	</appSettings>
+</configuration>
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShop/FormMain.Designer.cs b/IceCreamShop/IceCreamShop/FormMain.Designer.cs
index 9a72c3b..8b20033 100644
--- a/IceCreamShop/IceCreamShop/FormMain.Designer.cs
+++ b/IceCreamShop/IceCreamShop/FormMain.Designer.cs
@@ -1,221 +1,222 @@
 namespace IceCreamShopView
 {
-    partial class FormMain
-    {
-        /// <summary>
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
+	partial class FormMain
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
 
-        /// <summary>
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
 
-        #region Windows Form Designer generated code
+		#region Windows Form Designer generated code
 
-        /// <summary>
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.buttonUpdate = new System.Windows.Forms.Button();
-            this.buttonSetToFinish = new System.Windows.Forms.Button();
-            this.buttonCreateOrder = new System.Windows.Forms.Button();
-            this.dataGridView = new System.Windows.Forms.DataGridView();
-            this.menuStrip = new System.Windows.Forms.MenuStrip();
-            this.справочникиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.компонентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.мороженоеToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.клиентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.ImplementersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.отчетыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.iceCreamComponentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.iceCreamToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.ordersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.DoWorkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
-            this.menuStrip.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // buttonUpdate
-            // 
-            this.buttonUpdate.Location = new System.Drawing.Point(1235, 149);
-            this.buttonUpdate.Name = "buttonUpdate";
-            this.buttonUpdate.Size = new System.Drawing.Size(194, 49);
-            this.buttonUpdate.TabIndex = 13;
-            this.buttonUpdate.Text = "Обновить";
-            this.buttonUpdate.UseVisualStyleBackColor = true;
-            this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click);
-            // 
-            // buttonSetToFinish
-            // 
-            this.buttonSetToFinish.Location = new System.Drawing.Point(1235, 94);
-            this.buttonSetToFinish.Name = "buttonSetToFinish";
-            this.buttonSetToFinish.Size = new System.Drawing.Size(194, 49);
-            this.buttonSetToFinish.TabIndex = 12;
-            this.buttonSetToFinish.Text = "Заказ выдан";
-            this.buttonSetToFinish.UseVisualStyleBackColor = true;
-            this.buttonSetToFinish.Click += new System.EventHandler(this.buttonSetToFinish_Click);
-            // 
-            // buttonCreateOrder
-            // 
-            this.buttonCreateOrder.Location = new System.Drawing.Point(1235, 39);
-            this.buttonCreateOrder.Name = "buttonCreateOrder";
-            this.buttonCreateOrder.Size = new System.Drawing.Size(194, 49);
-            this.buttonCreateOrder.TabIndex = 9;
-            this.buttonCreateOrder.Text = "Создать заказ";
-            this.buttonCreateOrder.UseVisualStyleBackColor = true;
-            this.buttonCreateOrder.Click += new System.EventHandler(this.buttonCreateOrder_Click);
-            // 
-            // dataGridView
-            // 
-            this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-            this.dataGridView.Location = new System.Drawing.Point(14, 35);
-            this.dataGridView.Name = "dataGridView";
-            this.dataGridView.RowHeadersWidth = 51;
-            this.dataGridView.RowTemplate.Height = 29;
-            this.dataGridView.Size = new System.Drawing.Size(1215, 407);
-            this.dataGridView.TabIndex = 8;
-            // 
-            // menuStrip
-            // 
-            this.menuStrip.ImageScalingSize = new System.Drawing.Size(20, 20);
-            this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.справочникиToolStripMenuItem,
-            this.отчетыToolStripMenuItem,
-            this.DoWorkToolStripMenuItem});
-            this.menuStrip.Location = new System.Drawing.Point(0, 0);
-            this.menuStrip.Name = "menuStrip";
-            this.menuStrip.Padding = new System.Windows.Forms.Padding(6, 3, 0, 3);
-            this.menuStrip.Size = new System.Drawing.Size(1441, 30);
-            this.menuStrip.TabIndex = 7;
-            this.menuStrip.Text = "Справочники";
-            // 
-            // справочникиToolStripMenuItem
-            // 
-            this.справочникиToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.компонентыToolStripMenuItem,
-            this.мороженоеToolStripMenuItem,
-            this.клиентыToolStripMenuItem,
-            this.ImplementersToolStripMenuItem});
-            this.справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
-            this.справочникиToolStripMenuItem.Size = new System.Drawing.Size(117, 24);
-            this.справочникиToolStripMenuItem.Text = "Справочники";
-            // 
-            // компонентыToolStripMenuItem
-            // 
-            this.компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem";
-            this.компонентыToolStripMenuItem.Size = new System.Drawing.Size(185, 26);
-            this.компонентыToolStripMenuItem.Text = "Компоненты";
-            this.компонентыToolStripMenuItem.Click += new System.EventHandler(this.компонентыToolStripMenuItem_Click);
-            // 
-            // мороженоеToolStripMenuItem
-            // 
-            this.мороженоеToolStripMenuItem.Name = "мороженоеToolStripMenuItem";
-            this.мороженоеToolStripMenuItem.Size = new System.Drawing.Size(185, 26);
-            this.мороженоеToolStripMenuItem.Text = "Мороженое";
-            this.мороженоеToolStripMenuItem.Click += new System.EventHandler(this.мороженоеToolStripMenuItem_Click);
-            // 
-            // клиентыToolStripMenuItem
-            // 
-            this.клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem";
-            this.клиентыToolStripMenuItem.Size = new System.Drawing.Size(185, 26);
-            this.клиентыToolStripMenuItem.Text = "Клиенты";
-            this.клиентыToolStripMenuItem.Click += new System.EventHandler(this.клиентыToolStripMenuItem_Click);
-            // 
-            // ImplementersToolStripMenuItem
-            // 
-            this.ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem";
-            this.ImplementersToolStripMenuItem.Size = new System.Drawing.Size(185, 26);
-            this.ImplementersToolStripMenuItem.Text = "Исполнители";
-            this.ImplementersToolStripMenuItem.Click += new System.EventHandler(this.ImplementersToolStripMenuItem_Click);
-            // 
-            // отчетыToolStripMenuItem
-            // 
-            this.отчетыToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.iceCreamComponentsToolStripMenuItem,
-            this.iceCreamToolStripMenuItem,
-            this.ordersToolStripMenuItem});
-            this.отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem";
-            this.отчетыToolStripMenuItem.Size = new System.Drawing.Size(73, 24);
-            this.отчетыToolStripMenuItem.Text = "Отчеты";
-            // 
-            // iceCreamComponentsToolStripMenuItem
-            // 
-            this.iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem";
-            this.iceCreamComponentsToolStripMenuItem.Size = new System.Drawing.Size(299, 26);
-            this.iceCreamComponentsToolStripMenuItem.Text = "Список мороженых";
-            this.iceCreamComponentsToolStripMenuItem.Click += new System.EventHandler(this.IceCreamsToolStripMenuItem_Click);
-            // 
-            // iceCreamToolStripMenuItem
-            // 
-            this.iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem";
-            this.iceCreamToolStripMenuItem.Size = new System.Drawing.Size(299, 26);
-            this.iceCreamToolStripMenuItem.Text = "Мороженые с компонентами";
-            this.iceCreamToolStripMenuItem.Click += new System.EventHandler(this.IceCreamComponentsToolStripMenuItem_Click);
-            // 
-            // ordersToolStripMenuItem
-            // 
-            this.ordersToolStripMenuItem.Name = "ordersToolStripMenuItem";
-            this.ordersToolStripMenuItem.Size = new System.Drawing.Size(299, 26);
-            this.ordersToolStripMenuItem.Text = "Список заказов";
-            this.ordersToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click);
-            // 
-            // DoWorkToolStripMenuItem
-            // 
-            this.DoWorkToolStripMenuItem.Name = "DoWorkToolStripMenuItem";
-            this.DoWorkToolStripMenuItem.Size = new System.Drawing.Size(114, 24);
-            this.DoWorkToolStripMenuItem.Text = "Запуск работ";
-            this.DoWorkToolStripMenuItem.Click += new System.EventHandler(this.DoWorkToolStripMenuItem_Click);
-            // 
-            // FormMain
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(1441, 463);
-            this.Controls.Add(this.buttonUpdate);
-            this.Controls.Add(this.buttonSetToFinish);
-            this.Controls.Add(this.buttonCreateOrder);
-            this.Controls.Add(this.dataGridView);
-            this.Controls.Add(this.menuStrip);
-            this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
-            this.Name = "FormMain";
-            this.Text = "Магазин мороженого";
-            this.Load += new System.EventHandler(this.FormMain_Load);
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
-            this.menuStrip.ResumeLayout(false);
-            this.menuStrip.PerformLayout();
-            this.ResumeLayout(false);
-            this.PerformLayout();
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			buttonUpdate = new Button();
+			buttonSetToFinish = new Button();
+			buttonCreateOrder = new Button();
+			dataGridView = new DataGridView();
+			menuStrip = new MenuStrip();
+			справочникиToolStripMenuItem = new ToolStripMenuItem();
+			компонентыToolStripMenuItem = new ToolStripMenuItem();
+			мороженоеToolStripMenuItem = new ToolStripMenuItem();
+			клиентыToolStripMenuItem = new ToolStripMenuItem();
+			ImplementersToolStripMenuItem = new ToolStripMenuItem();
+			отчетыToolStripMenuItem = new ToolStripMenuItem();
+			iceCreamComponentsToolStripMenuItem = new ToolStripMenuItem();
+			iceCreamToolStripMenuItem = new ToolStripMenuItem();
+			ordersToolStripMenuItem = new ToolStripMenuItem();
+			DoWorkToolStripMenuItem = new ToolStripMenuItem();
+			MailToolStripMenuItem = new ToolStripMenuItem();
+			((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
+			menuStrip.SuspendLayout();
+			SuspendLayout();
+			// 
+			// buttonUpdate
+			// 
+			buttonUpdate.Location = new Point(1081, 112);
+			buttonUpdate.Margin = new Padding(3, 2, 3, 2);
+			buttonUpdate.Name = "buttonUpdate";
+			buttonUpdate.Size = new Size(170, 37);
+			buttonUpdate.TabIndex = 13;
+			buttonUpdate.Text = "Обновить";
+			buttonUpdate.UseVisualStyleBackColor = true;
+			buttonUpdate.Click += buttonUpdate_Click;
+			// 
+			// buttonSetToFinish
+			// 
+			buttonSetToFinish.Location = new Point(1081, 70);
+			buttonSetToFinish.Margin = new Padding(3, 2, 3, 2);
+			buttonSetToFinish.Name = "buttonSetToFinish";
+			buttonSetToFinish.Size = new Size(170, 37);
+			buttonSetToFinish.TabIndex = 12;
+			buttonSetToFinish.Text = "Заказ выдан";
+			buttonSetToFinish.UseVisualStyleBackColor = true;
+			buttonSetToFinish.Click += buttonSetToFinish_Click;
+			// 
+			// buttonCreateOrder
+			// 
+			buttonCreateOrder.Location = new Point(1081, 29);
+			buttonCreateOrder.Margin = new Padding(3, 2, 3, 2);
+			buttonCreateOrder.Name = "buttonCreateOrder";
+			buttonCreateOrder.Size = new Size(170, 37);
+			buttonCreateOrder.TabIndex = 9;
+			buttonCreateOrder.Text = "Создать заказ";
+			buttonCreateOrder.UseVisualStyleBackColor = true;
+			buttonCreateOrder.Click += buttonCreateOrder_Click;
+			// 
+			// dataGridView
+			// 
+			dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+			dataGridView.Location = new Point(12, 26);
+			dataGridView.Margin = new Padding(3, 2, 3, 2);
+			dataGridView.Name = "dataGridView";
+			dataGridView.RowHeadersWidth = 51;
+			dataGridView.RowTemplate.Height = 29;
+			dataGridView.Size = new Size(1063, 305);
+			dataGridView.TabIndex = 8;
+			// 
+			// menuStrip
+			// 
+			menuStrip.ImageScalingSize = new Size(20, 20);
+			menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem, DoWorkToolStripMenuItem, MailToolStripMenuItem });
+			menuStrip.Location = new Point(0, 0);
+			menuStrip.Name = "menuStrip";
+			menuStrip.Padding = new Padding(5, 2, 0, 2);
+			menuStrip.Size = new Size(1261, 24);
+			menuStrip.TabIndex = 7;
+			menuStrip.Text = "Справочники";
+			// 
+			// справочникиToolStripMenuItem
+			// 
+			справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, мороженоеToolStripMenuItem, клиентыToolStripMenuItem, ImplementersToolStripMenuItem });
+			справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
+			справочникиToolStripMenuItem.Size = new Size(94, 20);
+			справочникиToolStripMenuItem.Text = "Справочники";
+			// 
+			// компонентыToolStripMenuItem
+			// 
+			компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem";
+			компонентыToolStripMenuItem.Size = new Size(149, 22);
+			компонентыToolStripMenuItem.Text = "Компоненты";
+			компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click;
+			// 
+			// мороженоеToolStripMenuItem
+			// 
+			мороженоеToolStripMenuItem.Name = "мороженоеToolStripMenuItem";
+			мороженоеToolStripMenuItem.Size = new Size(149, 22);
+			мороженоеToolStripMenuItem.Text = "Мороженое";
+			мороженоеToolStripMenuItem.Click += мороженоеToolStripMenuItem_Click;
+			// 
+			// клиентыToolStripMenuItem
+			// 
+			клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem";
+			клиентыToolStripMenuItem.Size = new Size(149, 22);
+			клиентыToolStripMenuItem.Text = "Клиенты";
+			клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click;
+			// 
+			// ImplementersToolStripMenuItem
+			// 
+			ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem";
+			ImplementersToolStripMenuItem.Size = new Size(149, 22);
+			ImplementersToolStripMenuItem.Text = "Исполнители";
+			ImplementersToolStripMenuItem.Click += ImplementersToolStripMenuItem_Click;
+			// 
+			// отчетыToolStripMenuItem
+			// 
+			отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { iceCreamComponentsToolStripMenuItem, iceCreamToolStripMenuItem, ordersToolStripMenuItem });
+			отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem";
+			отчетыToolStripMenuItem.Size = new Size(60, 20);
+			отчетыToolStripMenuItem.Text = "Отчеты";
+			// 
+			// iceCreamComponentsToolStripMenuItem
+			// 
+			iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem";
+			iceCreamComponentsToolStripMenuItem.Size = new Size(238, 22);
+			iceCreamComponentsToolStripMenuItem.Text = "Список мороженых";
+			iceCreamComponentsToolStripMenuItem.Click += IceCreamsToolStripMenuItem_Click;
+			// 
+			// iceCreamToolStripMenuItem
+			// 
+			iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem";
+			iceCreamToolStripMenuItem.Size = new Size(238, 22);
+			iceCreamToolStripMenuItem.Text = "Мороженые с компонентами";
+			iceCreamToolStripMenuItem.Click += IceCreamComponentsToolStripMenuItem_Click;
+			// 
+			// ordersToolStripMenuItem
+			// 
+			ordersToolStripMenuItem.Name = "ordersToolStripMenuItem";
+			ordersToolStripMenuItem.Size = new Size(238, 22);
+			ordersToolStripMenuItem.Text = "Список заказов";
+			ordersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click;
+			// 
+			// DoWorkToolStripMenuItem
+			// 
+			DoWorkToolStripMenuItem.Name = "DoWorkToolStripMenuItem";
+			DoWorkToolStripMenuItem.Size = new Size(92, 20);
+			DoWorkToolStripMenuItem.Text = "Запуск работ";
+			DoWorkToolStripMenuItem.Click += DoWorkToolStripMenuItem_Click;
+			// 
+			// MailToolStripMenuItem
+			// 
+			MailToolStripMenuItem.Name = "MailToolStripMenuItem";
+			MailToolStripMenuItem.Size = new Size(62, 20);
+			MailToolStripMenuItem.Text = "Письма";
+			MailToolStripMenuItem.Click += MailToolStripMenuItem_Click;
+			// 
+			// FormMain
+			// 
+			AutoScaleDimensions = new SizeF(7F, 15F);
+			AutoScaleMode = AutoScaleMode.Font;
+			ClientSize = new Size(1261, 347);
+			Controls.Add(buttonUpdate);
+			Controls.Add(buttonSetToFinish);
+			Controls.Add(buttonCreateOrder);
+			Controls.Add(dataGridView);
+			Controls.Add(menuStrip);
+			Name = "FormMain";
+			Text = "Магазин мороженого";
+			Load += FormMain_Load;
+			((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
+			menuStrip.ResumeLayout(false);
+			menuStrip.PerformLayout();
+			ResumeLayout(false);
+			PerformLayout();
+		}
 
-        }
+		#endregion
 
-        #endregion
-
-        private Button buttonUpdate;
-        private Button buttonSetToFinish;
-        private Button buttonCreateOrder;
-        private DataGridView dataGridView;
-        private MenuStrip menuStrip;
-        private ToolStripMenuItem справочникиToolStripMenuItem;
-        private ToolStripMenuItem компонентыToolStripMenuItem;
-        private ToolStripMenuItem мороженоеToolStripMenuItem;
-        private ToolStripMenuItem отчетыToolStripMenuItem;
-        private ToolStripMenuItem iceCreamComponentsToolStripMenuItem;
-        private ToolStripMenuItem iceCreamToolStripMenuItem;
-        private ToolStripMenuItem ordersToolStripMenuItem;
-        private ToolStripMenuItem клиентыToolStripMenuItem;
-        private ToolStripMenuItem ImplementersToolStripMenuItem;
-        private ToolStripMenuItem DoWorkToolStripMenuItem;
-    }
+		private Button buttonUpdate;
+		private Button buttonSetToFinish;
+		private Button buttonCreateOrder;
+		private DataGridView dataGridView;
+		private MenuStrip menuStrip;
+		private ToolStripMenuItem справочникиToolStripMenuItem;
+		private ToolStripMenuItem компонентыToolStripMenuItem;
+		private ToolStripMenuItem мороженоеToolStripMenuItem;
+		private ToolStripMenuItem отчетыToolStripMenuItem;
+		private ToolStripMenuItem iceCreamComponentsToolStripMenuItem;
+		private ToolStripMenuItem iceCreamToolStripMenuItem;
+		private ToolStripMenuItem ordersToolStripMenuItem;
+		private ToolStripMenuItem клиентыToolStripMenuItem;
+		private ToolStripMenuItem ImplementersToolStripMenuItem;
+		private ToolStripMenuItem DoWorkToolStripMenuItem;
+		private ToolStripMenuItem MailToolStripMenuItem;
+	}
 }
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShop/FormMain.cs b/IceCreamShop/IceCreamShop/FormMain.cs
index a7d5832..158f01d 100644
--- a/IceCreamShop/IceCreamShop/FormMain.cs
+++ b/IceCreamShop/IceCreamShop/FormMain.cs
@@ -16,213 +16,222 @@ using System.Windows.Forms;
 
 namespace IceCreamShopView
 {
-    public partial class FormMain : Form
-    {
-        private readonly ILogger _logger;
-        private readonly IOrderLogic _orderLogic;
-        private readonly IReportLogic _reportLogic;
+	public partial class FormMain : Form
+	{
+		private readonly ILogger _logger;
+		private readonly IOrderLogic _orderLogic;
+		private readonly IReportLogic _reportLogic;
 		private readonly IWorkProcess _workProcess;
-        public FormMain(ILogger<FormMain> logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess)
-        {
-            InitializeComponent();
-            _logger = logger;
-            _orderLogic = orderLogic;
-            _reportLogic = reportLogic;
-            _workProcess = workProcess;
-        }
+		public FormMain(ILogger<FormMain> logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess)
+		{
+			InitializeComponent();
+			_logger = logger;
+			_orderLogic = orderLogic;
+			_reportLogic = reportLogic;
+			_workProcess = workProcess;
+		}
 
-        private void FormMain_Load(object sender, EventArgs e)
-        {
-            LoadData();
-        }
+		private void FormMain_Load(object sender, EventArgs e)
+		{
+			LoadData();
+		}
 
-        private void LoadData()
-        {
-            _logger.LogInformation("Загрузка заказов");
-            try
-            {
-                var list = _orderLogic.ReadList(null);
-                if (list != null)
-                {
-                    dataGridView.DataSource = list;
-                    dataGridView.Columns["IceCreamId"].Visible = false;
-                    dataGridView.Columns["ClientId"].Visible = false;
-                    dataGridView.Columns["ImplementerId"].Visible = false;
-                }
-                _logger.LogInformation("Загрузка заказов");
-            }
-            catch (Exception ex)
-            {
-                _logger.LogError(ex, "Ошибка загрузки заказов");
-                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
-            }
-        }
+		private void LoadData()
+		{
+			_logger.LogInformation("Загрузка заказов");
+			try
+			{
+				var list = _orderLogic.ReadList(null);
+				if (list != null)
+				{
+					dataGridView.DataSource = list;
+					dataGridView.Columns["IceCreamId"].Visible = false;
+					dataGridView.Columns["ClientId"].Visible = false;
+					dataGridView.Columns["ImplementerId"].Visible = false;
+				}
+				_logger.LogInformation("Загрузка заказов");
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка загрузки заказов");
+				MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+			}
+		}
 
-        private void компонентыToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            var service = Program.ServiceProvider?.GetService(typeof(FormComponents));
-            if (service is FormComponents form)
-            {
-                form.ShowDialog();
-            }
-        }
+		private void компонентыToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormComponents));
+			if (service is FormComponents form)
+			{
+				form.ShowDialog();
+			}
+		}
 
-        private void мороженоеToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            var service = Program.ServiceProvider?.GetService(typeof(FormIceCreams));
-            if (service is FormIceCreams form)
-            {
-                form.ShowDialog();
-            }
-        }
+		private void мороженоеToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormIceCreams));
+			if (service is FormIceCreams form)
+			{
+				form.ShowDialog();
+			}
+		}
 
-        private void buttonCreateOrder_Click(object sender, EventArgs e)
-        {
-            var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder));
-            if (service is FormCreateOrder form)
-            {
-                form.ShowDialog();
-                LoadData();
-            }
-        }
+		private void buttonCreateOrder_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder));
+			if (service is FormCreateOrder form)
+			{
+				form.ShowDialog();
+				LoadData();
+			}
+		}
 
-        private void buttonSetToWork_Click(object sender, EventArgs e)
-        {
-            if (dataGridView.SelectedRows.Count == 1)
-            {
-                int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
-                _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id);
-                try
-                {
-                    var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel
-                    {
-                        Id = id,
-                    });
-                    if (!operationResult)
-                    {
-                        throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
-                    }
-                    LoadData();
-                }
-                catch (Exception ex)
-                {
-                    _logger.LogError(ex, "Ошибка передачи заказа в работу");
-                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
-                    MessageBoxIcon.Error);
-                }
-            }
-        }
+		private void buttonSetToWork_Click(object sender, EventArgs e)
+		{
+			if (dataGridView.SelectedRows.Count == 1)
+			{
+				int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
+				_logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id);
+				try
+				{
+					var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel
+					{
+						Id = id,
+					});
+					if (!operationResult)
+					{
+						throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
+					}
+					LoadData();
+				}
+				catch (Exception ex)
+				{
+					_logger.LogError(ex, "Ошибка передачи заказа в работу");
+					MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+					MessageBoxIcon.Error);
+				}
+			}
+		}
 
-        private void buttonSetToDone_Click(object sender, EventArgs e)
-        {
-            if (dataGridView.SelectedRows.Count == 1)
-            {
-                int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
-                _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id);
-                try
-                {
-                    var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel
-                    {
-                        Id = id,
-                    });
-                    if (!operationResult)
-                    {
-                        throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
-                    }
-                    LoadData();
-                }
-                catch (Exception ex)
-                {
-                    _logger.LogError(ex, "Ошибка отметки о готовности заказа");
-                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
-                }
-            }
-        }
+		private void buttonSetToDone_Click(object sender, EventArgs e)
+		{
+			if (dataGridView.SelectedRows.Count == 1)
+			{
+				int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
+				_logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id);
+				try
+				{
+					var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel
+					{
+						Id = id,
+					});
+					if (!operationResult)
+					{
+						throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
+					}
+					LoadData();
+				}
+				catch (Exception ex)
+				{
+					_logger.LogError(ex, "Ошибка отметки о готовности заказа");
+					MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+				}
+			}
+		}
 
-        private void buttonSetToFinish_Click(object sender, EventArgs e)
-        {
-            if (dataGridView.SelectedRows.Count == 1)
-            {
-                int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
-                _logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'", id);
-                try
-                {
-                    var operationResult = _orderLogic.FinishOrder(new OrderBindingModel
-                    {
-                        Id = id,
-                    });
-                    if (!operationResult)
-                    {
-                        throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
-                    }
-                    _logger.LogInformation("Заказ №{id} выдан", id);
-                    LoadData();
-                }
-                catch (Exception ex)
-                {
-                    _logger.LogError(ex, "Ошибка отметки о выдачи заказа");
-                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
-                }
-            }
-        }
+		private void buttonSetToFinish_Click(object sender, EventArgs e)
+		{
+			if (dataGridView.SelectedRows.Count == 1)
+			{
+				int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
+				_logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'", id);
+				try
+				{
+					var operationResult = _orderLogic.FinishOrder(new OrderBindingModel
+					{
+						Id = id,
+					});
+					if (!operationResult)
+					{
+						throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
+					}
+					_logger.LogInformation("Заказ №{id} выдан", id);
+					LoadData();
+				}
+				catch (Exception ex)
+				{
+					_logger.LogError(ex, "Ошибка отметки о выдачи заказа");
+					MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+				}
+			}
+		}
 
-        private void buttonUpdate_Click(object sender, EventArgs e)
-        {
-            LoadData();
-        }
+		private void buttonUpdate_Click(object sender, EventArgs e)
+		{
+			LoadData();
+		}
 
-        private void IceCreamsToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            using var dialog = new SaveFileDialog { Filter = "docx|*.docx" };
-            if (dialog.ShowDialog() == DialogResult.OK)
-            {
-                _reportLogic.SaveIceCreamsToWordFile(new ReportBindingModel { FileName = dialog.FileName });
-                MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
-            }
-        }
+		private void IceCreamsToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			using var dialog = new SaveFileDialog { Filter = "docx|*.docx" };
+			if (dialog.ShowDialog() == DialogResult.OK)
+			{
+				_reportLogic.SaveIceCreamsToWordFile(new ReportBindingModel { FileName = dialog.FileName });
+				MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
+			}
+		}
 
-        private void IceCreamComponentsToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            var service = Program.ServiceProvider?.GetService(typeof(FormReportProductComponents));
-            if (service is FormReportProductComponents form)
-            {
-                form.ShowDialog();
-            }
-        }
+		private void IceCreamComponentsToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormReportProductComponents));
+			if (service is FormReportProductComponents form)
+			{
+				form.ShowDialog();
+			}
+		}
 
-        private void OrdersToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders));
-            if (service is FormReportOrders form)
-            {
-                form.ShowDialog();
-            }
-        }
+		private void OrdersToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders));
+			if (service is FormReportOrders form)
+			{
+				form.ShowDialog();
+			}
+		}
 
-        private void клиентыToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            var service = Program.ServiceProvider?.GetService(typeof(FormClients));
-            if (service is FormClients form)
-            {
-                form.ShowDialog();
-            }
-        }
+		private void клиентыToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormClients));
+			if (service is FormClients form)
+			{
+				form.ShowDialog();
+			}
+		}
 
-        private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            var service = Program.ServiceProvider?.GetService(typeof(FormImplementers));
-            if (service is FormImplementers form)
-            {
-                form.ShowDialog();
-            }
-        }
+		private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormImplementers));
+			if (service is FormImplementers form)
+			{
+				form.ShowDialog();
+			}
+		}
 
-        private void DoWorkToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            _workProcess.DoWork((
-                Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!,_orderLogic);
-            MessageBox.Show("Процесс обработки запущен", "Сообщение",
-            MessageBoxButtons.OK, MessageBoxIcon.Information);
-        }
-    }
+		private void DoWorkToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			_workProcess.DoWork((
+				Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic);
+			MessageBox.Show("Процесс обработки запущен", "Сообщение",
+			MessageBoxButtons.OK, MessageBoxIcon.Information);
+		}
+
+		private void MailToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormViewMail));
+			if (service is FormViewMail form)
+			{
+				form.ShowDialog();
+			}
+		}
+	}
 }
diff --git a/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs b/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs
new file mode 100644
index 0000000..86ee139
--- /dev/null
+++ b/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs
@@ -0,0 +1,62 @@
+namespace IceCreamShopView
+{
+	partial class FormViewMail
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			dataGridView = new DataGridView();
+			((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
+			SuspendLayout();
+			// 
+			// dataGridView
+			// 
+			dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+			dataGridView.Dock = DockStyle.Fill;
+			dataGridView.Location = new Point(0, 0);
+			dataGridView.Name = "dataGridView";
+			dataGridView.RowTemplate.Height = 25;
+			dataGridView.Size = new Size(800, 450);
+			dataGridView.TabIndex = 1;
+			// 
+			// FormViewMail
+			// 
+			AutoScaleDimensions = new SizeF(7F, 15F);
+			AutoScaleMode = AutoScaleMode.Font;
+			ClientSize = new Size(800, 450);
+			Controls.Add(dataGridView);
+			Name = "FormViewMail";
+			Text = "Письма";
+			Load += FormViewMail_Load;
+			((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
+			ResumeLayout(false);
+		}
+
+		#endregion
+
+		private DataGridView dataGridView;
+	}
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShop/FormViewMail.cs b/IceCreamShop/IceCreamShop/FormViewMail.cs
new file mode 100644
index 0000000..a802c58
--- /dev/null
+++ b/IceCreamShop/IceCreamShop/FormViewMail.cs
@@ -0,0 +1,40 @@
+using IceCreamShopContracts.BusinessLogicsContracts;
+using Microsoft.Extensions.Logging;
+
+namespace IceCreamShopView
+{
+	public partial class FormViewMail : Form
+	{
+		private readonly ILogger _logger;
+		private readonly IMessageInfoLogic _logic;
+
+		public FormViewMail(ILogger<FormViewMail> logger, IMessageInfoLogic logic)
+		{
+			InitializeComponent();
+			_logger = logger;
+			_logic = logic;
+		}
+
+		private void FormViewMail_Load(object sender, EventArgs e)
+		{
+			try
+			{
+				var list = _logic.ReadList(null);
+				if (list != null)
+				{
+					dataGridView.DataSource = list;
+					dataGridView.Columns["ClientId"].Visible = false;
+					dataGridView.Columns["MessageId"].Visible = false;
+					dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+				}
+				_logger.LogInformation("Загрузка списка писем");
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка загрузки писем");
+				MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+				MessageBoxIcon.Error);
+			}
+		}
+	}
+}
diff --git a/IceCreamShop/IceCreamShop/FormViewMail.resx b/IceCreamShop/IceCreamShop/FormViewMail.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/IceCreamShop/IceCreamShop/FormViewMail.resx
@@ -0,0 +1,60 @@
+<root>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShop/IceCreamShopView.csproj b/IceCreamShop/IceCreamShop/IceCreamShopView.csproj
index 0faed3a..ef5c0ad 100644
--- a/IceCreamShop/IceCreamShop/IceCreamShopView.csproj
+++ b/IceCreamShop/IceCreamShop/IceCreamShopView.csproj
@@ -27,6 +27,9 @@
   </ItemGroup>
 
   <ItemGroup>
+    <None Update="App.config">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Update="ReportOrders.rdlc">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
diff --git a/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs
index 02ccaad..5d7d1a2 100644
--- a/IceCreamShop/IceCreamShop/Program.cs
+++ b/IceCreamShop/IceCreamShop/Program.cs
@@ -7,8 +7,10 @@ using Microsoft.Extensions.Logging;
 using NLog.Extensions.Logging;
 using IceCreamBusinessLogic.OfficePackage.Implements;
 using IceCreamBusinessLogic.OfficePackage;
-using IceCreamShopDatabaseImplement.Implements;
+using IceCreamShopFileImplement.Implements;
 using IceCreamBusinessLogic.BusinessLogic;
+using IceCreamBusinessLogic.MailWorker;
+using IceCreamShopContracts.BindingModels;
 
 namespace IceCreamShop
 {
@@ -29,6 +31,28 @@ namespace IceCreamShop
             ConfigureServices(services);
             _serviceProvider = services.BuildServiceProvider();
 
+            try
+            {
+                var mailSender = _serviceProvider.GetService<AbstractMailWorker>();
+                mailSender?.MailConfig(new MailConfigBindingModel
+                {
+                    MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty,
+                    MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty,
+                    SmtpClientHost = System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? string.Empty,
+                    SmtpClientPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]),
+                    PopHost = System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty,
+                    PopPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"])
+                });
+
+                // ������� ������
+                var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 100000);
+            }
+            catch (Exception ex)
+            {
+                var logger = _serviceProvider.GetService<ILogger>();
+                logger?.LogError(ex, "������ ������ � ������");
+            }
+
             Application.Run(_serviceProvider.GetRequiredService<FormMain>());
         }
 
@@ -44,14 +68,18 @@ namespace IceCreamShop
 			services.AddTransient<IImplementerStorage, ImplementerStorage>();
             services.AddTransient<IIceCreamStorage, IceCreamStorage>();
             services.AddTransient<IClientStorage, ClientStorage>();
+            services.AddTransient<IMessageInfoStorage, MessageInfoStorage>();
 
-			services.AddTransient<IClientLogic, ClientLogic>();
+            services.AddTransient<IClientLogic, ClientLogic>();
 			services.AddTransient<IImplementerLogic, ImplementerLogic>();
             services.AddTransient<IComponentLogic, ComponentLogic>();
             services.AddTransient<IOrderLogic, OrderLogic>();
             services.AddTransient<IIceCreamLogic, IceCreamLogic>();
             services.AddTransient<IReportLogic, ReportLogic>();
             services.AddTransient<IWorkProcess, WorkModeling>();
+            services.AddTransient<IMessageInfoLogic, MessageInfoLogic>();
+
+            services.AddSingleton<AbstractMailWorker, MailKitWorker>();
 
             services.AddTransient<AbstractSaveToExcel, SaveToExcel>();
             services.AddTransient<AbstractSaveToWord, SaveToWord>();
@@ -69,6 +97,8 @@ namespace IceCreamShop
             services.AddTransient<FormIceCreams>();
             services.AddTransient<FormReportProductComponents>();
             services.AddTransient<FormReportOrders>();
-        }
+			services.AddTransient<FormViewMail>();
+		}
+		private static void MailCheck(object obj) => ServiceProvider?.GetService<AbstractMailWorker>()?.MailCheck();
     }
 }
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs b/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs
index be2cb9b..cd24646 100644
--- a/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs
+++ b/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs
@@ -143,5 +143,15 @@ namespace IceCreamShopClientApp.Controllers
             var prod = APIClient.GetRequest<IceCreamViewModel>($"api/main/geticecream?icecreamId={icecream}");
             return count * (prod?.Price ?? 1);
         }
-    }
+
+		[HttpGet]
+		public IActionResult Mails()
+		{
+			if (APIClient.Client == null)
+			{
+				return Redirect("~/Home/Enter");
+			}
+			return View(APIClient.GetRequest<List<MessageInfoViewModel>>($"api/client/getmessages?clientId={APIClient.Client.Id}"));
+		}
+	}
 }
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml b/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml
new file mode 100644
index 0000000..54d27b0
--- /dev/null
+++ b/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml
@@ -0,0 +1,54 @@
+@using IceCreamShopContracts.ViewModels
+
+@model List<MessageInfoViewModel>
+
+@{
+	ViewData["Title"] = "Mails";
+}
+
+<div class="text-center">
+	<h1 class="display-4">Заказы</h1>
+</div>
+
+
+<div class="text-center">
+	@{
+		if (Model == null)
+		{
+			<h3 class="display-4">Авторизируйтесь</h3>
+			return;
+		}
+
+		<table class="table">
+			<thead>
+				<tr>
+					<th>
+						Дата письма
+					</th>
+					<th>
+						Заголовок
+					</th>
+					<th>
+						Текст
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				@foreach (var item in Model)
+				{
+					<tr>
+						<td>
+							@Html.DisplayFor(modelItem => item.DateDelivery)
+						</td>
+						<td>
+							@Html.DisplayFor(modelItem => item.Subject)
+						</td>
+						<td>
+							@Html.DisplayFor(modelItem => item.Body)
+						</td>
+					</tr>
+				}
+			</tbody>
+		</table>
+	}
+</div>
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml b/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml
index 50d8b00..1f41ab8 100644
--- a/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml
+++ b/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml
@@ -28,6 +28,9 @@
                         <li class="nav-item">
                             <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Личные данные</a>
                         </li>
+                        <li class="nav-item">
+                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Mails">Письма</a>
+                        </li>
                         <li class="nav-item">
                             <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Enter">Вход</a>
                         </li>
diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MailConfigBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MailConfigBindingModel.cs
new file mode 100644
index 0000000..26a6a2d
--- /dev/null
+++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MailConfigBindingModel.cs
@@ -0,0 +1,17 @@
+namespace IceCreamShopContracts.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; }
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MailSendInfoBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MailSendInfoBindingModel.cs
new file mode 100644
index 0000000..f09e154
--- /dev/null
+++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MailSendInfoBindingModel.cs
@@ -0,0 +1,11 @@
+namespace IceCreamShopContracts.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;
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs
new file mode 100644
index 0000000..7bab4ca
--- /dev/null
+++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs
@@ -0,0 +1,19 @@
+using AbstractIceCreamShopDataModels.Models;
+
+namespace IceCreamShopContracts.BindingModels
+{
+    public class MessageInfoBindingModel : IMessageInfoModel
+    {
+        public string MessageId { get; set; } = string.Empty;
+
+        public int? ClientId { get; set; }
+
+        public string SenderName { get; set; } = string.Empty;
+
+        public string Subject { get; set; } = string.Empty;
+
+        public string Body { get; set; } = string.Empty;
+
+        public DateTime DateDelivery { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs b/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs
new file mode 100644
index 0000000..9ceba41
--- /dev/null
+++ b/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs
@@ -0,0 +1,13 @@
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.SearchModels;
+using IceCreamShopContracts.ViewModels;
+
+namespace IceCreamShopContracts.BusinessLogicsContracts
+{
+    public interface IMessageInfoLogic
+    {
+        List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model);
+
+        bool Create(MessageInfoBindingModel model);
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs b/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs
new file mode 100644
index 0000000..da8e399
--- /dev/null
+++ b/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs
@@ -0,0 +1,9 @@
+namespace IceCreamShopContracts.SearchModels
+{
+    public class MessageInfoSearchModel
+    {
+        public int? ClientId { get; set; }
+
+        public string? MessageId { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs b/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs
new file mode 100644
index 0000000..9ac5688
--- /dev/null
+++ b/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs
@@ -0,0 +1,17 @@
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.SearchModels;
+using IceCreamShopContracts.ViewModels;
+
+namespace IceCreamShopContracts.StoragesContracts
+{
+    public interface IMessageInfoStorage
+    {
+        List<MessageInfoViewModel> GetFullList();
+
+        List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model);
+
+        MessageInfoViewModel? GetElement(MessageInfoSearchModel model);
+
+        MessageInfoViewModel? Insert(MessageInfoBindingModel model);
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs
new file mode 100644
index 0000000..c4e4a23
--- /dev/null
+++ b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs
@@ -0,0 +1,24 @@
+using AbstractIceCreamShopDataModels.Models;
+using System.ComponentModel;
+
+namespace IceCreamShopContracts.ViewModels
+{
+    public class MessageInfoViewModel : IMessageInfoModel
+    {
+        public string MessageId { get; set; } = string.Empty;
+
+        public int? ClientId { get; set; }
+
+        [DisplayName("Отправитель")]
+        public string SenderName { get; set; } = string.Empty;
+
+        [DisplayName("Дата письма")]
+        public DateTime DateDelivery { get; set; }
+
+        [DisplayName("Заголовок")]
+        public string Subject { get; set; } = string.Empty;
+
+        [DisplayName("Текст")]
+        public string Body { get; set; } = string.Empty;
+    }
+}
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs b/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs
new file mode 100644
index 0000000..ac4fccb
--- /dev/null
+++ b/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs
@@ -0,0 +1,13 @@
+namespace AbstractIceCreamShopDataModels.Models
+{
+    public interface IMessageInfoModel
+    {
+        string MessageId { get; }
+        int? ClientId { get; }
+        string SenderName { get; }
+        DateTime DateDelivery { get; }
+        string Subject { get; }
+        string Body { get; }
+
+    }
+}
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabase.cs b/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabase.cs
index 152e4dd..58a0784 100644
--- a/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabase.cs
+++ b/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabase.cs
@@ -25,5 +25,7 @@ namespace IceCreamShopDatabaseImplement
         public virtual DbSet<Client> Clients { set; get; }
 
         public virtual DbSet<Implementer> Implementers { set; get; }
+
+        public virtual DbSet<MessageInfo> Messages { set; get; }
     }
 }
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs
new file mode 100644
index 0000000..4186d90
--- /dev/null
+++ b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs
@@ -0,0 +1,52 @@
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.SearchModels;
+using IceCreamShopContracts.StoragesContracts;
+using IceCreamShopContracts.ViewModels;
+using IceCreamShopDatabaseImplement.Models;
+
+namespace IceCreamShopDatabaseImplement.Implements
+{
+    public class MessageInfoStorage : IMessageInfoStorage
+    {
+
+        public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
+        {
+            using var context = new IceCreamShopDatabase();
+            if (model.MessageId != null)
+            {
+                return context.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel;
+            }
+            return null;
+        }
+
+        public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
+        {
+            using var context = new IceCreamShopDatabase();
+            return context.Messages
+                .Where(x => x.ClientId == model.ClientId)
+                .Select(x => x.GetViewModel)
+                .ToList();
+        }
+
+        public List<MessageInfoViewModel> GetFullList()
+        {
+            using var context = new IceCreamShopDatabase();
+            return context.Messages
+                .Select(x => x.GetViewModel)
+                .ToList();
+        }
+
+        public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
+        {
+            using var context = new IceCreamShopDatabase();
+            var newMessage = MessageInfo.Create(model);
+            if (newMessage == null || context.Messages.Any(x => x.MessageId.Equals(model.MessageId)))
+            {
+                return null;
+            }
+            context.Messages.Add(newMessage);
+            context.SaveChanges();
+            return newMessage.GetViewModel;
+        }
+    }
+}
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs
new file mode 100644
index 0000000..d32d702
--- /dev/null
+++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs
@@ -0,0 +1,298 @@
+// <auto-generated />
+using System;
+using IceCreamShopDatabaseImplement;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace IceCreamShopDatabaseImplement.Migrations
+{
+    [DbContext(typeof(IceCreamShopDatabase))]
+    [Migration("20230411104402_LabWork07_mail")]
+    partial class LabWork07_mail
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "7.0.3")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ClientFIO")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Clients");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Component", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ComponentName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<double>("Cost")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Components");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCream", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("IceCreamName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<double>("Price")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("IceCreams");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCreamComponent", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<int>("ComponentId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Count")
+                        .HasColumnType("int");
+
+                    b.Property<int>("IceCreamId")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ComponentId");
+
+                    b.HasIndex("IceCreamId");
+
+                    b.ToTable("IceCreamComponents");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Implementer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ImplementerFIO")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Qualification")
+                        .HasColumnType("int");
+
+                    b.Property<int>("WorkExperience")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Implementers");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b =>
+                {
+                    b.Property<string>("MessageId")
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<string>("Body")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int?>("ClientId")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("DateDelivery")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("SenderName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("MessageId");
+
+                    b.HasIndex("ClientId");
+
+                    b.ToTable("Messages");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<int>("ClientId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Count")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("DateCreate")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DateImplement")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("IceCreamId")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("ImplementerId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<double>("Sum")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ClientId");
+
+                    b.HasIndex("IceCreamId");
+
+                    b.HasIndex("ImplementerId");
+
+                    b.ToTable("Orders");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCreamComponent", b =>
+                {
+                    b.HasOne("IceCreamShopDatabaseImplement.Models.Component", "Component")
+                        .WithMany("IceCreamComponents")
+                        .HasForeignKey("ComponentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream")
+                        .WithMany("Components")
+                        .HasForeignKey("IceCreamId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Component");
+
+                    b.Navigation("IceCream");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b =>
+                {
+                    b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client")
+                        .WithMany("Messages")
+                        .HasForeignKey("ClientId");
+
+                    b.Navigation("Client");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b =>
+                {
+                    b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client")
+                        .WithMany("Orders")
+                        .HasForeignKey("ClientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream")
+                        .WithMany("Orders")
+                        .HasForeignKey("IceCreamId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("IceCreamShopDatabaseImplement.Models.Implementer", "Implementer")
+                        .WithMany("Orders")
+                        .HasForeignKey("ImplementerId");
+
+                    b.Navigation("Client");
+
+                    b.Navigation("IceCream");
+
+                    b.Navigation("Implementer");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b =>
+                {
+                    b.Navigation("Messages");
+
+                    b.Navigation("Orders");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Component", b =>
+                {
+                    b.Navigation("IceCreamComponents");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCream", b =>
+                {
+                    b.Navigation("Components");
+
+                    b.Navigation("Orders");
+                });
+
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Implementer", b =>
+                {
+                    b.Navigation("Orders");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs
new file mode 100644
index 0000000..a12b1f8
--- /dev/null
+++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs
@@ -0,0 +1,48 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace IceCreamShopDatabaseImplement.Migrations
+{
+    /// <inheritdoc />
+    public partial class LabWork07_mail : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.CreateTable(
+                name: "Messages",
+                columns: table => new
+                {
+                    MessageId = table.Column<string>(type: "nvarchar(450)", nullable: false),
+                    ClientId = table.Column<int>(type: "int", nullable: true),
+                    SenderName = table.Column<string>(type: "nvarchar(max)", nullable: false),
+                    DateDelivery = table.Column<DateTime>(type: "datetime2", nullable: false),
+                    Subject = table.Column<string>(type: "nvarchar(max)", nullable: false),
+                    Body = table.Column<string>(type: "nvarchar(max)", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_Messages", x => x.MessageId);
+                    table.ForeignKey(
+                        name: "FK_Messages_Clients_ClientId",
+                        column: x => x.ClientId,
+                        principalTable: "Clients",
+                        principalColumn: "Id");
+                });
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Messages_ClientId",
+                table: "Messages",
+                column: "ClientId");
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "Messages");
+        }
+    }
+}
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs
index e6fe34e..e090d57 100644
--- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs
+++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs
@@ -140,6 +140,36 @@ namespace IceCreamShopDatabaseImplement.Migrations
                     b.ToTable("Implementers");
                 });
 
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b =>
+                {
+                    b.Property<string>("MessageId")
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<string>("Body")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int?>("ClientId")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("DateDelivery")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("SenderName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("MessageId");
+
+                    b.HasIndex("ClientId");
+
+                    b.ToTable("Messages");
+                });
+
             modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b =>
                 {
                     b.Property<int>("Id")
@@ -202,6 +232,15 @@ namespace IceCreamShopDatabaseImplement.Migrations
                     b.Navigation("IceCream");
                 });
 
+            modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b =>
+                {
+                    b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client")
+                        .WithMany("Messages")
+                        .HasForeignKey("ClientId");
+
+                    b.Navigation("Client");
+                });
+
             modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b =>
                 {
                     b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client")
@@ -229,6 +268,8 @@ namespace IceCreamShopDatabaseImplement.Migrations
 
             modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b =>
                 {
+                    b.Navigation("Messages");
+
                     b.Navigation("Orders");
                 });
 
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs
index 6bdc89d..d581f9d 100644
--- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs
+++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs
@@ -22,7 +22,10 @@ namespace IceCreamShopDatabaseImplement.Models
         [ForeignKey("ClientId")]
         public virtual List<Order> Orders { get; set; } = new();
 
-        public static Client? Create(ClientBindingModel model)
+		[ForeignKey("ClientId")]
+		public virtual List<MessageInfo> Messages { get; set; } = new();
+
+		public static Client? Create(ClientBindingModel model)
         {
             if (model == null)
             {
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs
new file mode 100644
index 0000000..9c6b65b
--- /dev/null
+++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs
@@ -0,0 +1,52 @@
+using AbstractIceCreamShopDataModels.Models;
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.ViewModels;
+using System.ComponentModel.DataAnnotations;
+
+namespace IceCreamShopDatabaseImplement.Models
+{
+    public class MessageInfo : IMessageInfoModel
+    {
+        [Key]
+        public string MessageId { get; private set; } = string.Empty;
+
+        public int? ClientId { get; private set; }
+
+        public string SenderName { get; private set; } = string.Empty;
+
+        public DateTime DateDelivery { get; private set; } = DateTime.Now;
+
+        public string Subject { get; private set; } = string.Empty;
+
+        public string Body { get; private set; } = string.Empty;
+
+        public Client? Client { get; private set; }
+
+        public static MessageInfo? Create(MessageInfoBindingModel model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new()
+            {
+                Body = model.Body,
+                Subject = model.Subject,
+                ClientId = model.ClientId,
+                MessageId = model.MessageId,
+                SenderName = model.SenderName,
+                DateDelivery = model.DateDelivery,
+            };
+        }
+
+        public MessageInfoViewModel GetViewModel => new()
+        {
+            Body = Body,
+            Subject = Subject,
+            ClientId = ClientId,
+            MessageId = MessageId,
+            SenderName = SenderName,
+            DateDelivery = DateDelivery,
+        };
+    }
+}
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs
index 4568883..4b0b6ac 100644
--- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs
+++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs
@@ -76,9 +76,9 @@ namespace IceCreamShopDatabaseImplement.Models
                     DateCreate = DateCreate,
                     DateImplement = DateImplement,
                     Id = Id,
-                    IceCreamName = context.IceCreams.FirstOrDefault(x => x.Id == IceCreamId)?.IceCreamName ?? string.Empty,
-                    ImplementerFIO = context.Implementers.FirstOrDefault(x => x.Id == ImplementerId)?.ImplementerFIO ?? string.Empty,
-                    ClientFIO = Client?.ClientFIO ?? string.Empty,
+                    IceCreamName = IceCream?.IceCreamName ?? string.Empty,
+                    ImplementerFIO = Implementer?.ImplementerFIO ?? string.Empty,
+					ClientFIO = Client?.ClientFIO ?? string.Empty,
                 };
             }
         }
diff --git a/IceCreamShop/IceCreamShopFileImplement/DataFileSingleton.cs b/IceCreamShop/IceCreamShopFileImplement/DataFileSingleton.cs
index 2c9c08c..407dad1 100644
--- a/IceCreamShop/IceCreamShopFileImplement/DataFileSingleton.cs
+++ b/IceCreamShop/IceCreamShopFileImplement/DataFileSingleton.cs
@@ -16,11 +16,13 @@ namespace IceCreamShopFileImplement
         private readonly string IceCreamFileName = "IceCream.xml";
         private readonly string ClientFileName = "Client.xml";
         private readonly string ImplementerFileName = "Implementer.xml";
+        private readonly string MessageInfoFileName = "MessageInfo.xml";        
         public List<Component> Components { get; private set; }
         public List<Order> Orders { get; private set; }
         public List<IceCream> IceCreams { get; private set; }
         public List<Client> Clients { get; private set; }
         public List<Implementer> Implementers { get; private set; }
+        public List<MessageInfo> Messages { get; private set; }
         public static DataFileSingleton GetInstance()
         {
             if (instance == null)
@@ -34,6 +36,7 @@ namespace IceCreamShopFileImplement
         public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
         public void SaveClients() => SaveData(Clients, OrderFileName, "Clients", x => x.GetXElement);
         public void SaveImplementers() => SaveData(Orders, ImplementerFileName, "Implementers", x => x.GetXElement);
+        public void SaveMessages() => SaveData(Orders, ImplementerFileName, "Messages", x => x.GetXElement);
         private DataFileSingleton()
         {
             Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!;
@@ -41,6 +44,7 @@ namespace IceCreamShopFileImplement
             Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
             Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!;
             Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!;
+            Messages = LoadData(MessageInfoFileName, "MessageInfo", x => MessageInfo.Create(x)!)!;
         }
         private static List<T>? LoadData<T>(string filename, string xmlNodeName, Func<XElement, T> selectFunction)
         {
diff --git a/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs
new file mode 100644
index 0000000..1ee91b0
--- /dev/null
+++ b/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs
@@ -0,0 +1,53 @@
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.SearchModels;
+using IceCreamShopContracts.StoragesContracts;
+using IceCreamShopContracts.ViewModels;
+using IceCreamShopFileImplement.Models;
+
+namespace IceCreamShopFileImplement.Implements
+{
+    public class MessageInfoStorage : IMessageInfoStorage
+    {
+        private readonly DataFileSingleton _source;
+        public MessageInfoStorage()
+        {
+            _source = DataFileSingleton.GetInstance();
+        }
+
+        public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
+        {
+            if (model.MessageId != null)
+            {
+                return _source.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel;
+            }
+            return null;
+        }
+
+        public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
+        {
+            return _source.Messages
+                .Where(x => x.ClientId == model.ClientId)
+                .Select(x => x.GetViewModel)
+                .ToList();
+        }
+
+        public List<MessageInfoViewModel> GetFullList()
+        {
+            return _source.Messages
+                .Select(x => x.GetViewModel)
+                .ToList();
+        }
+
+        public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
+        {
+            var newMessage = MessageInfo.Create(model);
+            if (newMessage == null)
+            {
+                return null;
+            }
+            _source.Messages.Add(newMessage);
+            _source.SaveMessages();
+            return newMessage.GetViewModel;
+        }
+    }
+}
diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs
new file mode 100644
index 0000000..aa31ba3
--- /dev/null
+++ b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs
@@ -0,0 +1,75 @@
+using AbstractIceCreamShopDataModels.Models;
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.ViewModels;
+using System.Xml.Linq;
+
+namespace IceCreamShopFileImplement.Models
+{
+    public class MessageInfo : IMessageInfoModel
+    {
+        public string MessageId { get; private set; } = string.Empty;
+
+        public int? ClientId { get; private set; }
+
+        public string SenderName { get; private set; } = string.Empty;
+
+        public DateTime DateDelivery { get; private set; } = DateTime.Now;
+
+        public string Subject { get; private set; } = string.Empty;
+
+        public string Body { get; private set; } = string.Empty;
+
+        public static MessageInfo? Create(MessageInfoBindingModel model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new()
+            {
+                Body = model.Body,
+                Subject = model.Subject,
+                ClientId = model.ClientId,
+                MessageId = model.MessageId,
+                SenderName = model.SenderName,
+                DateDelivery = model.DateDelivery,
+            };
+        }
+
+        public static MessageInfo? Create(XElement element)
+        {
+            if (element == null)
+            {
+                return null;
+            }
+            return new()
+            {
+                Body = element.Attribute("Body")!.Value,
+                Subject = element.Attribute("Subject")!.Value,
+                ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value),
+                MessageId = element.Attribute("MessageId")!.Value,
+                SenderName = element.Attribute("SenderName")!.Value,
+                DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value),
+            };
+        }
+
+        public MessageInfoViewModel GetViewModel => new()
+        {
+            Body = Body,
+            Subject = Subject,
+            ClientId = ClientId,
+            MessageId = MessageId,
+            SenderName = SenderName,
+            DateDelivery = DateDelivery,
+        };
+
+        public XElement GetXElement => new("MessageInfo",
+            new XAttribute("Body", Body),
+            new XAttribute("Subject", Subject),
+            new XAttribute("ClientId", ClientId),
+            new XAttribute("MessageId", MessageId),
+            new XAttribute("SenderName", SenderName),
+            new XAttribute("DateDelivery", DateDelivery)
+            );
+    }
+}
diff --git a/IceCreamShop/IceCreamShopListImplement/DataListSingleton.cs b/IceCreamShop/IceCreamShopListImplement/DataListSingleton.cs
index f4e9cbd..56bb515 100644
--- a/IceCreamShop/IceCreamShopListImplement/DataListSingleton.cs
+++ b/IceCreamShop/IceCreamShopListImplement/DataListSingleton.cs
@@ -10,6 +10,7 @@ namespace IceCreamShopListImplement
         public List<IceCream> iceCreams { get; set; }
         public List<Client> Clients { get; set; }
         public List<Implementer> Implementers { get; set; }
+        public List<MessageInfo> Messages { get; set; }
 
         private DataListSingleton()
         {
@@ -18,6 +19,7 @@ namespace IceCreamShopListImplement
             iceCreams = new List<IceCream>();
             Clients = new List<Client>();
             Implementers = new List<Implementer>();
+            Messages = new List<MessageInfo>();
         }
         public static DataListSingleton GetInstance()
         {
diff --git a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs
new file mode 100644
index 0000000..3917486
--- /dev/null
+++ b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs
@@ -0,0 +1,60 @@
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.SearchModels;
+using IceCreamShopContracts.ViewModels;
+using IceCreamShopListImplement.Models;
+
+namespace IceCreamShopListImplement.Implements
+{
+    public class MessageInfoStorage
+    {
+        private readonly DataListSingleton _source;
+        public MessageInfoStorage()
+        {
+            _source = DataListSingleton.GetInstance();
+        }
+
+        public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
+        {
+            foreach (var message in _source.Messages)
+            {
+                if (model.MessageId != null && model.MessageId.Equals(message.MessageId))
+                    return message.GetViewModel;
+            }
+            return null;
+        }
+
+        public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
+        {
+            List<MessageInfoViewModel> result = new();
+            foreach (var item in _source.Messages)
+            {
+                if (item.ClientId.HasValue && item.ClientId == model.ClientId)
+                {
+                    result.Add(item.GetViewModel);
+                }
+            }
+            return result;
+        }
+
+        public List<MessageInfoViewModel> GetFullList()
+        {
+            List<MessageInfoViewModel> result = new();
+            foreach (var item in _source.Messages)
+            {
+                result.Add(item.GetViewModel);
+            }
+            return result;
+        }
+
+        public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
+        {
+            var newMessage = MessageInfo.Create(model);
+            if (newMessage == null)
+            {
+                return null;
+            }
+            _source.Messages.Add(newMessage);
+            return newMessage.GetViewModel;
+        }
+    }
+}
diff --git a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs
new file mode 100644
index 0000000..240ac3e
--- /dev/null
+++ b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs
@@ -0,0 +1,49 @@
+using AbstractIceCreamShopDataModels.Models;
+using IceCreamShopContracts.BindingModels;
+using IceCreamShopContracts.ViewModels;
+
+namespace IceCreamShopListImplement.Models
+{
+    public class MessageInfo : IMessageInfoModel
+    {
+        public string MessageId { get; private set; } = string.Empty;
+
+        public int? ClientId { get; private set; }
+
+        public string SenderName { get; private set; } = string.Empty;
+
+        public DateTime DateDelivery { get; private set; } = DateTime.Now;
+
+        public string Subject { get; private set; } = string.Empty;
+
+        public string Body { get; private set; } = string.Empty;
+
+        public static MessageInfo? Create(MessageInfoBindingModel model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new()
+            {
+                Body = model.Body,
+                Subject = model.Subject,
+                ClientId = model.ClientId,
+                MessageId = model.MessageId,
+                SenderName = model.SenderName,
+                DateDelivery = model.DateDelivery,
+            };
+        }
+
+        public MessageInfoViewModel GetViewModel => new()
+        {
+            Body = Body,
+            Subject = Subject,
+            ClientId = ClientId,
+            MessageId = MessageId,
+            SenderName = SenderName,
+            DateDelivery = DateDelivery,
+        };
+
+    }
+}
diff --git a/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs b/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs
index a1a7b8a..71f434c 100644
--- a/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs
+++ b/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs
@@ -14,10 +14,13 @@ namespace IceCreamShopRestApi.Controllers
 
         private readonly IClientLogic _logic;
 
-        public ClientController(IClientLogic logic, ILogger<ClientController> logger)
+        private readonly IMessageInfoLogic _mailLogic;
+
+        public ClientController(IClientLogic logic, IMessageInfoLogic mailLogic, ILogger<ClientController> logger)
         {
             _logger = logger;
             _logic = logic;
+            _mailLogic = mailLogic;
         }
 
         [HttpGet]
@@ -65,5 +68,22 @@ namespace IceCreamShopRestApi.Controllers
                 throw;
             }
         }
+
+        [HttpGet]
+        public List<MessageInfoViewModel>? GetMessages(int clientId)
+        {
+            try
+            {
+                return _mailLogic.ReadList(new MessageInfoSearchModel
+                {
+                    ClientId = clientId
+                });
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Ошибка получения писем клиента");
+                throw;
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj b/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj
index 8e1ebc5..a9229d5 100644
--- a/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj
+++ b/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj
@@ -15,6 +15,7 @@
     <ProjectReference Include="..\IceCreamBusinessLogic\IceCreamBusinessLogic.csproj" />
     <ProjectReference Include="..\IceCreamShopContracts\IceCreamShopContracts.csproj" />
     <ProjectReference Include="..\IceCreamShopDatabaseImplement\IceCreamShopDatabaseImplement.csproj" />
+    <ProjectReference Include="..\IceCreamShopFileImplement\IceCreamShopFileImplement.csproj" />
   </ItemGroup>
 
 </Project>
diff --git a/IceCreamShop/IceCreamShopRestApi/Order.xml b/IceCreamShop/IceCreamShopRestApi/Order.xml
new file mode 100644
index 0000000..58e6d39
--- /dev/null
+++ b/IceCreamShop/IceCreamShopRestApi/Order.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Clients>
+  <Client Id="1">
+    <FIO>user</FIO>
+    <Email>icecreamshop2023tp@gmail.com</Email>
+    <Password>user</Password>
+  </Client>
+</Clients>
\ No newline at end of file
diff --git a/IceCreamShop/IceCreamShopRestApi/Program.cs b/IceCreamShop/IceCreamShopRestApi/Program.cs
index 26af849..c438187 100644
--- a/IceCreamShop/IceCreamShopRestApi/Program.cs
+++ b/IceCreamShop/IceCreamShopRestApi/Program.cs
@@ -1,7 +1,9 @@
 using IceCreamBusinessLogic.BusinessLogics;
+using IceCreamBusinessLogic.MailWorker;
+using IceCreamShopContracts.BindingModels;
 using IceCreamShopContracts.BusinessLogicsContracts;
 using IceCreamShopContracts.StoragesContracts;
-using IceCreamShopDatabaseImplement.Implements;
+using IceCreamShopFileImplement.Implements;
 using Microsoft.OpenApi.Models;
 
 var builder = WebApplication.CreateBuilder(args);
@@ -14,11 +16,15 @@ builder.Services.AddTransient<IImplementerStorage, ImplementerStorage>();
 builder.Services.AddTransient<IClientStorage, ClientStorage>();
 builder.Services.AddTransient<IOrderStorage, OrderStorage>();
 builder.Services.AddTransient<IIceCreamStorage, IceCreamStorage>();
+builder.Services.AddTransient<IMessageInfoStorage, MessageInfoStorage>();
 
 builder.Services.AddTransient<IImplementerLogic, ImplementerLogic>();
 builder.Services.AddTransient<IOrderLogic, OrderLogic>();
 builder.Services.AddTransient<IClientLogic, ClientLogic>();
 builder.Services.AddTransient<IIceCreamLogic, IceCreamLogic>();
+builder.Services.AddTransient<IMessageInfoLogic, MessageInfoLogic>();
+
+builder.Services.AddSingleton<AbstractMailWorker, MailKitWorker>();
 
 builder.Services.AddControllers();
 // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
@@ -30,6 +36,17 @@ builder.Services.AddSwaggerGen(c =>
 
 var app = builder.Build();
 
+var mailSender = app.Services.GetService<AbstractMailWorker>();
+mailSender?.MailConfig(new MailConfigBindingModel
+{
+    MailLogin = builder.Configuration?.GetSection("MailLogin")?.Value?.ToString() ?? string.Empty,
+    MailPassword = builder.Configuration?.GetSection("MailPassword")?.Value?.ToString() ?? string.Empty,
+    SmtpClientHost = builder.Configuration?.GetSection("SmtpClientHost")?.Value?.ToString() ?? string.Empty,
+    SmtpClientPort = Convert.ToInt32(builder.Configuration?.GetSection("SmtpClientPort")?.Value?.ToString()),
+    PopHost = builder.Configuration?.GetSection("PopHost")?.Value?.ToString() ?? string.Empty,
+    PopPort = Convert.ToInt32(builder.Configuration?.GetSection("PopPort")?.Value?.ToString())
+});
+
 // Configure the HTTP request pipeline.
 if (app.Environment.IsDevelopment())
 {
diff --git a/IceCreamShop/IceCreamShopRestApi/appsettings.json b/IceCreamShop/IceCreamShopRestApi/appsettings.json
index 10f68b8..48d6a5e 100644
--- a/IceCreamShop/IceCreamShopRestApi/appsettings.json
+++ b/IceCreamShop/IceCreamShopRestApi/appsettings.json
@@ -5,5 +5,12 @@
       "Microsoft.AspNetCore": "Warning"
     }
   },
-  "AllowedHosts": "*"
+  "AllowedHosts": "*",
+
+  "SmtpClientHost": "smtp.gmail.com",
+  "SmtpClientPort": "587",
+  "PopHost": "pop.gmail.com",
+  "PopPort": "995",
+  "MailLogin": "icecreamshop2023tp@gmail.com",
+  "MailPassword": "czts meyw wpbg miiv"
 }

From 25f51edbdc1adb577d25be6d3747cba5fe6b443d Mon Sep 17 00:00:00 2001
From: Ino <irisha1234517@gmail.com>
Date: Tue, 11 Apr 2023 15:39:54 +0400
Subject: [PATCH 2/2] =?UTF-8?q?=D0=B1=D0=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 IceCreamShop/IceCreamShop/Program.cs                        | 2 +-
 IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj | 1 -
 IceCreamShop/IceCreamShopRestApi/Program.cs                 | 2 +-
 3 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs
index 5d7d1a2..9383722 100644
--- a/IceCreamShop/IceCreamShop/Program.cs
+++ b/IceCreamShop/IceCreamShop/Program.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Logging;
 using NLog.Extensions.Logging;
 using IceCreamBusinessLogic.OfficePackage.Implements;
 using IceCreamBusinessLogic.OfficePackage;
-using IceCreamShopFileImplement.Implements;
+using IceCreamShopDatabaseImplement.Implements;
 using IceCreamBusinessLogic.BusinessLogic;
 using IceCreamBusinessLogic.MailWorker;
 using IceCreamShopContracts.BindingModels;
diff --git a/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj b/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj
index a9229d5..8e1ebc5 100644
--- a/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj
+++ b/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj
@@ -15,7 +15,6 @@
     <ProjectReference Include="..\IceCreamBusinessLogic\IceCreamBusinessLogic.csproj" />
     <ProjectReference Include="..\IceCreamShopContracts\IceCreamShopContracts.csproj" />
     <ProjectReference Include="..\IceCreamShopDatabaseImplement\IceCreamShopDatabaseImplement.csproj" />
-    <ProjectReference Include="..\IceCreamShopFileImplement\IceCreamShopFileImplement.csproj" />
   </ItemGroup>
 
 </Project>
diff --git a/IceCreamShop/IceCreamShopRestApi/Program.cs b/IceCreamShop/IceCreamShopRestApi/Program.cs
index c438187..fc55e23 100644
--- a/IceCreamShop/IceCreamShopRestApi/Program.cs
+++ b/IceCreamShop/IceCreamShopRestApi/Program.cs
@@ -3,7 +3,7 @@ using IceCreamBusinessLogic.MailWorker;
 using IceCreamShopContracts.BindingModels;
 using IceCreamShopContracts.BusinessLogicsContracts;
 using IceCreamShopContracts.StoragesContracts;
-using IceCreamShopFileImplement.Implements;
+using IceCreamShopDatabaseImplement.Implements;
 using Microsoft.OpenApi.Models;
 
 var builder = WebApplication.CreateBuilder(args);