using GestionIntegral.Api.Models.Comunicaciones; using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.Extensions.Options; using MimeKit; namespace GestionIntegral.Api.Services.Comunicaciones { public class EmailService : IEmailService { private readonly MailSettings _mailSettings; private readonly ILogger _logger; public EmailService(IOptions mailSettings, ILogger logger) { _mailSettings = mailSettings.Value; _logger = logger; } public async Task EnviarEmailAsync(string destinatarioEmail, string destinatarioNombre, string asunto, string cuerpoHtml, byte[]? attachment = null, string? attachmentName = null) { var email = new MimeMessage(); email.Sender = new MailboxAddress(_mailSettings.SenderName, _mailSettings.SenderEmail); email.From.Add(email.Sender); email.To.Add(new MailboxAddress(destinatarioNombre, destinatarioEmail)); email.Subject = asunto; var builder = new BodyBuilder { HtmlBody = cuerpoHtml }; if (attachment != null && !string.IsNullOrEmpty(attachmentName)) { builder.Attachments.Add(attachmentName, attachment, ContentType.Parse("application/pdf")); } email.Body = builder.ToMessageBody(); using var smtp = new SmtpClient(); try { await smtp.ConnectAsync(_mailSettings.SmtpHost, _mailSettings.SmtpPort, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync(_mailSettings.SmtpUser, _mailSettings.SmtpPass); await smtp.SendAsync(email); _logger.LogInformation("Email enviado exitosamente a {Destinatario}", destinatarioEmail); } catch (Exception ex) { _logger.LogError(ex, "Error al enviar email a {Destinatario}", destinatarioEmail); throw; // Relanzar para que el servicio que lo llamó sepa que falló } finally { await smtp.DisconnectAsync(true); } } public async Task EnviarEmailConsolidadoAsync(string destinatarioEmail, string destinatarioNombre, string asunto, string cuerpoHtml, List<(byte[] content, string name)> adjuntos) { var email = new MimeMessage(); email.Sender = new MailboxAddress(_mailSettings.SenderName, _mailSettings.SenderEmail); email.From.Add(email.Sender); email.To.Add(new MailboxAddress(destinatarioNombre, destinatarioEmail)); email.Subject = asunto; var builder = new BodyBuilder { HtmlBody = cuerpoHtml }; if (adjuntos != null) { foreach (var adjunto in adjuntos) { builder.Attachments.Add(adjunto.name, adjunto.content, ContentType.Parse("application/pdf")); } } email.Body = builder.ToMessageBody(); using var smtp = new SmtpClient(); try { await smtp.ConnectAsync(_mailSettings.SmtpHost, _mailSettings.SmtpPort, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync(_mailSettings.SmtpUser, _mailSettings.SmtpPass); await smtp.SendAsync(email); _logger.LogInformation("Email consolidado enviado exitosamente a {Destinatario}", destinatarioEmail); } catch (Exception ex) { _logger.LogError(ex, "Error al enviar email consolidado a {Destinatario}", destinatarioEmail); throw; } finally { await smtp.DisconnectAsync(true); } } } }