When debugging only app.Services.GetRequiredService<IPCRBService>(); Injected AppSettings instead of using GetEnvironmentVariable at Services level Get ready to use VSCode IDE
79 lines
3.5 KiB
C#
79 lines
3.5 KiB
C#
using System.Net.Mail;
|
|
|
|
using MesaFabApproval.API.Clients;
|
|
using MesaFabApproval.Models;
|
|
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
namespace MesaFabApproval.API.Services;
|
|
|
|
public interface ISmtpService {
|
|
Task<bool> SendEmail(IEnumerable<MailAddress> recipients, IEnumerable<MailAddress> ccRecipients, string subject, string body);
|
|
}
|
|
|
|
public class SmtpService : ISmtpService {
|
|
private readonly ILogger<SmtpService> _logger;
|
|
private readonly ISmtpClientWrapper _smtpClient;
|
|
private readonly bool _shouldSendEmail;
|
|
|
|
public SmtpService(ILogger<SmtpService> logger, ISmtpClientWrapper smtpClient, AppSettings appSettings) {
|
|
_logger = logger ??
|
|
throw new ArgumentNullException("ILogger not injected");
|
|
_smtpClient = smtpClient ??
|
|
throw new ArgumentNullException("SmtpClient not injected");
|
|
_shouldSendEmail = appSettings.ShouldSendEmail;
|
|
}
|
|
|
|
public async Task<bool> SendEmail(IEnumerable<MailAddress> recipients,
|
|
IEnumerable<MailAddress> 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 (_shouldSendEmail) {
|
|
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 {
|
|
_logger.LogInformation("Not sending email per local configuration");
|
|
messageWasSent = true;
|
|
}
|
|
} catch (Exception ex) {
|
|
_logger.LogError($"An exception occurred when attempting to send notification. Exception: {ex.Message}");
|
|
}
|
|
|
|
return messageWasSent;
|
|
});
|
|
}
|
|
} |