From 0af6c51949a543a4e9a0be0228df4d1cde4c69d8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:37:24 +0000 Subject: [PATCH 1/6] Initial plan From 3869932d578c70508fde6396a1ddb385e27f783d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:43:40 +0000 Subject: [PATCH 2/6] Replace SendGrid with SMTP2Go email service Co-authored-by: ardalis <782127+ardalis@users.noreply.github.com> --- .../DevBetterWeb.Infrastructure.csproj | 1 - ...frastructureServiceCollectionExtensions.cs | 2 +- .../Services/AuthMessageSenderOptions.cs | 6 ++- .../Services/SendGridEmailService.cs | 51 ------------------- .../Services/Smtp2GoEmailService.cs | 44 ++++++++++++++++ .../appsettings.Template.json | 6 +++ src/DevBetterWeb.Web/appsettings.json | 6 +++ 7 files changed, 61 insertions(+), 55 deletions(-) delete mode 100644 src/DevBetterWeb.Infrastructure/Services/SendGridEmailService.cs create mode 100644 src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs diff --git a/src/DevBetterWeb.Infrastructure/DevBetterWeb.Infrastructure.csproj b/src/DevBetterWeb.Infrastructure/DevBetterWeb.Infrastructure.csproj index c5bbe5347..5cb794017 100644 --- a/src/DevBetterWeb.Infrastructure/DevBetterWeb.Infrastructure.csproj +++ b/src/DevBetterWeb.Infrastructure/DevBetterWeb.Infrastructure.csproj @@ -20,7 +20,6 @@ - diff --git a/src/DevBetterWeb.Infrastructure/InfrastructureServiceCollectionExtensions.cs b/src/DevBetterWeb.Infrastructure/InfrastructureServiceCollectionExtensions.cs index 9a66d34b9..fefa61fc8 100644 --- a/src/DevBetterWeb.Infrastructure/InfrastructureServiceCollectionExtensions.cs +++ b/src/DevBetterWeb.Infrastructure/InfrastructureServiceCollectionExtensions.cs @@ -26,7 +26,7 @@ public static IServiceCollection AddInfrastructureServices(this IServiceCollecti } else { - services.AddTransient(); + services.AddTransient(); } // Common Dependencies diff --git a/src/DevBetterWeb.Infrastructure/Services/AuthMessageSenderOptions.cs b/src/DevBetterWeb.Infrastructure/Services/AuthMessageSenderOptions.cs index 965796be3..46b8f24d1 100644 --- a/src/DevBetterWeb.Infrastructure/Services/AuthMessageSenderOptions.cs +++ b/src/DevBetterWeb.Infrastructure/Services/AuthMessageSenderOptions.cs @@ -2,6 +2,8 @@ public class AuthMessageSenderOptions { - public string? SendGridUser { get; set; } - public string? SendGridKey { get; set; } + public string? SmtpServer { get; set; } + public int SmtpPort { get; set; } = 587; + public string? SmtpUsername { get; set; } + public string? SmtpPassword { get; set; } } diff --git a/src/DevBetterWeb.Infrastructure/Services/SendGridEmailService.cs b/src/DevBetterWeb.Infrastructure/Services/SendGridEmailService.cs deleted file mode 100644 index 67684c41f..000000000 --- a/src/DevBetterWeb.Infrastructure/Services/SendGridEmailService.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Threading.Tasks; -using Ardalis.GuardClauses; -using DevBetterWeb.Core.Interfaces; -using Microsoft.Extensions.Options; -using SendGrid; -using SendGrid.Helpers.Mail; - -namespace DevBetterWeb.Infrastructure.Services; - -public class SendGridEmailService : IEmailService -{ - public SendGridEmailService(IOptions optionsAccessor) - { - Guard.Against.Null(optionsAccessor.Value, nameof(optionsAccessor.Value)); - Options = optionsAccessor.Value; - } - - public AuthMessageSenderOptions Options { get; } //set only via Secret Manager - - public async Task SendEmailAsync(string email, string subject, string message) - { - if (Options.SendGridKey == null) throw new Exception("SendGridKey not set."); - var response = await Execute(Options.SendGridKey, subject, message, email); - - if (response.StatusCode != System.Net.HttpStatusCode.Accepted) - { - // log or throw - throw new Exception("Could not send email: " + await response.Body.ReadAsStringAsync()); - } - } - - private async Task Execute(string apiKey, string subject, string message, string email) - { - var client = new SendGridClient(apiKey); - var msg = new SendGridMessage() - { - From = new EmailAddress("donotreply@devbetter.com", "devBetter Admin"), - Subject = subject, - PlainTextContent = message, - HtmlContent = message - }; - msg.AddTo(new EmailAddress(email)); - - // Disable click tracking. - // See https://sendgrid.com/docs/User_Guide/Settings/tracking.html - msg.SetClickTracking(false, false); - - return await client.SendEmailAsync(msg); - } -} diff --git a/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs b/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs new file mode 100644 index 000000000..65fd4b8c4 --- /dev/null +++ b/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs @@ -0,0 +1,44 @@ +using System; +using System.Net; +using System.Net.Mail; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using DevBetterWeb.Core.Interfaces; +using Microsoft.Extensions.Options; + +namespace DevBetterWeb.Infrastructure.Services; + +public class Smtp2GoEmailService : IEmailService +{ + public Smtp2GoEmailService(IOptions optionsAccessor) + { + Guard.Against.Null(optionsAccessor.Value, nameof(optionsAccessor.Value)); + Options = optionsAccessor.Value; + } + + public AuthMessageSenderOptions Options { get; } //set only via Secret Manager + + public async Task SendEmailAsync(string email, string subject, string message) + { + if (string.IsNullOrEmpty(Options.SmtpServer)) throw new Exception("SMTP Server not set."); + if (string.IsNullOrEmpty(Options.SmtpUsername)) throw new Exception("SMTP Username not set."); + if (string.IsNullOrEmpty(Options.SmtpPassword)) throw new Exception("SMTP Password not set."); + + using var client = new SmtpClient(Options.SmtpServer, Options.SmtpPort) + { + EnableSsl = true, + Credentials = new NetworkCredential(Options.SmtpUsername, Options.SmtpPassword) + }; + + var mailMessage = new MailMessage( + from: "donotreply@devbetter.com", + to: email, + subject: subject, + body: message) + { + IsBodyHtml = true + }; + + await client.SendMailAsync(mailMessage); + } +} \ No newline at end of file diff --git a/src/DevBetterWeb.Web/appsettings.Template.json b/src/DevBetterWeb.Web/appsettings.Template.json index c6334dda5..bbb89fcce 100644 --- a/src/DevBetterWeb.Web/appsettings.Template.json +++ b/src/DevBetterWeb.Web/appsettings.Template.json @@ -14,6 +14,12 @@ "ApiSettings": { "ApiKey": "[api key string goes here]" }, + "AuthMessageSenderOptions": { + "SmtpServer": "mail.smtp2go.com", + "SmtpPort": 587, + "SmtpUsername": "[SMTP2Go username goes here]", + "SmtpPassword": "[SMTP2Go password goes here]" + }, "Logging": { "ApplicationInsights": { "LogLevel": { diff --git a/src/DevBetterWeb.Web/appsettings.json b/src/DevBetterWeb.Web/appsettings.json index 060bc51b0..63707d9ea 100644 --- a/src/DevBetterWeb.Web/appsettings.json +++ b/src/DevBetterWeb.Web/appsettings.json @@ -14,6 +14,12 @@ "ApiSettings": { "ApiKey": "[api key string goes here]" }, + "AuthMessageSenderOptions": { + "SmtpServer": "mail.smtp2go.com", + "SmtpPort": 587, + "SmtpUsername": "[SMTP2Go username goes here]", + "SmtpPassword": "[SMTP2Go password goes here]" + }, "Logging": { "ApplicationInsights": { "LogLevel": { From a8a4c3d31fa18a478509877009750c5d1a19c42b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:46:19 +0000 Subject: [PATCH 3/6] Add SMTP2Go email service tests and update configuration templates Co-authored-by: ardalis <782127+ardalis@users.noreply.github.com> --- README.md | 2 +- .../appsettings.Testing.Template.json | 6 ++ .../Smtp2GoEmailServiceTests.cs | 59 +++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs diff --git a/README.md b/README.md index 5c878262f..fb7568b90 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Head over to [devBetter.com](https://devbetter.com) to see the live site. Scroll - Register - Login - View Public Questions/Topics -- Validate Accounts via Email (SendGrid) +- Validate Accounts via Email (SMTP2Go) ### Members Only diff --git a/src/DevBetterWeb.Web/appsettings.Testing.Template.json b/src/DevBetterWeb.Web/appsettings.Testing.Template.json index c6334dda5..bbb89fcce 100644 --- a/src/DevBetterWeb.Web/appsettings.Testing.Template.json +++ b/src/DevBetterWeb.Web/appsettings.Testing.Template.json @@ -14,6 +14,12 @@ "ApiSettings": { "ApiKey": "[api key string goes here]" }, + "AuthMessageSenderOptions": { + "SmtpServer": "mail.smtp2go.com", + "SmtpPort": 587, + "SmtpUsername": "[SMTP2Go username goes here]", + "SmtpPassword": "[SMTP2Go password goes here]" + }, "Logging": { "ApplicationInsights": { "LogLevel": { diff --git a/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs b/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs new file mode 100644 index 000000000..2286cc1a6 --- /dev/null +++ b/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs @@ -0,0 +1,59 @@ +using System; +using System.Threading.Tasks; +using DevBetterWeb.Infrastructure.Services; +using Microsoft.Extensions.Options; +using Xunit; + +namespace DevBetterWeb.Tests.Services.EmailServiceTests; + +public class Smtp2GoEmailServiceTests +{ + [Fact] + public void Constructor_WithNullOptions_ThrowsArgumentNullException() + { + Assert.Throws(() => new Smtp2GoEmailService(null!)); + } + + [Fact] + public async Task SendEmailAsync_WithNullSmtpServer_ThrowsException() + { + var options = new AuthMessageSenderOptions(); + var service = new Smtp2GoEmailService(Options.Create(options)); + + var exception = await Assert.ThrowsAsync(() => + service.SendEmailAsync("test@example.com", "Test Subject", "Test Message")); + + Assert.Equal("SMTP Server not set.", exception.Message); + } + + [Fact] + public async Task SendEmailAsync_WithNullSmtpUsername_ThrowsException() + { + var options = new AuthMessageSenderOptions + { + SmtpServer = "mail.smtp2go.com" + }; + var service = new Smtp2GoEmailService(Options.Create(options)); + + var exception = await Assert.ThrowsAsync(() => + service.SendEmailAsync("test@example.com", "Test Subject", "Test Message")); + + Assert.Equal("SMTP Username not set.", exception.Message); + } + + [Fact] + public async Task SendEmailAsync_WithNullSmtpPassword_ThrowsException() + { + var options = new AuthMessageSenderOptions + { + SmtpServer = "mail.smtp2go.com", + SmtpUsername = "testuser" + }; + var service = new Smtp2GoEmailService(Options.Create(options)); + + var exception = await Assert.ThrowsAsync(() => + service.SendEmailAsync("test@example.com", "Test Subject", "Test Message")); + + Assert.Equal("SMTP Password not set.", exception.Message); + } +} \ No newline at end of file From f0c26f1db0860bd4b16dd1c915bf2483410c8953 Mon Sep 17 00:00:00 2001 From: Steve Smith Date: Wed, 30 Jul 2025 14:01:27 -0400 Subject: [PATCH 4/6] Update to use the api --- .../Services/AuthMessageSenderOptions.cs | 3 +- .../Services/Smtp2GoEmailService.cs | 43 +++++++++++-------- src/DevBetterWeb.Web/appsettings.json | 3 +- .../Smtp2GoEmailServiceTests.cs | 22 ++-------- 4 files changed, 29 insertions(+), 42 deletions(-) diff --git a/src/DevBetterWeb.Infrastructure/Services/AuthMessageSenderOptions.cs b/src/DevBetterWeb.Infrastructure/Services/AuthMessageSenderOptions.cs index 46b8f24d1..f01b607ac 100644 --- a/src/DevBetterWeb.Infrastructure/Services/AuthMessageSenderOptions.cs +++ b/src/DevBetterWeb.Infrastructure/Services/AuthMessageSenderOptions.cs @@ -4,6 +4,5 @@ public class AuthMessageSenderOptions { public string? SmtpServer { get; set; } public int SmtpPort { get; set; } = 587; - public string? SmtpUsername { get; set; } - public string? SmtpPassword { get; set; } + public string? ApiKey { get; set; } } diff --git a/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs b/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs index 65fd4b8c4..b5d053ad5 100644 --- a/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs +++ b/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs @@ -1,6 +1,7 @@ using System; -using System.Net; -using System.Net.Mail; +using System.Net.Http; +using System.Text; +using System.Text.Json; using System.Threading.Tasks; using Ardalis.GuardClauses; using DevBetterWeb.Core.Interfaces; @@ -10,35 +11,39 @@ namespace DevBetterWeb.Infrastructure.Services; public class Smtp2GoEmailService : IEmailService { + private readonly HttpClient _httpClient; public Smtp2GoEmailService(IOptions optionsAccessor) { Guard.Against.Null(optionsAccessor.Value, nameof(optionsAccessor.Value)); Options = optionsAccessor.Value; + _httpClient = new HttpClient(); } - public AuthMessageSenderOptions Options { get; } //set only via Secret Manager + public AuthMessageSenderOptions Options { get; } public async Task SendEmailAsync(string email, string subject, string message) { - if (string.IsNullOrEmpty(Options.SmtpServer)) throw new Exception("SMTP Server not set."); - if (string.IsNullOrEmpty(Options.SmtpUsername)) throw new Exception("SMTP Username not set."); - if (string.IsNullOrEmpty(Options.SmtpPassword)) throw new Exception("SMTP Password not set."); + if (string.IsNullOrEmpty(Options.ApiKey)) throw new Exception("SMTP API Key not set."); - using var client = new SmtpClient(Options.SmtpServer, Options.SmtpPort) - { - EnableSsl = true, - Credentials = new NetworkCredential(Options.SmtpUsername, Options.SmtpPassword) - }; + var request = new HttpRequestMessage(HttpMethod.Post, "https://api.smtp2go.com/v3/email/send"); + request.Headers.Add("Authorization", $"Bearer {Options.ApiKey}"); - var mailMessage = new MailMessage( - from: "donotreply@devbetter.com", - to: email, - subject: subject, - body: message) + var payload = new { - IsBodyHtml = true + sender = "donotreply@devbetter.com", + to = new[] { email }, + subject = subject, + text_body = message, + html_body = message }; + string json = JsonSerializer.Serialize(payload); + request.Content = new StringContent(json, Encoding.UTF8, "application/json"); - await client.SendMailAsync(mailMessage); + var response = await _httpClient.SendAsync(request); + if (!response.IsSuccessStatusCode) + { + var error = await response.Content.ReadAsStringAsync(); + throw new Exception($"SMTP2GO API error: {response.StatusCode} - {error}"); + } } -} \ No newline at end of file +} diff --git a/src/DevBetterWeb.Web/appsettings.json b/src/DevBetterWeb.Web/appsettings.json index 63707d9ea..5d36da4db 100644 --- a/src/DevBetterWeb.Web/appsettings.json +++ b/src/DevBetterWeb.Web/appsettings.json @@ -17,8 +17,7 @@ "AuthMessageSenderOptions": { "SmtpServer": "mail.smtp2go.com", "SmtpPort": 587, - "SmtpUsername": "[SMTP2Go username goes here]", - "SmtpPassword": "[SMTP2Go password goes here]" + "ApiKey": "[smtp2go api key goes here]" }, "Logging": { "ApplicationInsights": { diff --git a/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs b/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs index 2286cc1a6..867abb814 100644 --- a/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs +++ b/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs @@ -27,7 +27,7 @@ public async Task SendEmailAsync_WithNullSmtpServer_ThrowsException() } [Fact] - public async Task SendEmailAsync_WithNullSmtpUsername_ThrowsException() + public async Task SendEmailAsync_WithNullApiKey_ThrowsException() { var options = new AuthMessageSenderOptions { @@ -38,22 +38,6 @@ public async Task SendEmailAsync_WithNullSmtpUsername_ThrowsException() var exception = await Assert.ThrowsAsync(() => service.SendEmailAsync("test@example.com", "Test Subject", "Test Message")); - Assert.Equal("SMTP Username not set.", exception.Message); + Assert.Equal("SMTP API Key not set.", exception.Message); } - - [Fact] - public async Task SendEmailAsync_WithNullSmtpPassword_ThrowsException() - { - var options = new AuthMessageSenderOptions - { - SmtpServer = "mail.smtp2go.com", - SmtpUsername = "testuser" - }; - var service = new Smtp2GoEmailService(Options.Create(options)); - - var exception = await Assert.ThrowsAsync(() => - service.SendEmailAsync("test@example.com", "Test Subject", "Test Message")); - - Assert.Equal("SMTP Password not set.", exception.Message); - } -} \ No newline at end of file +} From 903bd333bbf72f9cc87acd634701d3079ea6263b Mon Sep 17 00:00:00 2001 From: Steve Smith Date: Wed, 30 Jul 2025 14:18:32 -0400 Subject: [PATCH 5/6] optimize for api instead of smtp --- .../Services/Smtp2GoEmailService.cs | 1 + src/DevBetterWeb.Web/appsettings.json | 8 ++++---- .../EmailServiceTests/Smtp2GoEmailServiceTests.cs | 12 ------------ 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs b/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs index b5d053ad5..27c1884cc 100644 --- a/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs +++ b/src/DevBetterWeb.Infrastructure/Services/Smtp2GoEmailService.cs @@ -14,6 +14,7 @@ public class Smtp2GoEmailService : IEmailService private readonly HttpClient _httpClient; public Smtp2GoEmailService(IOptions optionsAccessor) { + Guard.Against.Null(optionsAccessor, nameof(optionsAccessor)); Guard.Against.Null(optionsAccessor.Value, nameof(optionsAccessor.Value)); Options = optionsAccessor.Value; _httpClient = new HttpClient(); diff --git a/src/DevBetterWeb.Web/appsettings.json b/src/DevBetterWeb.Web/appsettings.json index 5d36da4db..b2acaabe1 100644 --- a/src/DevBetterWeb.Web/appsettings.json +++ b/src/DevBetterWeb.Web/appsettings.json @@ -14,10 +14,10 @@ "ApiSettings": { "ApiKey": "[api key string goes here]" }, - "AuthMessageSenderOptions": { - "SmtpServer": "mail.smtp2go.com", - "SmtpPort": 587, - "ApiKey": "[smtp2go api key goes here]" + "ApiMailSenderOptions": { + "ApiBaseUrl": "https://api.smtp2go.com/v3/", + "ApiKey": "[smtp2go api key goes here]", + "Sender": "donotreply@devbetter.com" }, "Logging": { "ApplicationInsights": { diff --git a/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs b/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs index 867abb814..88b064b13 100644 --- a/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs +++ b/tests/DevBetterWeb.Tests/Services/EmailServiceTests/Smtp2GoEmailServiceTests.cs @@ -14,18 +14,6 @@ public void Constructor_WithNullOptions_ThrowsArgumentNullException() Assert.Throws(() => new Smtp2GoEmailService(null!)); } - [Fact] - public async Task SendEmailAsync_WithNullSmtpServer_ThrowsException() - { - var options = new AuthMessageSenderOptions(); - var service = new Smtp2GoEmailService(Options.Create(options)); - - var exception = await Assert.ThrowsAsync(() => - service.SendEmailAsync("test@example.com", "Test Subject", "Test Message")); - - Assert.Equal("SMTP Server not set.", exception.Message); - } - [Fact] public async Task SendEmailAsync_WithNullApiKey_ThrowsException() { From e4997a78b3ffe39fff48d81b846e2a8afea2ba4a Mon Sep 17 00:00:00 2001 From: Steve Smith Date: Wed, 30 Jul 2025 14:27:52 -0400 Subject: [PATCH 6/6] Adding config class --- ApiMailSenderOptions.cs | 8 ++++++++ .../Services/ApiMailSenderOptions.cs | 8 ++++++++ src/DevBetterWeb.Web/Program.cs | 2 +- src/DevBetterWeb.Web/appsettings.Template.json | 9 ++++----- 4 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 ApiMailSenderOptions.cs create mode 100644 src/DevBetterWeb.Infrastructure/Services/ApiMailSenderOptions.cs diff --git a/ApiMailSenderOptions.cs b/ApiMailSenderOptions.cs new file mode 100644 index 000000000..c2a427119 --- /dev/null +++ b/ApiMailSenderOptions.cs @@ -0,0 +1,8 @@ +namespace DevBetterWeb.Infrastructure.Services; + +public class ApiMailSenderOptions +{ + public string? ApiBaseUrl { get; set; } + public string? ApiKey { get; set; } + public string? Sender { get; set; } +} \ No newline at end of file diff --git a/src/DevBetterWeb.Infrastructure/Services/ApiMailSenderOptions.cs b/src/DevBetterWeb.Infrastructure/Services/ApiMailSenderOptions.cs new file mode 100644 index 000000000..187124ae3 --- /dev/null +++ b/src/DevBetterWeb.Infrastructure/Services/ApiMailSenderOptions.cs @@ -0,0 +1,8 @@ +namespace DevBetterWeb.Infrastructure.Services; + +public class ApiMailSenderOptions +{ + public string? ApiBaseUrl { get; set; } + public string? ApiKey { get; set; } + public string? Sender { get; set; } +} diff --git a/src/DevBetterWeb.Web/Program.cs b/src/DevBetterWeb.Web/Program.cs index f91ba67a0..b9d78115d 100644 --- a/src/DevBetterWeb.Web/Program.cs +++ b/src/DevBetterWeb.Web/Program.cs @@ -60,7 +60,7 @@ builder.Services.AddLogging(); -builder.Services.Configure(builder.Configuration.GetSection("AuthMessageSenderOptions")); +builder.Services.Configure(builder.Configuration.GetSection("ApiMailSenderOptions")); builder.Services.Configure(builder.Configuration.GetSection("DiscordWebhookUrls")); builder.Services.Configure(builder.Configuration.GetSection("StripeOptions")); builder.Services.Configure(builder.Configuration.GetSection("SubscriptionPlanOptions")); diff --git a/src/DevBetterWeb.Web/appsettings.Template.json b/src/DevBetterWeb.Web/appsettings.Template.json index bbb89fcce..d194cc39b 100644 --- a/src/DevBetterWeb.Web/appsettings.Template.json +++ b/src/DevBetterWeb.Web/appsettings.Template.json @@ -14,11 +14,10 @@ "ApiSettings": { "ApiKey": "[api key string goes here]" }, - "AuthMessageSenderOptions": { - "SmtpServer": "mail.smtp2go.com", - "SmtpPort": 587, - "SmtpUsername": "[SMTP2Go username goes here]", - "SmtpPassword": "[SMTP2Go password goes here]" + "ApiMailSenderOptions": { + "ApiBaseUrl": "https://api.smtp2go.com/v3/", + "ApiKey": "[smtp2go api key goes here]", + "Sender": "donotreply@devbetter.com" }, "Logging": { "ApplicationInsights": {