using System.Diagnostics.CodeAnalysis; using System.Text.Json; using MailKit.Net.Smtp; using MailKit.Security; using MimeKit; namespace InnovEnergy.Lib.Mailer; public static class Mailer { [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] public static async Task Send(string recipientName, string recipientEmailAddress, string subject, string body) { var config = await ReadMailerConfig(); Console.WriteLine("=============== SMTP CONFIG LOADED =============="); Console.WriteLine($"Config full path: {Path.GetFullPath(MailerConfig.DefaultFile)}"); Console.WriteLine($"SMTP host: {config!.SmtpServerUrl}"); Console.WriteLine($"SMTP port: {config.SmtpPort}"); Console.WriteLine($"SMTP username: {config.SmtpUsername}"); Console.WriteLine($"Sender: {config.SenderName} <{config.SenderAddress}>"); Console.WriteLine("=================================================="); var from = new MailboxAddress(config!.SenderName, config.SenderAddress); var to = new MailboxAddress(recipientName, recipientEmailAddress); var msg = new MimeMessage { From = { from }, To = { to }, Subject = subject, Body = new TextPart("plain") { Text = body } }; using var smtp = new SmtpClient(); try { await smtp.ConnectAsync(config.SmtpServerUrl, config.SmtpPort, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync(config.SmtpUsername, config.SmtpPassword); await smtp.SendAsync(msg); await smtp.DisconnectAsync(true); } catch (Exception ex) { Console.WriteLine(ex.ToString()); throw; // keep while testing } } [RequiresUnreferencedCode("Calls System.Text.Json.JsonSerializer.DeserializeAsync(Stream, JsonSerializerOptions, CancellationToken)")] private static async Task ReadMailerConfig() { await using var fileStream = File.OpenRead(MailerConfig.DefaultFile); return await JsonSerializer.DeserializeAsync(fileStream); } }