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": {