From 4c7730f5e35014b6246762709f27795d4ace0f38 Mon Sep 17 00:00:00 2001 From: Stephen Adams Date: Sat, 24 Feb 2024 11:23:33 +1300 Subject: [PATCH 1/2] Changed binding of MailgunSender to singleton scope --- .../FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Senders/FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs b/src/Senders/FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs index 69762e6d..efa46d81 100644 --- a/src/Senders/FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs +++ b/src/Senders/FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs @@ -8,7 +8,7 @@ public static class FluentEmailMailgunBuilderExtensions { public static FluentEmailServicesBuilder AddMailGunSender(this FluentEmailServicesBuilder builder, string domainName, string apiKey, MailGunRegion mailGunRegion = MailGunRegion.USA) { - builder.Services.TryAdd(ServiceDescriptor.Scoped(_ => new MailgunSender(domainName, apiKey, mailGunRegion))); + builder.Services.TryAdd(ServiceDescriptor.Singleton(_ => new MailgunSender(domainName, apiKey, mailGunRegion))); return builder; } } From a7a75e94f7edd5e6718ab7b481642bc1b3928714 Mon Sep 17 00:00:00 2001 From: Stephen Adams Date: Tue, 27 Feb 2024 20:03:37 +1300 Subject: [PATCH 2/2] Change MailgunSender to use IHttpClientFactory --- .../FluentEmail.Mailgun.csproj | 1 + .../FluentEmailMailgunBuilderExtensions.cs | 29 +++++++++++++-- .../FluentEmail.Mailgun/MailgunSender.cs | 35 +++---------------- .../FluentEmail.Core.Tests.csproj | 1 + .../MailgunSenderTests.cs | 4 ++- 5 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/Senders/FluentEmail.Mailgun/FluentEmail.Mailgun.csproj b/src/Senders/FluentEmail.Mailgun/FluentEmail.Mailgun.csproj index 2ad7eff6..03dcd2d9 100644 --- a/src/Senders/FluentEmail.Mailgun/FluentEmail.Mailgun.csproj +++ b/src/Senders/FluentEmail.Mailgun/FluentEmail.Mailgun.csproj @@ -8,6 +8,7 @@ + diff --git a/src/Senders/FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs b/src/Senders/FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs index efa46d81..14a13ddc 100644 --- a/src/Senders/FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs +++ b/src/Senders/FluentEmail.Mailgun/FluentEmailMailgunBuilderExtensions.cs @@ -1,4 +1,8 @@ -using FluentEmail.Core.Interfaces; +using System; +using System.Net.Http.Headers; +using System.Net.Http; +using System.Text; +using FluentEmail.Core.Interfaces; using FluentEmail.Mailgun; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -8,7 +12,28 @@ public static class FluentEmailMailgunBuilderExtensions { public static FluentEmailServicesBuilder AddMailGunSender(this FluentEmailServicesBuilder builder, string domainName, string apiKey, MailGunRegion mailGunRegion = MailGunRegion.USA) { - builder.Services.TryAdd(ServiceDescriptor.Singleton(_ => new MailgunSender(domainName, apiKey, mailGunRegion))); + builder.Services.AddHttpClient(nameof(MailgunSender), + client => + { + string url = string.Empty; + switch (mailGunRegion) + { + case MailGunRegion.USA: + url = $"https://api.mailgun.net/v3/{domainName}/"; + break; + case MailGunRegion.EU: + url = $"https://api.eu.mailgun.net/v3/{domainName}/"; + break; + + default: + throw new ArgumentException($"'{mailGunRegion}' is not a valid value for {nameof(mailGunRegion)}"); + } + + client.BaseAddress = new Uri(url); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"api:{apiKey}"))); + }); + + builder.Services.TryAdd(ServiceDescriptor.Scoped()); return builder; } } diff --git a/src/Senders/FluentEmail.Mailgun/MailgunSender.cs b/src/Senders/FluentEmail.Mailgun/MailgunSender.cs index c1f3f359..0698e44b 100644 --- a/src/Senders/FluentEmail.Mailgun/MailgunSender.cs +++ b/src/Senders/FluentEmail.Mailgun/MailgunSender.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Net.Http; -using System.Net.Http.Headers; -using System.Text; using System.Threading; using System.Threading.Tasks; using FluentEmail.Core; @@ -15,33 +12,11 @@ namespace FluentEmail.Mailgun { public class MailgunSender : ISender { - private readonly string _apiKey; - private readonly string _domainName; - private HttpClient _httpClient; + private readonly HttpClient _httpClient; - public MailgunSender(string domainName, string apiKey, MailGunRegion mailGunRegion = MailGunRegion.USA) - { - _domainName = domainName; - _apiKey = apiKey; - string url = string.Empty; - switch(mailGunRegion) - { - case MailGunRegion.USA: - url = $"https://api.mailgun.net/v3/{_domainName}/"; - break; - case MailGunRegion.EU: - url = $"https://api.eu.mailgun.net/v3/{_domainName}/"; - break; - - default: - throw new ArgumentException($"'{mailGunRegion}' is not a valid value for {nameof(mailGunRegion)}"); - } - _httpClient = new HttpClient - { - BaseAddress = new Uri(url) - }; - - _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"api:{_apiKey}"))); + public MailgunSender(IHttpClientFactory httpClientfactory) + { + _httpClient = httpClientfactory.CreateClient(nameof(MailgunSender)); } public SendResponse Send(IFluentEmail email, CancellationToken? token = null) diff --git a/test/FluentEmail.Core.Tests/FluentEmail.Core.Tests.csproj b/test/FluentEmail.Core.Tests/FluentEmail.Core.Tests.csproj index cc26ca67..62da9162 100644 --- a/test/FluentEmail.Core.Tests/FluentEmail.Core.Tests.csproj +++ b/test/FluentEmail.Core.Tests/FluentEmail.Core.Tests.csproj @@ -14,6 +14,7 @@ + diff --git a/test/FluentEmail.Core.Tests/MailgunSenderTests.cs b/test/FluentEmail.Core.Tests/MailgunSenderTests.cs index 40cb8bf9..18d3763b 100644 --- a/test/FluentEmail.Core.Tests/MailgunSenderTests.cs +++ b/test/FluentEmail.Core.Tests/MailgunSenderTests.cs @@ -4,6 +4,8 @@ using FluentEmail.Core.Models; using NUnit.Framework; using Newtonsoft.Json; +using System.Net.Http; +using Moq; namespace FluentEmail.Mailgun.Tests { @@ -17,7 +19,7 @@ public class MailgunSenderTests [SetUp] public void SetUp() { - var sender = new MailgunSender("sandboxcf5f41bbf2f84f15a386c60e253b5fe9.mailgun.org", "key-8d32c046d7f14ada8d5ba8253e3e30de"); + var sender = new MailgunSender(Mock.Of()); Email.DefaultSender = sender; }