diff --git a/SushiBar/SushiBar.sln b/SushiBar/SushiBar.sln
index c65a447..687ab57 100644
--- a/SushiBar/SushiBar.sln
+++ b/SushiBar/SushiBar.sln
@@ -31,6 +31,7 @@ Global
 		{DB81A759-B157-477C-9281-EE358968519D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{DB81A759-B157-477C-9281-EE358968519D}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{DB81A759-B157-477C-9281-EE358968519D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DB81A759-B157-477C-9281-EE358968519D}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
 		{CFB2D9F9-EA44-4E61-B6BE-5A2AA3C6AF07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CFB2D9F9-EA44-4E61-B6BE-5A2AA3C6AF07}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{CFB2D9F9-EA44-4E61-B6BE-5A2AA3C6AF07}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -59,10 +60,12 @@ Global
 		{0ADB6C71-701C-43A7-869C-A92D7C36C4EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0ADB6C71-701C-43A7-869C-A92D7C36C4EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0ADB6C71-701C-43A7-869C-A92D7C36C4EC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0ADB6C71-701C-43A7-869C-A92D7C36C4EC}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
 		{BF58D50B-0408-4124-8CD3-1D5DFEE83104}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{BF58D50B-0408-4124-8CD3-1D5DFEE83104}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{BF58D50B-0408-4124-8CD3-1D5DFEE83104}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{BF58D50B-0408-4124-8CD3-1D5DFEE83104}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BF58D50B-0408-4124-8CD3-1D5DFEE83104}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/SushiBar/SushiBar/App.config b/SushiBar/SushiBar/App.config
new file mode 100644
index 0000000..c6f4192
--- /dev/null
+++ b/SushiBar/SushiBar/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="sushibarulyanosk7@gmail.com" />
+        <add key="MailPassword" value="qwzj uqlx uukp bpmc" />
+    </appSettings>
+</configuration>
\ No newline at end of file
diff --git a/SushiBar/SushiBar/FormMails.Designer.cs b/SushiBar/SushiBar/FormMails.Designer.cs
new file mode 100644
index 0000000..610f011
--- /dev/null
+++ b/SushiBar/SushiBar/FormMails.Designer.cs
@@ -0,0 +1,62 @@
+namespace SushiBar
+{
+    partial class FormMails
+    {
+        /// <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()
+        {
+            this.dataGridView = new System.Windows.Forms.DataGridView();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // dataGridView
+            // 
+            this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridView.Location = new System.Drawing.Point(12, 12);
+            this.dataGridView.Name = "dataGridView";
+            this.dataGridView.RowTemplate.Height = 25;
+            this.dataGridView.Size = new System.Drawing.Size(776, 426);
+            this.dataGridView.TabIndex = 0;
+            // 
+            // FormMails
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(800, 450);
+            this.Controls.Add(this.dataGridView);
+            this.Name = "FormMails";
+            this.Text = "FormMails";
+            this.Load += new System.EventHandler(this.FormMails_Load);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private DataGridView dataGridView;
+    }
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBar/FormMails.cs b/SushiBar/SushiBar/FormMails.cs
new file mode 100644
index 0000000..28ec5f7
--- /dev/null
+++ b/SushiBar/SushiBar/FormMails.cs
@@ -0,0 +1,45 @@
+using Microsoft.Extensions.Logging;
+using SushiBarContracts.BusinessLogicsContracts;
+
+namespace SushiBar
+{
+    public partial class FormMails : Form
+    {
+        private readonly ILogger _logger;
+        private readonly IMessageInfoLogic _logic;
+
+        public FormMails(ILogger<FormMails> logger, IMessageInfoLogic logic)
+        {
+            InitializeComponent();
+            _logger = logger;
+            _logic = logic;
+            LoadData();
+        }
+
+        private void LoadData()
+        {
+            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("Load mails");
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Error on load mails");
+                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void FormMails_Load(object sender, EventArgs e)
+        {
+            LoadData();
+        }
+    }
+}
diff --git a/SushiBar/SushiBar/FormMails.resx b/SushiBar/SushiBar/FormMails.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/SushiBar/SushiBar/FormMails.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/SushiBar/SushiBar/FormMain.Designer.cs b/SushiBar/SushiBar/FormMain.Designer.cs
index 1e0a78c..2b138f9 100644
--- a/SushiBar/SushiBar/FormMain.Designer.cs
+++ b/SushiBar/SushiBar/FormMain.Designer.cs
@@ -45,6 +45,7 @@
             this.buttonReady = new System.Windows.Forms.Button();
             this.buttonIssue = new System.Windows.Forms.Button();
             this.buttonReload = new System.Windows.Forms.Button();
+            this.mailsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
             this.menuStrip1.SuspendLayout();
             this.SuspendLayout();
@@ -63,7 +64,8 @@
             this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.directoryToolStripMenuItem,
             this.reportsToolStripMenuItem,
-            this.startWorkToolStripMenuItem});
+            this.startWorkToolStripMenuItem,
+            this.mailsToolStripMenuItem});
             this.menuStrip1.Location = new System.Drawing.Point(0, 0);
             this.menuStrip1.Name = "menuStrip1";
             this.menuStrip1.Size = new System.Drawing.Size(1421, 24);
@@ -197,6 +199,13 @@
             this.buttonReload.UseVisualStyleBackColor = true;
             this.buttonReload.Click += new System.EventHandler(this.ButtonReload_Click);
             // 
+            // mailsToolStripMenuItem
+            // 
+            this.mailsToolStripMenuItem.Name = "mailsToolStripMenuItem";
+            this.mailsToolStripMenuItem.Size = new System.Drawing.Size(47, 20);
+            this.mailsToolStripMenuItem.Text = "Mails";
+            this.mailsToolStripMenuItem.Click += new System.EventHandler(this.MailsToolStripMenuItem_Click);
+            // 
             // FormMain
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
@@ -240,5 +249,6 @@
         private ToolStripMenuItem clientsToolStripMenuItem;
         private ToolStripMenuItem startWorkToolStripMenuItem;
         private ToolStripMenuItem implementersToolStripMenuItem;
+        private ToolStripMenuItem mailsToolStripMenuItem;
     }
 }
\ No newline at end of file
diff --git a/SushiBar/SushiBar/FormMain.cs b/SushiBar/SushiBar/FormMain.cs
index f1a2fb4..eadfcba 100644
--- a/SushiBar/SushiBar/FormMain.cs
+++ b/SushiBar/SushiBar/FormMain.cs
@@ -240,5 +240,14 @@ namespace SushiBar
                 form.ShowDialog();
             }
         }
+
+        private void MailsToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            var service = Program.ServiceProvider?.GetService(typeof(FormMails));
+            if (service is FormMails form)
+            {
+                form.ShowDialog();
+            }
+        }
     }
 }
diff --git a/SushiBar/SushiBar/Program.cs b/SushiBar/SushiBar/Program.cs
index 7bff625..9324ad2 100644
--- a/SushiBar/SushiBar/Program.cs
+++ b/SushiBar/SushiBar/Program.cs
@@ -2,8 +2,10 @@ using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using NLog.Extensions.Logging;
 using SushiBarBusinessLogic.BusinessLogics;
+using SushiBarBusinessLogic.MailWorker;
 using SushiBarBusinessLogic.OfficePackage;
 using SushiBarBusinessLogic.OfficePackage.Implements;
+using SushiBarContracts.BindingModels;
 using SushiBarContracts.BusinessLogicsContracts;
 using SushiBarContracts.StoragesContracts;
 using SushiBarDatabaseImplement.Implements;
@@ -22,9 +24,38 @@ namespace SushiBar
             var services = new ServiceCollection();
             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(MailCheck!, null, 0, 100000);
+            }
+            catch(Exception ex)
+            {
+                var logger = _serviceProvider.GetService<ILogger>();
+                logger?.LogError(ex, "Error on working w/ email");
+            }
+
             Application.Run(_serviceProvider.GetRequiredService<FormMain>());
         }
-        private static void ConfigureServices(ServiceCollection services)
+        private static void ConfigureServices(IServiceCollection services)
         {
             services.AddLogging(option =>
             {
@@ -36,6 +67,7 @@ namespace SushiBar
             services.AddTransient<ISushiStorage, SushiStorage>();
             services.AddTransient<IClientStorage, ClientStorage>();
             services.AddTransient<IImplementerStorage, ImplementerStorage>();
+            services.AddTransient<IMessageInfoStorage, MessageStorage>();
             
             services.AddTransient<IComponentLogic, ComponentLogic>();
             services.AddTransient<IOrderLogic, OrderLogic>();
@@ -43,7 +75,10 @@ namespace SushiBar
             services.AddTransient<IReportLogic, ReportLogic>();
             services.AddTransient<IClientLogic, ClientLogic>();
             services.AddTransient<IImplementerLogic, ImplementerLogic>();
+            services.AddTransient<IMessageInfoLogic, MessageInfoLogic>();
+            
             services.AddTransient<IWorkProcess, WorkModeling>();
+            services.AddSingleton<AbstractMailWorker, MailKitWorker>();
             
             services.AddTransient<AbstractSaveToExcel, SaveToExcel>();
             services.AddTransient<AbstractSaveToWord, SaveToWord>();
@@ -60,6 +95,9 @@ namespace SushiBar
             services.AddTransient<FormClients>();
             services.AddTransient<FormImplementers>();
             services.AddTransient<FormImplementer>();
+            services.AddTransient<FormMails>();
         }
+        
+        private static void MailCheck(object obj) => ServiceProvider?.GetService<AbstractMailWorker>()?.MailCheck();
     }
 }
\ No newline at end of file
diff --git a/SushiBar/SushiBarBusinessLogic/BusinessLogics/ClientLogic.cs b/SushiBar/SushiBarBusinessLogic/BusinessLogics/ClientLogic.cs
index e5b1d79..3f345f8 100644
--- a/SushiBar/SushiBarBusinessLogic/BusinessLogics/ClientLogic.cs
+++ b/SushiBar/SushiBarBusinessLogic/BusinessLogics/ClientLogic.cs
@@ -1,4 +1,5 @@
-using Microsoft.Extensions.Logging;
+using System.Text.RegularExpressions;
+using Microsoft.Extensions.Logging;
 using SushiBarContracts.BindingModels;
 using SushiBarContracts.BusinessLogicsContracts;
 using SushiBarContracts.SearchModels;
@@ -73,35 +74,33 @@ public class ClientLogic : IClientLogic
     private void CheckModel(ClientBindingModel? model, bool withParams = true)
     {
         if (model == null)
-        {
             throw new ArgumentNullException(nameof(model));
-        }
 
         if (!withParams)
-        {
             return;
-        }
 
         if (string.IsNullOrEmpty(model.ClientFio))
-        {
             throw new ArgumentNullException(nameof(model.ClientFio), "FIO must be not null");
-        }
+        
         if (string.IsNullOrEmpty(model.Email))
-        {
             throw new ArgumentNullException(nameof(model.Email), "EMAIL must be not null");
-        }
+        
         if (string.IsNullOrEmpty(model.Password))
-        {
             throw new ArgumentNullException(nameof(model.Password), "PASSWORD must be not null");
-        }
+        
+        if (!Regex.IsMatch(model.Email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$", RegexOptions.IgnoreCase))
+            throw new ArgumentException("Invalid format for email", nameof(model.Email));
+
+        if (!Regex.IsMatch(model.Password, @"^^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))[\w\d\W]*$", RegexOptions.IgnoreCase))
+            throw new ArgumentException("Invalid format for password", nameof(model.Password));
+
         _logger.LogInformation("Client .FIO:{ClientFio} .EMAIL:{Email} .Password:{Password} .Id:{Id}", model.ClientFio, model.Email, model.Password, model.Id);
-        var client = _clientStorage.GetElement(new ClientSearchModel()
+        var client = _clientStorage.GetElement(new ClientSearchModel
         {
             Email = model.Email
         });
+        
         if (client != null && client.Id != model.Id)
-        {
             throw new InvalidOperationException("Email is already exists");
-        }
     }
 }
\ No newline at end of file
diff --git a/SushiBar/SushiBarBusinessLogic/BusinessLogics/MessageInfoLogic.cs b/SushiBar/SushiBarBusinessLogic/BusinessLogics/MessageInfoLogic.cs
new file mode 100644
index 0000000..0abf566
--- /dev/null
+++ b/SushiBar/SushiBarBusinessLogic/BusinessLogics/MessageInfoLogic.cs
@@ -0,0 +1,40 @@
+using Microsoft.Extensions.Logging;
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.BusinessLogicsContracts;
+using SushiBarContracts.SearchModels;
+using SushiBarContracts.StoragesContracts;
+using SushiBarContracts.ViewModels;
+
+namespace SushiBarBusinessLogic.BusinessLogics;
+
+public class MessageInfoLogic : IMessageInfoLogic
+{
+    private readonly ILogger _logger;
+    private readonly IMessageInfoStorage _messageStorage;
+
+    public MessageInfoLogic(ILogger<MessageInfoLogic> logger, IMessageInfoStorage messageStorage)
+    {
+        _logger = logger;
+        _messageStorage = messageStorage;
+    }
+
+    public bool Create(MessageInfoBindingModel model)
+    {
+        if (_messageStorage.Insert(model) != null) return true;
+        _logger.LogWarning("Insert operation failed");
+
+        return false;
+    }
+
+    public List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model)
+    {
+        _logger.LogInformation("ReadList. MessageId:{MessageId}.ClientId:{ClientId} ", 
+            model?.MessageId, 
+            model?.ClientId);
+        var list = model == null ? _messageStorage.GetFullList() : _messageStorage.GetFilteredList(model);
+
+        _logger.LogInformation("ReadList. Count: {Count}", list.Count);
+
+        return list;
+    }
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs b/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs
index 54bee68..c6ea26c 100644
--- a/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs
+++ b/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs
@@ -1,5 +1,6 @@
 using DocumentFormat.OpenXml.EMMA;
 using Microsoft.Extensions.Logging;
+using SushiBarBusinessLogic.MailWorker;
 using SushiBarContracts.BindingModels;
 using SushiBarContracts.BusinessLogicsContracts;
 using SushiBarContracts.SearchModels;
@@ -13,11 +14,18 @@ namespace SushiBarBusinessLogic.BusinessLogics
     {
         private readonly ILogger _logger;
         private readonly IOrderStorage _orderStorage;
+        private readonly AbstractMailWorker _mailWorker;
+        private readonly IClientLogic _clientLogic;
 
-        public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage)
+        public OrderLogic(ILogger<OrderLogic> logger, 
+            IOrderStorage orderStorage, 
+            AbstractMailWorker mailWorker, 
+            IClientLogic clientLogic)
         {
             _logger = logger;
             _orderStorage = orderStorage;
+            _mailWorker = mailWorker;
+            _clientLogic = clientLogic;
         }
         
         public OrderViewModel? ReadElement(OrderSearchModel model)
@@ -49,9 +57,15 @@ namespace SushiBarBusinessLogic.BusinessLogics
 
             model.Status = OrderStatus.Accepted;
 
-            if (_orderStorage.Insert(model) != null) return true;
-            _logger.LogWarning("Insert operation failed");
-            return false;
+            var result = _orderStorage.Insert(model); 
+            if (result == null)
+            {
+                _logger.LogWarning("Insert operation failed");
+                return false;
+            }
+            
+            SendOrderMessage(result.ClientId, $"Sushi Bar, Order №{result.Id}", $"Order №{result.Id} date {result.DateCreate} with sum on {result.Sum:0.00} accepted");
+            return true;
         }
 
         public bool DeliveryOrder(OrderBindingModel model)
@@ -98,8 +112,7 @@ namespace SushiBarBusinessLogic.BusinessLogics
             }
             model.Status = status;
             model.DateCreate = order.DateCreate;
-            if (model.DateImplement == null)
-                model.DateImplement = order.DateImplement;
+            model.DateImplement ??= order.DateImplement;
             if (order.ImplementerId.HasValue)
                 model.ImplementerId = order.ImplementerId;
             if (model.Status == OrderStatus.Issued)
@@ -110,11 +123,16 @@ namespace SushiBarBusinessLogic.BusinessLogics
             model.SushiId = order.SushiId;
             model.Sum = order.Sum;
             model.Count = order.Count;
-            if (_orderStorage.Update(model) == null)
+
+            var result = _orderStorage.Update(model);
+            if (result == null)
             {
                 _logger.LogWarning("Update operation failed");
                 return false;
             }
+            SendOrderMessage(result.ClientId, 
+                $"Sushi Bar, Order №{result.Id}", 
+                $"Order №{model.Id} changed status on {result.Status}");
             return true;
         }
 
@@ -138,5 +156,24 @@ namespace SushiBarBusinessLogic.BusinessLogics
                 throw new InvalidOperationException("This name is already exists");
             }
         }
+        
+        private bool SendOrderMessage(int clientId, string subject, string text)
+        {
+            var client = _clientLogic.ReadElement(new ClientSearchModel { Id = clientId });
+            
+            if (client == null)
+            {
+                return false;
+            }
+
+            _mailWorker.MailSendAsync(new MailSendInfoBindingModel
+            {
+                MailAddress = client.Email,
+                Subject = subject,
+                Text = text
+            });
+
+            return true;
+        }
     }
 }
\ No newline at end of file
diff --git a/SushiBar/SushiBarBusinessLogic/MailWorker/AbstractMailWorker.cs b/SushiBar/SushiBarBusinessLogic/MailWorker/AbstractMailWorker.cs
new file mode 100644
index 0000000..bd75d31
--- /dev/null
+++ b/SushiBar/SushiBarBusinessLogic/MailWorker/AbstractMailWorker.cs
@@ -0,0 +1,85 @@
+using Microsoft.Extensions.Logging;
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.BusinessLogicsContracts;
+using SushiBarContracts.SearchModels;
+
+namespace SushiBarBusinessLogic.MailWorker;
+
+public abstract class AbstractMailWorker
+{
+    protected string _mailLogin = string.Empty;
+    protected string _mailPassword = string.Empty;
+    protected string _smtpClientHost = string.Empty;
+    protected int _smtpClientPort;
+    protected string _popHost = string.Empty;
+    protected int _popPort;
+    private readonly IMessageInfoLogic _messageInfoLogic;
+    private readonly ILogger _logger;
+    private readonly IClientLogic _clientLogic;
+    
+    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;
+        }
+
+        var list = await ReceiveMailAsync();
+        _logger.LogDebug("Check Mail: {Count} new mails", list.Count);
+        foreach (var mail in list)
+        {
+            mail.ClientId = _clientLogic.ReadElement(new ClientSearchModel { 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/SushiBar/SushiBarBusinessLogic/MailWorker/MailKitWorker.cs b/SushiBar/SushiBarBusinessLogic/MailWorker/MailKitWorker.cs
new file mode 100644
index 0000000..485a5e3
--- /dev/null
+++ b/SushiBar/SushiBarBusinessLogic/MailWorker/MailKitWorker.cs
@@ -0,0 +1,76 @@
+using System.Net;
+using System.Net.Mail;
+using System.Text;
+using MailKit.Net.Pop3;
+using MailKit.Security;
+using Microsoft.Extensions.Logging;
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.BusinessLogicsContracts;
+using AuthenticationException = System.Security.Authentication.AuthenticationException;
+
+namespace SushiBarBusinessLogic.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);
+        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);
+        try
+        {
+            await Task.Run(() => objSmtpClient.Send(objMailMessage));
+        }
+        catch (Exception e)
+        {
+            throw e;
+        }
+    }
+    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 (var i = 0; i < client.Count; i++)
+                {
+                    var message = client.GetMessage(i);
+                    list.AddRange(message.From.Mailboxes.Select(mail => 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/SushiBar/SushiBarBusinessLogic/SushiBarBusinessLogic.csproj b/SushiBar/SushiBarBusinessLogic/SushiBarBusinessLogic.csproj
index e78c618..27ad21c 100644
--- a/SushiBar/SushiBarBusinessLogic/SushiBarBusinessLogic.csproj
+++ b/SushiBar/SushiBarBusinessLogic/SushiBarBusinessLogic.csproj
@@ -8,6 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
+    <PackageReference Include="MailKit" Version="4.0.0" />
     <PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
     <PackageReference Include="PDFsharp-MigraDoc" Version="1.50.5147" />
   </ItemGroup>
diff --git a/SushiBar/SushiBarClientApi/Controllers/HomeController.cs b/SushiBar/SushiBarClientApi/Controllers/HomeController.cs
index 6cbfef3..6063620 100644
--- a/SushiBar/SushiBarClientApi/Controllers/HomeController.cs
+++ b/SushiBar/SushiBarClientApi/Controllers/HomeController.cs
@@ -149,5 +149,15 @@ namespace SushiBarClientApi.Controllers
             var prod = APIClient.GetRequest<SushiViewModel>($"api/Main/GetProduct?sushiId={sushi}");
             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/SushiBar/SushiBarClientApi/Views/Home/Mails.cshtml b/SushiBar/SushiBarClientApi/Views/Home/Mails.cshtml
new file mode 100644
index 0000000..a84f13a
--- /dev/null
+++ b/SushiBar/SushiBarClientApi/Views/Home/Mails.cshtml
@@ -0,0 +1,50 @@
+@model List<SushiBarContracts.ViewModels.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/SushiBar/SushiBarClientApi/Views/Home/_Layout.cshtml b/SushiBar/SushiBarClientApi/Views/Home/_Layout.cshtml
index b419923..2ef3156 100644
--- a/SushiBar/SushiBarClientApi/Views/Home/_Layout.cshtml
+++ b/SushiBar/SushiBarClientApi/Views/Home/_Layout.cshtml
@@ -23,13 +23,16 @@
       <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Index">Orders</a>
      </li>
      <li class="nav-item">
-      <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Privacy">My info</a>
+      <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Privacy">PM</a>
      </li>
      <li class="nav-item">
-      <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Enter">Sign in</a>
+      <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Mails">Mails</a>
      </li>
      <li class="nav-item">
-      <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Register">Sign up</a>
+      <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Enter">Sign In</a>
+     </li>
+     <li class="nav-item">
+      <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Register">Sing Up</a>
      </li>
     </ul>
    </div>
diff --git a/SushiBar/SushiBarContracts/BindingModels/MailConfigBindingModel.cs b/SushiBar/SushiBarContracts/BindingModels/MailConfigBindingModel.cs
new file mode 100644
index 0000000..9e4a9e6
--- /dev/null
+++ b/SushiBar/SushiBarContracts/BindingModels/MailConfigBindingModel.cs
@@ -0,0 +1,11 @@
+namespace SushiBarContracts.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/SushiBar/SushiBarContracts/BindingModels/MailSendInfoBindingModel.cs b/SushiBar/SushiBarContracts/BindingModels/MailSendInfoBindingModel.cs
new file mode 100644
index 0000000..8d28547
--- /dev/null
+++ b/SushiBar/SushiBarContracts/BindingModels/MailSendInfoBindingModel.cs
@@ -0,0 +1,8 @@
+namespace SushiBarContracts.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/SushiBar/SushiBarContracts/BindingModels/MessageInfoBindingModel.cs b/SushiBar/SushiBarContracts/BindingModels/MessageInfoBindingModel.cs
new file mode 100644
index 0000000..8ceba17
--- /dev/null
+++ b/SushiBar/SushiBarContracts/BindingModels/MessageInfoBindingModel.cs
@@ -0,0 +1,13 @@
+using SushiBarDataModels.Models;
+
+namespace SushiBarContracts.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 DateTime DateDelivery { get; set; }
+    public string Subject { get; set; } = string.Empty;
+    public string Body { get; set; } = string.Empty;
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarContracts/BusinessLogicsContracts/IMessageInfoLogic.cs b/SushiBar/SushiBarContracts/BusinessLogicsContracts/IMessageInfoLogic.cs
new file mode 100644
index 0000000..963886c
--- /dev/null
+++ b/SushiBar/SushiBarContracts/BusinessLogicsContracts/IMessageInfoLogic.cs
@@ -0,0 +1,11 @@
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.SearchModels;
+using SushiBarContracts.ViewModels;
+
+namespace SushiBarContracts.BusinessLogicsContracts;
+
+public interface IMessageInfoLogic
+{
+    List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model);
+    bool Create(MessageInfoBindingModel model);
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarContracts/SearchModels/MessageInfoSearchModel.cs b/SushiBar/SushiBarContracts/SearchModels/MessageInfoSearchModel.cs
new file mode 100644
index 0000000..10351bd
--- /dev/null
+++ b/SushiBar/SushiBarContracts/SearchModels/MessageInfoSearchModel.cs
@@ -0,0 +1,7 @@
+namespace SushiBarContracts.SearchModels;
+
+public class MessageInfoSearchModel
+{
+    public string? MessageId { get; set; }
+    public int? ClientId { get; set; }
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarContracts/StoragesContracts/IMessageInfoStorage.cs b/SushiBar/SushiBarContracts/StoragesContracts/IMessageInfoStorage.cs
new file mode 100644
index 0000000..42b700a
--- /dev/null
+++ b/SushiBar/SushiBarContracts/StoragesContracts/IMessageInfoStorage.cs
@@ -0,0 +1,13 @@
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.SearchModels;
+using SushiBarContracts.ViewModels;
+
+namespace SushiBarContracts.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/SushiBar/SushiBarContracts/ViewModels/MessageInfoViewModel.cs b/SushiBar/SushiBarContracts/ViewModels/MessageInfoViewModel.cs
new file mode 100644
index 0000000..5ec60fb
--- /dev/null
+++ b/SushiBar/SushiBarContracts/ViewModels/MessageInfoViewModel.cs
@@ -0,0 +1,16 @@
+using System.ComponentModel;
+using SushiBarDataModels.Models;
+
+namespace SushiBarContracts.ViewModels;
+
+public class MessageInfoViewModel : IMessageInfoModel
+{
+    public string MessageId { get; set; }
+    public int? ClientId { get; set; }
+    [DisplayName("Sender name")]
+    public string SenderName { get; set; }
+    [DisplayName("Date delivery")]
+    public DateTime DateDelivery { get; set; }
+    public string Subject { get; set; }
+    public string Body { get; set; }
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarDatabaseImplement/Implements/ClientStorage.cs b/SushiBar/SushiBarDatabaseImplement/Implements/ClientStorage.cs
index f7c3e41..9d86dab 100644
--- a/SushiBar/SushiBarDatabaseImplement/Implements/ClientStorage.cs
+++ b/SushiBar/SushiBarDatabaseImplement/Implements/ClientStorage.cs
@@ -54,6 +54,13 @@ public class ClientStorage : IClientStorage
                 ?.GetViewModel;
         }
 
+        if (!string.IsNullOrEmpty(model.Email))
+        {
+            return context.Clients
+                .FirstOrDefault(x => x.Email == model.Email)
+                ?.GetViewModel;
+        }
+
         return context.Clients
             .FirstOrDefault(x => x.Email == model.Email && x.Password == model.Password)
             ?.GetViewModel;
diff --git a/SushiBar/SushiBarDatabaseImplement/Implements/MessageStorage.cs b/SushiBar/SushiBarDatabaseImplement/Implements/MessageStorage.cs
new file mode 100644
index 0000000..765b11e
--- /dev/null
+++ b/SushiBar/SushiBarDatabaseImplement/Implements/MessageStorage.cs
@@ -0,0 +1,50 @@
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.SearchModels;
+using SushiBarContracts.StoragesContracts;
+using SushiBarContracts.ViewModels;
+using SushiBarDatabaseImplement.Models;
+
+namespace SushiBarDatabaseImplement.Implements;
+
+public class MessageStorage : IMessageInfoStorage
+{
+    public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
+    {
+        if (model.MessageId == null)
+            return null;
+        using var context = new SushiBarDatabase();
+        return context.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel;
+    }
+
+    public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
+    {
+        if (!model.ClientId.HasValue)
+            return new List<MessageInfoViewModel>();
+        using var context = new SushiBarDatabase();
+        return context.Messages
+            .Where(x => x.ClientId == model.ClientId)
+            .Select(x => x.GetViewModel)
+            .ToList();
+    }
+
+    public List<MessageInfoViewModel> GetFullList()
+    {
+        using var context = new SushiBarDatabase();
+        return context.Messages
+            .Select(x => x.GetViewModel)
+            .ToList();
+    }
+
+    public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
+    {
+        var newMessage = Message.Create(model);
+        if (newMessage == null)
+        {
+            return null;
+        }
+        using var context = new SushiBarDatabase();
+        context.Messages.Add(newMessage);
+        context.SaveChanges();
+        return newMessage.GetViewModel;
+    }
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarDatabaseImplement/Migrations/20230423155623_lab7.Designer.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/20230423155623_lab7.Designer.cs
new file mode 100644
index 0000000..1537609
--- /dev/null
+++ b/SushiBar/SushiBarDatabaseImplement/Migrations/20230423155623_lab7.Designer.cs
@@ -0,0 +1,290 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using SushiBarDatabaseImplement;
+
+#nullable disable
+
+namespace SushiBarDatabaseImplement.Migrations
+{
+    [DbContext(typeof(SushiBarDatabase))]
+    [Migration("20230423155623_lab7")]
+    partial class lab7
+    {
+        /// <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("SushiBarDatabaseImplement.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("SushiBarDatabaseImplement.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("SushiBarDatabaseImplement.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("SushiBarDatabaseImplement.Models.Message", 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("SushiBarDatabaseImplement.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?>("ImplementerId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<double>("Sum")
+                        .HasColumnType("float");
+
+                    b.Property<int>("SushiId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("SushiName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ClientId");
+
+                    b.HasIndex("ImplementerId");
+
+                    b.HasIndex("SushiId");
+
+                    b.ToTable("Orders");
+                });
+
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.Sushi", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<double>("Price")
+                        .HasColumnType("float");
+
+                    b.Property<string>("SushiName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Sushi");
+                });
+
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.SushiComponent", 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>("SushiId")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ComponentId");
+
+                    b.HasIndex("SushiId");
+
+                    b.ToTable("SushiComponents");
+                });
+
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.Message", b =>
+                {
+                    b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
+                        .WithMany()
+                        .HasForeignKey("ClientId");
+
+                    b.Navigation("Client");
+                });
+
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b =>
+                {
+                    b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
+                        .WithMany()
+                        .HasForeignKey("ClientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("SushiBarDatabaseImplement.Models.Implementer", "Implementer")
+                        .WithMany()
+                        .HasForeignKey("ImplementerId");
+
+                    b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi")
+                        .WithMany("Orders")
+                        .HasForeignKey("SushiId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Client");
+
+                    b.Navigation("Implementer");
+
+                    b.Navigation("Sushi");
+                });
+
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.SushiComponent", b =>
+                {
+                    b.HasOne("SushiBarDatabaseImplement.Models.Component", "Component")
+                        .WithMany("SushiComponent")
+                        .HasForeignKey("ComponentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi")
+                        .WithMany("Components")
+                        .HasForeignKey("SushiId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Component");
+
+                    b.Navigation("Sushi");
+                });
+
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.Component", b =>
+                {
+                    b.Navigation("SushiComponent");
+                });
+
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.Sushi", b =>
+                {
+                    b.Navigation("Components");
+
+                    b.Navigation("Orders");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/SushiBar/SushiBarDatabaseImplement/Migrations/20230423155623_lab7.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/20230423155623_lab7.cs
new file mode 100644
index 0000000..e07a88d
--- /dev/null
+++ b/SushiBar/SushiBarDatabaseImplement/Migrations/20230423155623_lab7.cs
@@ -0,0 +1,49 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace SushiBarDatabaseImplement.Migrations
+{
+    /// <inheritdoc />
+    public partial class lab7 : 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",
+                        onDelete: ReferentialAction.Cascade);
+                });
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Messages_ClientId",
+                table: "Messages",
+                column: "ClientId");
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "Messages");
+        }
+    }
+}
diff --git a/SushiBar/SushiBarDatabaseImplement/Migrations/SushiDatabaseModelSnapshot.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/SushiDatabaseModelSnapshot.cs
index 5b4af9c..78bad80 100644
--- a/SushiBar/SushiBarDatabaseImplement/Migrations/SushiDatabaseModelSnapshot.cs
+++ b/SushiBar/SushiBarDatabaseImplement/Migrations/SushiDatabaseModelSnapshot.cs
@@ -94,6 +94,36 @@ namespace SushiBarDatabaseImplement.Migrations
                     b.ToTable("Implementers");
                 });
 
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.Message", 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("SushiBarDatabaseImplement.Models.Order", b =>
                 {
                     b.Property<int>("Id")
@@ -187,6 +217,15 @@ namespace SushiBarDatabaseImplement.Migrations
                     b.ToTable("SushiComponents");
                 });
 
+            modelBuilder.Entity("SushiBarDatabaseImplement.Models.Message", b =>
+                {
+                    b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
+                        .WithMany()
+                        .HasForeignKey("ClientId");
+
+                    b.Navigation("Client");
+                });
+
             modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b =>
                 {
                     b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
diff --git a/SushiBar/SushiBarDatabaseImplement/Models/Message.cs b/SushiBar/SushiBarDatabaseImplement/Models/Message.cs
new file mode 100644
index 0000000..8f70c2e
--- /dev/null
+++ b/SushiBar/SushiBarDatabaseImplement/Models/Message.cs
@@ -0,0 +1,50 @@
+using System.ComponentModel.DataAnnotations;
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.ViewModels;
+using SushiBarDataModels.Models;
+
+namespace SushiBarDatabaseImplement.Models;
+
+public class Message : IMessageInfoModel
+{
+    [Key]
+    public string MessageId { get; private set; } = string.Empty;
+    public int? ClientId { get; private set; }
+    [Required]
+    public string SenderName { get; private set; } = string.Empty;
+    [Required]
+    public DateTime DateDelivery { get; private set; } = DateTime.Now;
+    [Required]
+    public string Subject { get; private set; } = string.Empty;
+    [Required]
+    public string Body { get; private set; } = string.Empty;
+
+    public virtual Client Client { get; set; }
+
+    public static Message? Create(MessageInfoBindingModel? model)
+    {
+        if (model == null)
+        {
+            return null;
+        }
+        return new Message
+        {
+            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,
+    };
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarDatabaseImplement/SushiBarDatabase.cs b/SushiBar/SushiBarDatabaseImplement/SushiBarDatabase.cs
index 6af51fc..ca3a322 100644
--- a/SushiBar/SushiBarDatabaseImplement/SushiBarDatabase.cs
+++ b/SushiBar/SushiBarDatabaseImplement/SushiBarDatabase.cs
@@ -19,5 +19,6 @@ namespace SushiBarDatabaseImplement
         public virtual DbSet<Order> Orders { set; get; }
         public virtual DbSet<Client> Clients { set; get; }
         public virtual DbSet<Implementer> Implementers { get; set; }
+        public virtual DbSet<Message> Messages { get; set; }
     }
 }
diff --git a/SushiBar/SushiBarFileImplement/DataFileSingleton.cs b/SushiBar/SushiBarFileImplement/DataFileSingleton.cs
index ea43f81..2b2b058 100644
--- a/SushiBar/SushiBarFileImplement/DataFileSingleton.cs
+++ b/SushiBar/SushiBarFileImplement/DataFileSingleton.cs
@@ -10,10 +10,13 @@ namespace SushiBarFileImplement
         private readonly string OrderFileName = "Order.xml";
         private readonly string SushiFileName = "Sushi.xml";
         private readonly string ImplementerFileName = "Implementer.xml";
+        private readonly string MessageFileName = "Message.xml"; 
         public List<Component> Components { get; private set; }
         public List<Order> Orders { get; private set; }
         public List<Sushi> Sushis { get; private set; }
         public List<Implementer> Implementers { get; set; }
+        public List<Message> Messages { get; set; }
+
         public static DataFileSingleton GetInstance()
         {
             instance ??= new DataFileSingleton();
@@ -23,13 +26,16 @@ namespace SushiBarFileImplement
         public void SaveSushis() => SaveData(Sushis, SushiFileName, "Sushis", x => x.GetXElement);
         public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
         public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement);
+        public void SaveMessages() => SaveData(Messages, MessageFileName, "Messages", x => x.GetXElement);
+
         
         private DataFileSingleton()
         {
-            Components  = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!;
-            Sushis      = LoadData(SushiFileName, "Sushi", x => Sushi.Create(x)!)!;
-            Orders      = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
+            Components   = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!;
+            Sushis       = LoadData(SushiFileName, "Sushi", x => Sushi.Create(x)!)!;
+            Orders       = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
             Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!;
+            Messages     = LoadData(MessageFileName, "Messages", x => Message.Create(x)!)!;
         }
         private static List<T>? LoadData<T>(string filename, string xmlNodeName, Func<XElement, T> selectFunction)
         {
diff --git a/SushiBar/SushiBarFileImplement/Implements/MessageInfoStorage.cs b/SushiBar/SushiBarFileImplement/Implements/MessageInfoStorage.cs
new file mode 100644
index 0000000..a108445
--- /dev/null
+++ b/SushiBar/SushiBarFileImplement/Implements/MessageInfoStorage.cs
@@ -0,0 +1,53 @@
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.SearchModels;
+using SushiBarContracts.StoragesContracts;
+using SushiBarContracts.ViewModels;
+using SushiBarFileImplement.Models;
+
+namespace SushiBarFileImplement.Implements;
+
+public class MessageInfoStorage : IMessageInfoStorage
+{
+    private readonly DataFileSingleton source;
+    public MessageInfoStorage()
+    {
+        source = DataFileSingleton.GetInstance();
+    }
+    public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
+    {
+        return model.MessageId == null ? 
+            null : 
+            source.Messages
+                .FirstOrDefault(x => x.MessageId == model.MessageId)
+                ?.GetViewModel;
+    }
+
+    public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
+    {
+        if (!model.ClientId.HasValue)
+            return new List<MessageInfoViewModel>();
+        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 = Message.Create(model);
+        if (newMessage == null)
+        {
+            return null;
+        }
+        source.Messages.Add(newMessage);
+        source.SaveMessages();
+        return newMessage.GetViewModel;
+    }
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarFileImplement/Models/Message.cs b/SushiBar/SushiBarFileImplement/Models/Message.cs
new file mode 100644
index 0000000..3f2314f
--- /dev/null
+++ b/SushiBar/SushiBarFileImplement/Models/Message.cs
@@ -0,0 +1,69 @@
+using System.Xml.Linq;
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.ViewModels;
+using SushiBarDataModels.Models;
+
+namespace SushiBarFileImplement.Models;
+
+public class Message : 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 Message? Create(MessageInfoBindingModel? model)
+    {
+        if (model == null)
+        {
+            return null;
+        }
+        return new Message
+        {
+            Body = model.Body,
+            Subject = model.Subject,
+            DateDelivery = model.DateDelivery,
+            SenderName = model.SenderName,
+            ClientId = model.ClientId,
+            MessageId = model.MessageId
+        };
+    }
+    
+    public static Message? Create(XElement? element)
+    {
+        if (element == null)
+        {
+            return null;
+        }
+        return new Message
+        {
+            Body = element.Attribute("Body")!.Value,
+            Subject = element.Attribute("Subject")!.Value,
+            DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value),
+            SenderName = element.Attribute("SenderName")!.Value,
+            ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value),
+            MessageId = element.Attribute("MessageId")!.Value,
+        };
+    }
+
+    public MessageInfoViewModel GetViewModel => new()
+    {
+        Body = Body,
+        Subject = Subject,
+        DateDelivery = DateDelivery,
+        SenderName = SenderName,
+        ClientId = ClientId,
+        MessageId = MessageId
+    };
+
+    public XElement GetXElement => new("MessageInfo",
+        new XAttribute("Subject", Subject),
+        new XAttribute("Body", Body),
+        new XAttribute("ClientId", ClientId),
+        new XAttribute("MessageId", MessageId),
+        new XAttribute("SenderName", SenderName),
+        new XAttribute("DateDelivery", DateDelivery)
+        );
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarModels/Models/IMessageInfoModel.cs b/SushiBar/SushiBarModels/Models/IMessageInfoModel.cs
new file mode 100644
index 0000000..360e36d
--- /dev/null
+++ b/SushiBar/SushiBarModels/Models/IMessageInfoModel.cs
@@ -0,0 +1,11 @@
+namespace SushiBarDataModels.Models;
+
+public interface IMessageInfoModel
+{
+    string MessageId { get; }
+    int? ClientId { get; }
+    string SenderName { get; }
+    DateTime DateDelivery { get; }
+    string Subject { get; }
+    string Body { get; }
+}
\ No newline at end of file
diff --git a/SushiBar/SushiBarRestApi/Controllers/ClientController.cs b/SushiBar/SushiBarRestApi/Controllers/ClientController.cs
index 2925099..41dba3f 100644
--- a/SushiBar/SushiBarRestApi/Controllers/ClientController.cs
+++ b/SushiBar/SushiBarRestApi/Controllers/ClientController.cs
@@ -12,9 +12,14 @@ public class ClientController : Controller
 {
     private readonly ILogger _logger;
     private readonly IClientLogic _logic;
-    public ClientController(IClientLogic logic, ILogger<ClientController> logger)
+    private readonly IMessageInfoLogic _mailLogic;
+    
+    public ClientController(IClientLogic logic, 
+        ILogger<ClientController> logger, 
+        IMessageInfoLogic mailLogic)
     {
         _logger = logger;
+        _mailLogic = mailLogic;
         _logic = logic;
     }
     
@@ -63,4 +68,20 @@ public class ClientController : Controller
         }
     }
 
+    [HttpGet]
+    public List<MessageInfoViewModel>? GetMessages(int clientId)
+    {
+        try
+        {
+            return _mailLogic.ReadList(new MessageInfoSearchModel
+            {
+                ClientId = clientId
+            });
+        }
+        catch (Exception ex)
+        {
+            _logger.LogError(ex, "Error");
+            throw;
+        }
+    }
 }
\ No newline at end of file
diff --git a/SushiBar/SushiBarRestApi/Controllers/ImplementerController.cs b/SushiBar/SushiBarRestApi/Controllers/ImplementerController.cs
index 5841e24..6775502 100644
--- a/SushiBar/SushiBarRestApi/Controllers/ImplementerController.cs
+++ b/SushiBar/SushiBarRestApi/Controllers/ImplementerController.cs
@@ -47,7 +47,7 @@ public class ImplementerController : Controller
         {
             return _order.ReadList(new OrderSearchModel
             {
-                Status = OrderStatus.Accepted
+                Status = new List<OrderStatus>() { OrderStatus.Accepted }
             });
         }
         catch (Exception ex)
diff --git a/SushiBar/SushiBarRestApi/Program.cs b/SushiBar/SushiBarRestApi/Program.cs
index 362984c..e3991b6 100644
--- a/SushiBar/SushiBarRestApi/Program.cs
+++ b/SushiBar/SushiBarRestApi/Program.cs
@@ -3,6 +3,8 @@ using SushiBarContracts.BusinessLogicsContracts;
 using SushiBarContracts.StoragesContracts;
 using SushiBarDatabaseImplement.Implements;
 using Microsoft.OpenApi.Models;
+using SushiBarBusinessLogic.MailWorker;
+using SushiBarContracts.BindingModels;
 
 var builder = WebApplication.CreateBuilder(args);
 
@@ -14,10 +16,14 @@ builder.Logging.AddLog4Net("log4net.config");
 builder.Services.AddTransient<IClientStorage, ClientStorage>();
 builder.Services.AddTransient<IOrderStorage, OrderStorage>();
 builder.Services.AddTransient<ISushiStorage, SushiStorage>();
-
+builder.Services.AddTransient<IImplementerStorage, ImplementerStorage>();
+builder.Services.AddTransient<IMessageInfoStorage, MessageStorage>();
 builder.Services.AddTransient<IOrderLogic, OrderLogic>();
 builder.Services.AddTransient<IClientLogic, ClientLogic>();
 builder.Services.AddTransient<ISushiLogic, SushiLogic>();
+builder.Services.AddTransient<IImplementerLogic, ImplementerLogic>();
+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
@@ -26,6 +32,21 @@ builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title
 
 
 var app = builder.Build();
+var mailSender = app.Services.GetService<AbstractMailWorker>();
+mailSender?.MailConfig(new MailConfigBindingModel
+{
+    MailLogin = builder.Configuration?.GetSection("MailLogin")?.Value
+                ?? string.Empty,
+    MailPassword = builder.Configuration?.GetSection("MailPassword")?.Value ??
+                   string.Empty,
+    SmtpClientHost = builder.Configuration?.GetSection("SmtpClientHost")?.Value ??
+                     string.Empty,
+    SmtpClientPort = Convert.ToInt32(builder.Configuration?.GetSection("SmtpClientPort")?.Value),
+    PopHost = builder.Configuration?.GetSection("PopHost")?.Value ??
+              string.Empty,
+    PopPort = Convert.ToInt32(builder.Configuration?.GetSection("PopPort")?.Value)
+});
+
 
 // Configure the HTTP request pipeline.
 if (app.Environment.IsDevelopment())
diff --git a/SushiBar/SushiBarRestApi/appsettings.json b/SushiBar/SushiBarRestApi/appsettings.json
index 10f68b8..3f00fa7 100644
--- a/SushiBar/SushiBarRestApi/appsettings.json
+++ b/SushiBar/SushiBarRestApi/appsettings.json
@@ -5,5 +5,11 @@
       "Microsoft.AspNetCore": "Warning"
     }
   },
-  "AllowedHosts": "*"
+  "AllowedHosts": "*",
+  "SmtpClientHost": "smtp.gmail.com",
+  "SmtpClientPort": "587",
+  "PopHost": "pop.gmail.com",
+  "PopPort": "995",
+  "MailLogin": "sushibarulyanosk7@gmail.com",
+  "MailPassword": "qwzj uqlx uukp bpmc"
 }
diff --git a/SushiBar/SushibarListImplement/DataListSingleton.cs b/SushiBar/SushibarListImplement/DataListSingleton.cs
index fe4b45b..0ff341f 100644
--- a/SushiBar/SushibarListImplement/DataListSingleton.cs
+++ b/SushiBar/SushibarListImplement/DataListSingleton.cs
@@ -9,6 +9,7 @@ namespace SushibarListImplement
         public List<Order> Orders { get; set; }
         public List<Sushi> Sushi { get; set; }
         public List<Implementer> Implementers { get; set; }
+        public List<Message> Messages { get; set; }
 
         private DataListSingleton()
         {
@@ -16,6 +17,7 @@ namespace SushibarListImplement
             Orders = new List<Order>();
             Sushi = new List<Sushi>();
             Implementers = new List<Implementer>();
+            Messages = new List<Message>();
         }
         public static DataListSingleton GetInstance()
         {
diff --git a/SushiBar/SushibarListImplement/Implements/MessageInfoStorage.cs b/SushiBar/SushibarListImplement/Implements/MessageInfoStorage.cs
new file mode 100644
index 0000000..27f4802
--- /dev/null
+++ b/SushiBar/SushibarListImplement/Implements/MessageInfoStorage.cs
@@ -0,0 +1,62 @@
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.SearchModels;
+using SushiBarContracts.StoragesContracts;
+using SushiBarContracts.ViewModels;
+using SushibarListImplement.Models;
+
+namespace SushibarListImplement.Implements;
+
+public class MessageInfoStorage : IMessageInfoStorage
+{
+    private readonly DataListSingleton _source;
+    public MessageInfoStorage()
+    {
+        _source = DataListSingleton.GetInstance();
+    }
+    public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
+    {
+        if (model.MessageId == null) return null;
+        foreach (var message in _source.Messages)
+        {
+            if (model.MessageId.Equals(message.MessageId))
+                return message.GetViewModel;
+        }
+
+        return null;
+    }
+
+    public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
+    {
+        if (!model.ClientId.HasValue)
+        {
+            return new List<MessageInfoViewModel>();
+        }
+        var result = new List<MessageInfoViewModel>();
+        foreach (var item in _source.Messages)
+        {
+            if (item.ClientId == model.ClientId)
+            {
+                result.Add(item.GetViewModel);
+            }
+        }
+        return result;
+    }
+
+    public List<MessageInfoViewModel> GetFullList()
+    {
+        var result = new List<MessageInfoViewModel>();
+        foreach (var item in _source.Messages)
+        {
+            result.Add(item.GetViewModel);
+        }
+        return result;
+    }
+
+    public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
+    {
+        var newMessage = Message.Create(model);
+        if (newMessage == null) return null;
+        _source.Messages.Add(newMessage);
+        return newMessage.GetViewModel;
+    }
+}
\ No newline at end of file
diff --git a/SushiBar/SushibarListImplement/Models/Message.cs b/SushiBar/SushibarListImplement/Models/Message.cs
new file mode 100644
index 0000000..2f2ce2d
--- /dev/null
+++ b/SushiBar/SushibarListImplement/Models/Message.cs
@@ -0,0 +1,42 @@
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.ViewModels;
+using SushiBarDataModels.Models;
+
+namespace SushibarListImplement.Models;
+
+public class Message : 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 Message? Create(MessageInfoBindingModel? model)
+    {
+        if (model == null)
+        {
+            return null;
+        }
+        return new Message
+        {
+            Body = model.Body,
+            Subject = model.Subject,
+            DateDelivery = model.DateDelivery,
+            SenderName = model.SenderName,
+            ClientId = model.ClientId,
+            MessageId = model.MessageId
+        };
+    }
+
+    public MessageInfoViewModel GetViewModel => new()
+    {
+        Body = Body,
+        Subject = Subject,
+        DateDelivery = DateDelivery,
+        SenderName = SenderName,
+        ClientId = ClientId,
+        MessageId = MessageId
+    };
+}
\ No newline at end of file