From a824aad0b11e8127ab79dbe14171e4ec2f03ff25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=BD=D0=B0=20=D0=97=D0=B0=D0=B1=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D0=BD=D0=B0?= Date: Sat, 11 May 2024 20:16:51 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MailWorker/AbstractMailWorker.cs | 59 +++++++++++++++++++ .../MailWorker/MailKitWorker.cs | 44 ++++++++++++++ .../BindingModels/MailConfigBindingModel.cs | 12 ++++ .../BindingModels/MailSendInfoBindingModel.cs | 9 +++ .../Controllers/HomeController.cs | 14 ++++- .../Views/Home/ListMembersToPdfFile.cshtml | 12 ++++ .../Controllers/ReportController.cs | 25 ++++++-- Hotel/HotelRestApi/Program.cs | 16 +++++ Hotel/HotelRestApi/appsettings.json | 9 ++- 9 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 Hotel/HotelBusinessLogic/MailWorker/AbstractMailWorker.cs create mode 100644 Hotel/HotelBusinessLogic/MailWorker/MailKitWorker.cs create mode 100644 Hotel/HotelContracts/BindingModels/MailConfigBindingModel.cs create mode 100644 Hotel/HotelContracts/BindingModels/MailSendInfoBindingModel.cs diff --git a/Hotel/HotelBusinessLogic/MailWorker/AbstractMailWorker.cs b/Hotel/HotelBusinessLogic/MailWorker/AbstractMailWorker.cs new file mode 100644 index 0000000..78c1a37 --- /dev/null +++ b/Hotel/HotelBusinessLogic/MailWorker/AbstractMailWorker.cs @@ -0,0 +1,59 @@ +using HotelContracts.BindingModels; +using HotelContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; + +namespace HotelBusinessLogic.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 IOrganiserLogic _organiserLogic; + private readonly ILogger _logger; + + public AbstractMailWorker(ILogger logger, IOrganiserLogic organiserLogic) + { + _logger = logger; + _organiserLogic = organiserLogic; + } + + 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/Hotel/HotelBusinessLogic/MailWorker/MailKitWorker.cs b/Hotel/HotelBusinessLogic/MailWorker/MailKitWorker.cs new file mode 100644 index 0000000..ef4f603 --- /dev/null +++ b/Hotel/HotelBusinessLogic/MailWorker/MailKitWorker.cs @@ -0,0 +1,44 @@ +using HotelContracts.BindingModels; +using HotelContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +using System.Net.Mail; +using System.Net.Mime; +using System.Net; +using System.Text; + +namespace HotelBusinessLogic.MailWorker +{ + public class MailKitWorker : AbstractMailWorker + { + public MailKitWorker(ILogger logger, IOrganiserLogic organiserLogic) : base(logger, organiserLogic) { } + + 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; + Attachment attachment = new Attachment("C:\\Reports\\pdffile.pdf", new ContentType(MediaTypeNames.Application.Pdf)); + objMailMessage.Attachments.Add(attachment); + + 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/Hotel/HotelContracts/BindingModels/MailConfigBindingModel.cs b/Hotel/HotelContracts/BindingModels/MailConfigBindingModel.cs new file mode 100644 index 0000000..ce97c09 --- /dev/null +++ b/Hotel/HotelContracts/BindingModels/MailConfigBindingModel.cs @@ -0,0 +1,12 @@ +namespace HotelContracts.BindingModels +{ + public class MailConfigBindingModel + { + public string MailLogin { get; set; } = string.Empty; + public string MailPassword { get; set; } = string.Empty; + public string SmtpClientHost { get; set; } = string.Empty; + public int SmtpClientPort { get; set; } + public string PopHost { get; set; } = string.Empty; + public int PopPort { get; set; } + } +} diff --git a/Hotel/HotelContracts/BindingModels/MailSendInfoBindingModel.cs b/Hotel/HotelContracts/BindingModels/MailSendInfoBindingModel.cs new file mode 100644 index 0000000..85c32d9 --- /dev/null +++ b/Hotel/HotelContracts/BindingModels/MailSendInfoBindingModel.cs @@ -0,0 +1,9 @@ +namespace HotelContracts.BindingModels +{ + public class MailSendInfoBindingModel + { + public string MailAddress { get; set; } = string.Empty; + public string Subject { get; set; } = string.Empty; + public string Text { get; set; } = string.Empty; + } +} diff --git a/Hotel/HotelOrganiserApp/Controllers/HomeController.cs b/Hotel/HotelOrganiserApp/Controllers/HomeController.cs index 162a3fa..e0a7703 100644 --- a/Hotel/HotelOrganiserApp/Controllers/HomeController.cs +++ b/Hotel/HotelOrganiserApp/Controllers/HomeController.cs @@ -640,18 +640,28 @@ namespace HotelOrganiserApp.Controllers } [HttpPost] - public void ListMembersToPdfFile(DateTime dateFrom, DateTime dateTo) + public void ListMembersToPdfFile(DateTime dateFrom, DateTime dateTo, string organiserEmail) { if (APIClient.Organiser == null) { throw new Exception("Вы как суда попали? Суда вход только авторизованным"); } - APIClient.PostRequest("api/report/CreateReportToPdfFile", new ReportOrganiserBindingModel + if (string.IsNullOrEmpty(organiserEmail)) + { + throw new Exception("Email пуст"); + } + APIClient.PostRequest("api/report/CreateOrganiserReportToPdfFile", new ReportOrganiserBindingModel { DateFrom = dateFrom, DateTo = dateTo, OrganiserId = APIClient.Organiser.Id }); + APIClient.PostRequest("api/report/SendPdfToMail", new MailSendInfoBindingModel + { + MailAddress = organiserEmail, + Subject = "Отчет по участникам (pdf)", + Text = "Отчет по участникам с " + dateFrom.ToShortDateString() + " до " + dateTo.ToShortDateString() + }); Response.Redirect("ListMembersToPdfFile"); } diff --git a/Hotel/HotelOrganiserApp/Views/Home/ListMembersToPdfFile.cshtml b/Hotel/HotelOrganiserApp/Views/Home/ListMembersToPdfFile.cshtml index b6331a8..e7cd512 100644 --- a/Hotel/HotelOrganiserApp/Views/Home/ListMembersToPdfFile.cshtml +++ b/Hotel/HotelOrganiserApp/Views/Home/ListMembersToPdfFile.cshtml @@ -25,6 +25,18 @@ +
+ + +
+ +
+
+
+ +
+
+
diff --git a/Hotel/HotelRestApi/Controllers/ReportController.cs b/Hotel/HotelRestApi/Controllers/ReportController.cs index 7f3ccf8..848c11e 100644 --- a/Hotel/HotelRestApi/Controllers/ReportController.cs +++ b/Hotel/HotelRestApi/Controllers/ReportController.cs @@ -1,4 +1,5 @@ -using HotelContracts.BindingModels; +using HotelBusinessLogic.MailWorker; +using HotelContracts.BindingModels; using HotelContracts.BusinessLogicsContracts; using Microsoft.AspNetCore.Mvc; @@ -11,13 +12,15 @@ namespace HotelRestApi.Controllers private readonly ILogger _logger; private readonly IReportOrganiserLogic _reportOrganiserLogic; private readonly IReportHeadwaiterLogic _reportHeadwaiterLogic; + private readonly AbstractMailWorker _mailWorker; - public ReportController(ILogger logger, IReportOrganiserLogic reportOrganiserLogic, IReportHeadwaiterLogic reportHeadwaiterLogic) + public ReportController(ILogger logger, IReportOrganiserLogic reportOrganiserLogic, IReportHeadwaiterLogic reportHeadwaiterLogic, AbstractMailWorker mailWorker) { _logger = logger; _reportOrganiserLogic = reportOrganiserLogic; _reportHeadwaiterLogic = reportHeadwaiterLogic; - } + _mailWorker = mailWorker; + } [HttpPost] public void CreateOrganiserReportToPdfFile(ReportOrganiserBindingModel model) @@ -39,7 +42,21 @@ namespace HotelRestApi.Controllers } } - [HttpPost] + [HttpPost] + public void SendPdfToMail(MailSendInfoBindingModel model) + { + try + { + _mailWorker.MailSendAsync(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отправки письма"); + throw; + } + } + + [HttpPost] public void CreateOrganiserReportToWordFile(ReportOrganiserBindingModel model) { try diff --git a/Hotel/HotelRestApi/Program.cs b/Hotel/HotelRestApi/Program.cs index f83c4fb..255843c 100644 --- a/Hotel/HotelRestApi/Program.cs +++ b/Hotel/HotelRestApi/Program.cs @@ -5,6 +5,8 @@ using HotelDataBaseImplement.Implemets; using Microsoft.OpenApi.Models; using HotelBusinessLogic.OfficePackage; using HotelBusinessLogic.OfficePackage.Implements; +using HotelBusinessLogic.MailWorker; +using HotelContracts.BindingModels; var builder = WebApplication.CreateBuilder(args); @@ -39,6 +41,8 @@ builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddSingleton(); + builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); @@ -53,6 +57,18 @@ builder.Services.AddSwaggerGen(c => var app = builder.Build(); +var mailSender = app.Services.GetService(); + +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/Hotel/HotelRestApi/appsettings.json b/Hotel/HotelRestApi/appsettings.json index 10f68b8..f1495d8 100644 --- a/Hotel/HotelRestApi/appsettings.json +++ b/Hotel/HotelRestApi/appsettings.json @@ -5,5 +5,12 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + + "SmtpClientHost": "smtp.gmail.com", + "SmtpClientPort": "587", + "PopHost": "pop.gmail.com", + "PopPort": "995", + "MailLogin": "laba46466@gmail.com", + "MailPassword": "iyin rgai wjdh ocmi" }