diff --git a/Bank/BankBusinessLogic/BankBusinessLogic.csproj b/Bank/BankBusinessLogic/BankBusinessLogic.csproj index 45d152a..b344559 100644 --- a/Bank/BankBusinessLogic/BankBusinessLogic.csproj +++ b/Bank/BankBusinessLogic/BankBusinessLogic.csproj @@ -8,6 +8,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Bank/BankBusinessLogic/MailWorker/AbstractMailWorker.cs b/Bank/BankBusinessLogic/MailWorker/AbstractMailWorker.cs new file mode 100644 index 0000000..ba7595a --- /dev/null +++ b/Bank/BankBusinessLogic/MailWorker/AbstractMailWorker.cs @@ -0,0 +1,70 @@ +using BankContracts.BindingModels.Messages; +using BankContracts.BusinessLogicsContracts.Client; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankBusinessLogic.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 IClientLogic _clientLogic; + private readonly ILogger _logger; + + // Конструктор + public AbstractMailWorker(ILogger logger, IClientLogic clientLogic) + { + _logger = logger; + _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); + } + + protected abstract Task SendMailAsync(MailSendInfoBindingModel info); + } +} diff --git a/Bank/BankBusinessLogic/MailWorker/MailKitWorker.cs b/Bank/BankBusinessLogic/MailWorker/MailKitWorker.cs new file mode 100644 index 0000000..e4aada9 --- /dev/null +++ b/Bank/BankBusinessLogic/MailWorker/MailKitWorker.cs @@ -0,0 +1,106 @@ +using BankContracts.BindingModels.Messages; +using BankDataModels.Enums; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Mail; +using System.Text; +using System.Threading.Tasks; + +namespace BankBusinessLogic.MailWorker +{ + // Класс, отвечающий за отправку письма на почту + public class MailKitWorker + { + private string _mailLogin = string.Empty; + + private string _mailPassword = string.Empty; + + private string _smtpClientHost = string.Empty; + + private int _smtpClientPort; + + private readonly ILogger logger; + + // Конструктор + public MailKitWorker(ILogger logger) + { + this.logger = logger; + } + + public void MailConfig(MailConfigBindingModel model) + { + _mailLogin = model.MailLogin; + _mailPassword = model.MailPassword; + _smtpClientHost= model.SmtpClientHost; + _smtpClientPort = model.SmtpClientPort; + } + + public async void 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; + + MemoryStream memory = new(info.File); + + if (info.Role == MailsEnum.Клиент) + { + if (info.TypeDoc == TypeDocEnum.PDF) + { + objMailMessage.Attachments.Add(new Attachment(memory, "Отчёт_для_клиента.pdf", "application/pdf")); + } + + if (info.TypeDoc == TypeDocEnum.EXCEL) + { + objMailMessage.Attachments.Add(new Attachment(memory, "Отчёт_для_клиента.xlsx", "application/xlsx")); + } + + if (info.TypeDoc == TypeDocEnum.WORD) + { + objMailMessage.Attachments.Add(new Attachment(memory, "Отчёт_для_клиента.docx", "application/docx")); + } + } + else + { + if (info.TypeDoc == TypeDocEnum.PDF) + { + objMailMessage.Attachments.Add(new Attachment(memory, "Отчёт_для_кассира.pdf", "application/pdf")); + } + + if (info.TypeDoc == TypeDocEnum.EXCEL) + { + objMailMessage.Attachments.Add(new Attachment(memory, "Отчёт_для_кассира.xlsx", "application/xlsx")); + } + + if (info.TypeDoc == TypeDocEnum.WORD) + { + objMailMessage.Attachments.Add(new Attachment(memory, "Отчёт_для_кассира.docx", "application/docx")); + } + } + + 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; + } + } + + } +} diff --git a/Bank/BankContracts/BindingModels/Messages/MailConfigBindingModel.cs b/Bank/BankContracts/BindingModels/Messages/MailConfigBindingModel.cs new file mode 100644 index 0000000..c450082 --- /dev/null +++ b/Bank/BankContracts/BindingModels/Messages/MailConfigBindingModel.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankContracts.BindingModels.Messages +{ + // Класс для передачи данных по почте + public class MailConfigBindingModel + { + public string MailLogin { get; set; } = string.Empty; + + public string MailPassword { get; set; } = string.Empty; + + public string SmtpClientHost { get; set; } = string.Empty; + + public int SmtpClientPort { get; set; } + + public string PopHost { get; set; } = string.Empty; + + public int PopPort { get; set; } + } +} diff --git a/Bank/BankContracts/BindingModels/Messages/MailSendInfoBindingModel.cs b/Bank/BankContracts/BindingModels/Messages/MailSendInfoBindingModel.cs new file mode 100644 index 0000000..da64eaf --- /dev/null +++ b/Bank/BankContracts/BindingModels/Messages/MailSendInfoBindingModel.cs @@ -0,0 +1,26 @@ +using BankDataModels.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankContracts.BindingModels.Messages +{ + // Класс для обмена информацией по почте + public class MailSendInfoBindingModel + { + public string MailAddress { get; set; } = string.Empty; + + public string Subject { get; set; } = string.Empty; + + public string Text { get; set; } = string.Empty; + + // Для отправки pdf + public byte[] File { get; set; } = Array.Empty(); + + public MailsEnum Role { get; set; } + + public TypeDocEnum TypeDoc { get; set; } + } +} diff --git a/Bank/BankContracts/BindingModels/Messages/MessageInfoBindingModel.cs b/Bank/BankContracts/BindingModels/Messages/MessageInfoBindingModel.cs new file mode 100644 index 0000000..409ef33 --- /dev/null +++ b/Bank/BankContracts/BindingModels/Messages/MessageInfoBindingModel.cs @@ -0,0 +1,32 @@ +using BankDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankContracts.BindingModels.Messages +{ + // Реализация сущности "Сообщение" + public class MessageInfoBindingModel : IMessageInfoModel + { + public int Id { get; set; } + + public string MessageId { get; set; } = string.Empty; + + public int? ClientId { get; set; } + + public string SenderName { get; set; } = string.Empty; + + public DateTime DateDelivery { get; set; } = DateTime.Now; + + public string Subject { get; set; } = string.Empty; + + public string Body { get; set; } = string.Empty; + + // Для ответа + public bool IsRead { get; set; } = false; + + public string? Answer { get; set; } = string.Empty; + } +} diff --git a/Bank/BankDataModels/Models/IMessageInfoModel.cs b/Bank/BankDataModels/Models/IMessageInfoModel.cs new file mode 100644 index 0000000..c6202f7 --- /dev/null +++ b/Bank/BankDataModels/Models/IMessageInfoModel.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankDataModels.Models +{ + // Интерфейс, отвечающий за сообщения (на почту) + public interface IMessageInfoModel : IId + { + string MessageId { get; } + + int? ClientId { get; } + + string SenderName { get; } + + DateTime DateDelivery { get; } + + string Subject { get; } + + string Body { get; } + + public bool IsRead { get; } + + public string Answer { get; } + } +}