correo/src/Correo.MailKit/MailKitSmtpClient.cs

64 lines
2.2 KiB
C#

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<SmtpClientOptions> _optionsAccessor;
private readonly SmtpClient _smtpClient;
private readonly ILogger<MailKitSmtpClient> _logger;
public MailKitSmtpClient(IOptions<SmtpClientOptions> optionsAccessor, ILogger<MailKitSmtpClient> 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()};");
}
}