using Correo.Abstractions; using Correo.Abstractions.Extensions; using Correo.MailKit.Extensions; using Correo.MailKit.Models; using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Net; using System.Threading; using System.Threading.Tasks; namespace Correo.MailKit { internal class MailKitSmtpClient : IMailer, IDisposable { private readonly IOptions _optionsAccessor; private readonly SmtpClient _smtpClient; private readonly ILogger _logger; public MailKitSmtpClient(IOptions optionsAccessor, ILogger logger) { _optionsAccessor = optionsAccessor; _logger = logger; var options = _optionsAccessor.Value; _smtpClient = new SmtpClient(); _smtpClient.Connect(options.Server, options.Port, options.EnableSsl ? SecureSocketOptions.Auto : SecureSocketOptions.None); if (options.UseAuthentication) _smtpClient.Authenticate(options.Authentication.UserName, options.Authentication.Password); if (options.TrustServer) ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; } public void Dispose() { _smtpClient?.Disconnect(true); _smtpClient?.Dispose(); GC.SuppressFinalize(this); } public void SendEmail(EmailMessage message) { var mailMessage = message.ToMailMessage(); _smtpClient.Send(mailMessage); Log(message); } public async Task SendEmailAsync(EmailMessage message, CancellationToken token = default) { var mailMessage = message.ToMailMessage(); await _smtpClient.SendAsync(mailMessage, token); Log(message); } private void Log(EmailMessage message) => _logger.LogInformation($"Email sent: Subject: {message.Subject}; From: {message.From.Address}; To: {message.To.Log()}; Cc: {message.Cc.Log()}; Bcc: {message.Bcc.Log()};"); } }