correo/src/Correo.Mailgun/MailgunService.cs

77 lines
2.6 KiB
C#

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<MailgunOptions> _optionsAccessor;
private readonly RestClient _client;
private readonly ILogger<MailgunService> _logger;
public MailgunService(IOptions<MailgunOptions> optionsAccessor, ILogger<MailgunService> 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<MailgunResponse>(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}");
}
}
}
}