diff --git a/CHANGELOG.md b/CHANGELOG.md index c431a1099..ccb987447 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [1.0.8-rc30] - unstable + +### Added + +### Changed + +### Fixed + ## [1.0.8-rc29] - unstable ### Added @@ -19,6 +27,14 @@ * [PostIt] Mise a jour d'Avalonia vers 12.1.4. +### Fixed + +* [Yavsc.Api, Yavsc.Server] Une demande de rendez-vous ne provoque plus + d'erreur 500 (NullReferenceException dans MailSender) : l'API lie + desormais la section Smtp, le modele appsettings-api fournit Site.Owner + et Smtp, et un envoi sans configuration mail complete est journalise + puis ignore. + ## [1.0.8-rc28] - unstable diff --git a/contrib/template.appsettings-api.json b/contrib/template.appsettings-api.json index b364eeef1..afe693a4f 100644 --- a/contrib/template.appsettings-api.json +++ b/contrib/template.appsettings-api.json @@ -6,7 +6,17 @@ "https://preprod-blogs.$DOMAIN" ], "Bills": "bills", - "TempDir": "temp" + "TempDir": "temp", + "Owner": { + "Name": "Paul Schneider", + "EMail": "paul@pschneider.fr" + } + }, + "Smtp": { + "Host": "mercure.pschneider.fr", + "Port": 465, + "UserName": "paul", + "Password": "$SMTP_PASSWORD" }, "Logging": { "LogLevel": { diff --git a/src/Yavsc.Api/Program.cs b/src/Yavsc.Api/Program.cs index 9ea2f7354..03afcf58f 100644 --- a/src/Yavsc.Api/Program.cs +++ b/src/Yavsc.Api/Program.cs @@ -12,6 +12,7 @@ using Yavsc.Models; using Yavsc; using Yavsc.Server.Helpers; using Yavsc.Services; +using Yavsc.Settings; using Yavsc.Server.Hubs; using Yavsc.Api.Services; @@ -71,6 +72,7 @@ internal class Program // Binds the "Site" section (Bills, TempDir, Avatars, …) used by // the document-generation flow and BillingController. services.Configure(builder.Configuration.GetSection("Site")); + services.Configure(builder.Configuration.GetSection("Smtp")); services.AddPodcasts(builder.Configuration); services.AddInvoicing(builder.Configuration); diff --git a/src/Yavsc.Server/Services/MailSender.cs b/src/Yavsc.Server/Services/MailSender.cs index 9a6c60ed9..1a678a549 100644 --- a/src/Yavsc.Server/Services/MailSender.cs +++ b/src/Yavsc.Server/Services/MailSender.cs @@ -104,6 +104,12 @@ namespace Yavsc.Services try { logger.LogInformation($"SendEmail for {email} : {subject}"); + if (string.IsNullOrWhiteSpace(siteSettings?.Owner?.EMail) + || string.IsNullOrWhiteSpace(smtpSettings?.Host)) + { + logger.LogError("Email not sent: mail configuration is incomplete (Site:Owner:EMail and Smtp:Host are required). To={To}, Subject={Subject}", email, subject); + return string.Empty; + } MimeMessage msg = new(); msg.From.Add(BuildMailboxAddress(siteSettings.Owner.Name, siteSettings.Owner.EMail)); msg.To.Add(BuildMailboxAddress(name, email)); @@ -139,7 +145,7 @@ namespace Yavsc.Services } catch (FormatException ex) { - logger.LogError(ex, "Refusing to send email because the recipient or sender address is malformed. To={To}, From={From}", email, siteSettings.Owner.EMail); + logger.LogError(ex, "Refusing to send email because the recipient or sender address is malformed. To={To}, From={From}", email, siteSettings?.Owner?.EMail); logger.LogError(ex.Message); if (ex.InnerException!=null) logger.LogError(ex.InnerException.Message); diff --git a/src/test/Yavsc.Org.Tests/NonRegression/EMailling.cs b/src/test/Yavsc.Org.Tests/NonRegression/EMailling.cs index eed2e9e18..d71e7682d 100644 --- a/src/test/Yavsc.Org.Tests/NonRegression/EMailling.cs +++ b/src/test/Yavsc.Org.Tests/NonRegression/EMailling.cs @@ -121,6 +121,22 @@ namespace Yavsc.Org.Tests Assert.Equal(string.Empty, result); } + [Fact] + public async Task SendEmailAsync_skips_when_owner_is_not_configured() + { + var factory = new RejectingSmtpClientFactory(); + var sender = new MailSender( + Options.Create(new SiteSettings { Authority = "example.com" }), + Options.Create(new SmtpSettings()), + NullLoggerFactory.Instance, + new TestStringLocalizer(), + factory); + + var result = await sender.SendEmailAsync("Alice", "alice@example.com", "Rdv", "hello"); + + Assert.Equal(string.Empty, result); + } + private sealed class RejectingSmtpClientFactory : ISmtpClientFactory { public Yavsc.Interfaces.ISmtpClient CreateClient() => new RejectingSmtpClient();