77 lines
2.6 KiB
C#
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}");
|
|
}
|
|
}
|
|
}
|
|
}
|