using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.Extensions.Options; using MimeKit; namespace Indotalent.Infrastructure.Email.Smtp; public class SmtpEmailSender : IEmailSender { private readonly SmtpSettingsModel _settings; public SmtpEmailSender(IOptions emailOptions) { _settings = emailOptions.Value.Smtp; } public async Task SendEmailAsync(string email, string subject, string htmlMessage) { var message = new MimeMessage(); message.From.Add(new MailboxAddress(_settings.FromName, _settings.FromAddress)); message.To.Add(MailboxAddress.Parse(email)); message.Subject = subject; var bodyBuilder = new BodyBuilder { HtmlBody = htmlMessage }; message.Body = bodyBuilder.ToMessageBody(); using var client = new SmtpClient(); try { await client.ConnectAsync(_settings.Host, _settings.Port, SecureSocketOptions.Auto); if (!string.IsNullOrEmpty(_settings.UserName)) { await client.AuthenticateAsync(_settings.UserName, _settings.Password); } await client.SendAsync(message); } catch (Exception ex) { throw new Exception($"Failed to send email via SMTP to {email} via {_settings.Host}. Error: {ex.Message}", ex); } finally { await client.DisconnectAsync(true); } } }