You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.5 KiB
85 lines
2.5 KiB
using System.Net;
|
|
using System.Net.Http;
|
|
using NzbDrone.Common.Http;
|
|
using NzbDrone.Common.Serializer;
|
|
|
|
namespace NzbDrone.Core.Notifications.SendGrid
|
|
{
|
|
public interface ISendGridProxy
|
|
{
|
|
void SendNotification(string title, string message, SendGridSettings settings);
|
|
}
|
|
|
|
public class SendGridProxy : ISendGridProxy
|
|
{
|
|
private readonly IHttpClient _httpClient;
|
|
|
|
public SendGridProxy(IHttpClient httpClient)
|
|
{
|
|
_httpClient = httpClient;
|
|
}
|
|
|
|
public void SendNotification(string title, string message, SendGridSettings settings)
|
|
{
|
|
try
|
|
{
|
|
var request = BuildRequest(settings, "mail/send", HttpMethod.Post);
|
|
|
|
var payload = new SendGridPayload
|
|
{
|
|
From = new SendGridEmail
|
|
{
|
|
Email = settings.From
|
|
}
|
|
};
|
|
|
|
payload.Content.Add(new SendGridContent
|
|
{
|
|
Type = "text/plain",
|
|
Value = message
|
|
});
|
|
|
|
var personalization = new SendGridPersonalization
|
|
{
|
|
Subject = title,
|
|
};
|
|
|
|
foreach (var recipient in settings.Recipients)
|
|
{
|
|
personalization.To.Add(new SendGridEmail
|
|
{
|
|
Email = recipient
|
|
});
|
|
}
|
|
|
|
payload.Personalizations.Add(personalization);
|
|
|
|
request.SetContent(payload.ToJson());
|
|
|
|
_httpClient.Execute(request);
|
|
}
|
|
catch (HttpException ex)
|
|
{
|
|
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
|
|
{
|
|
throw new SendGridException("Unauthorized - AuthToken is invalid");
|
|
}
|
|
|
|
throw new SendGridException("Unable to connect to SendGrid. Status Code: {0}", ex);
|
|
}
|
|
}
|
|
|
|
private HttpRequest BuildRequest(SendGridSettings settings, string resource, HttpMethod method)
|
|
{
|
|
var request = new HttpRequestBuilder(settings.BaseUrl).Resource(resource)
|
|
.SetHeader("Authorization", $"Bearer {settings.ApiKey}")
|
|
.Build();
|
|
|
|
request.Headers.ContentType = "application/json";
|
|
request.Method = method;
|
|
|
|
return request;
|
|
}
|
|
}
|
|
}
|