using Correo.Abstractions; using Correo.Abstractions.Extensions; using Correo.Mailgun.Extensions; using Correo.Mailgun.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using RestSharp; using RestSharp.Authenticators; using System; using System.Threading; using System.Threading.Tasks; namespace Correo.Mailgun { internal class MailgunService : IMailer, IDisposable { private readonly IOptions _optionsAccessor; private readonly RestClient _client; private readonly ILogger _logger; public MailgunService(IOptions optionsAccessor, ILogger logger) { _optionsAccessor = optionsAccessor; _logger = logger; _client = new RestClient("https://api.mailgun.net/v3") { Authenticator = new HttpBasicAuthenticator("api", _optionsAccessor.Value.ApiKey) }; } public void Dispose() { _client.Dispose(); GC.SuppressFinalize(this); } public void SendEmail(EmailMessage message) { SendEmailAsync(message).GetAwaiter().GetResult(); } public async Task SendEmailAsync(EmailMessage message, CancellationToken token = default) { var request = new RestRequest(); request.AddParameter("domain", _optionsAccessor.Value.Domain, ParameterType.UrlSegment); request.Resource = "{domain}/messages"; request.AddParameter("subject", message.Subject); var contentKey = message.IsBodyHtml ? "html" : "text"; request.AddParameter(contentKey, message.Body); request.AddParameter("from", message.From.ToMailgunAddress()); request.AddParameter("to", message.To.ToMailgunAddresses()); var cc = message.Cc.ToMailgunAddresses(); if (cc != null) request.AddParameter("cc", cc); var bcc = message.Bcc.ToMailgunAddresses(); if (bcc != null) request.AddParameter("bcc", bcc); request.Method = Method.Post; var response = await _client.ExecuteAsync(request, token); if (response.IsSuccessful) { _logger.LogInformation($"Mailgun response: {response.Data.Message} {response.Data.Id}"); _logger.LogInformation(message.Log()); } else { throw new Exception($"Mailgun error: {response.Data.Message}"); } } } }