59 lines
2.0 KiB
C#
59 lines
2.0 KiB
C#
// Copyright (c) 2023 Tudor Stanciu
|
|
|
|
using Correo.Abstractions;
|
|
using Correo.Abstractions.Extensions;
|
|
using Correo.SendGrid.Extensions;
|
|
using Correo.SendGrid.Models;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Options;
|
|
using Newtonsoft.Json;
|
|
using SendGrid;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Correo.SendGrid
|
|
{
|
|
internal class SendGridService : IMailer
|
|
{
|
|
private readonly IOptions<SendGridOptions> _optionsAccessor;
|
|
private readonly SendGridClient _client;
|
|
private readonly ILogger<SendGridService> _logger;
|
|
|
|
public SendGridService(IOptions<SendGridOptions> optionsAccessor, ILogger<SendGridService> logger)
|
|
{
|
|
_optionsAccessor = optionsAccessor;
|
|
_logger = logger;
|
|
_client = new SendGridClient(_optionsAccessor.Value.ApiKey);
|
|
}
|
|
|
|
public void SendEmail(EmailMessage message)
|
|
{
|
|
SendEmailAsync(message).GetAwaiter().GetResult();
|
|
}
|
|
|
|
public async Task SendEmailAsync(EmailMessage message, CancellationToken token = default)
|
|
{
|
|
var mailMessage = message.ToSendGridMessage();
|
|
var response = await _client.SendEmailAsync(mailMessage, token);
|
|
if (response.IsSuccessStatusCode)
|
|
_logger.LogInformation(message.Log());
|
|
else
|
|
{
|
|
var body = await response.DeserializeResponseBodyAsync();
|
|
var found = body.TryGetValue("errors", out var jsonData);
|
|
if (found)
|
|
{
|
|
string errorsString = Convert.ToString(jsonData);
|
|
var errors = JsonConvert.DeserializeObject<Error[]>(errorsString);
|
|
var errorMessage = string.Join("; ", errors.Select(z => z.Message));
|
|
throw new Exception(errorMessage);
|
|
}
|
|
|
|
throw new Exception(response.StatusCode.ToString());
|
|
}
|
|
}
|
|
}
|
|
}
|