using FabApprovalWorkerService.Clients; using Microsoft.IdentityModel.Tokens; using System.Net.Mail; namespace FabApprovalWorkerService.Services; public interface ISmtpService { Task SendEmail(IEnumerable recipients, IEnumerable ccRecipients, string subject, string body); } public class SmtpService : ISmtpService { private ILogger _logger; private ISmtpClientWrapper _smtpClient; private string _environmentName; public SmtpService(ILogger logger, ISmtpClientWrapper smtpClient) { _logger = logger ?? throw new ArgumentNullException("ILogger not injected"); _smtpClient = smtpClient ?? throw new ArgumentNullException("SmtpClient not injected"); _environmentName = Environment.GetEnvironmentVariable("FabApprovalEnvironmentName") ?? throw new ArgumentNullException("FabApprovalEnvironmentName environment variable not found"); } public async Task SendEmail(IEnumerable recipients, IEnumerable ccRecipients, string subject, string body) { if (recipients.IsNullOrEmpty()) throw new ArgumentNullException("recipients cannot be null or empty!"); if (ccRecipients is null) throw new ArgumentNullException("ccRecipients cannot be null!"); if (subject.IsNullOrEmpty()) throw new ArgumentNullException("subject cannot be null or empty!"); if (body.IsNullOrEmpty()) throw new ArgumentNullException("body cannot be null or empty!"); return await Task.Run(() => { int maxRetries = 3; int backoffSeconds = 30; bool messageWasSent = false; try { if (!_environmentName.ToLower().Equals("development")) { int remainingRetries = maxRetries; while (!messageWasSent && remainingRetries > 0) { try { Task.Delay((maxRetries - remainingRetries--) * backoffSeconds * 1000); _logger.LogInformation($"Attempting to send notification. Remaining retries: {remainingRetries}"); MailMessage msg = new MailMessage(); msg.IsBodyHtml = true; msg.From = new MailAddress("MesaFabApproval@infineon.com", "Mesa Fab Approval"); msg.Sender = new MailAddress("MesaFabApproval@infineon.com", "Mesa Fab Approval"); foreach (MailAddress recipient in recipients) msg.To.Add(recipient); msg.Bcc.Add("chase.tucker@infineon.com"); foreach (MailAddress ccRecipient in ccRecipients) msg.CC.Add(ccRecipient); msg.Subject = subject; msg.Body = body; _smtpClient.Send(msg); messageWasSent = true; } catch (Exception ex) { _logger.LogError($"Message not sent successfully. Exception: {ex.Message}"); } } } else { messageWasSent = true; } } catch (Exception ex) { _logger.LogError($"An exception occurred when attempting to send notification. Exception: {ex.Message}"); } return messageWasSent; }); } }