feat: consume transactional email notifications

Add contract validation, SMTP delivery results, terminal failure context, neutral development seeding, and local Docker setup.

Ref: IT-1033
This commit is contained in:
2026-08-04 12:32:28 +03:00
parent b8435ac07b
commit 2757869176
37 changed files with 1465 additions and 122 deletions
@@ -0,0 +1,47 @@
namespace HrynCo.NotificationService.Worker.Services.EmailProcessing;
using System.Net;
using System.Net.Mail;
using System.Text;
using HrynCo.NotificationService.DAL.Abstract.Providers;
internal sealed class SmtpEmailSender : ISmtpEmailSender
{
public async Task SendAsync(
SmtpChannelSettings settings,
RenderedEmail email,
string recipientEmail,
string recipientName,
CancellationToken cancellationToken)
{
using var client = new SmtpClient(settings.Host, settings.Port)
{
EnableSsl = settings.UseSsl,
Credentials = string.IsNullOrWhiteSpace(settings.Username)
? null
: new NetworkCredential(settings.Username, settings.Password)
};
using var mail = new MailMessage
{
From = new MailAddress(settings.FromEmail, settings.FromName),
Subject = email.Subject,
Body = email.TextBody,
IsBodyHtml = false,
BodyEncoding = Encoding.UTF8,
SubjectEncoding = Encoding.UTF8
};
if (!string.IsNullOrWhiteSpace(email.HtmlBody))
{
AlternateView html = AlternateView.CreateAlternateViewFromString(
email.HtmlBody,
Encoding.UTF8,
"text/html");
mail.AlternateViews.Add(html);
}
mail.To.Add(new MailAddress(recipientEmail, recipientName));
await client.SendMailAsync(mail, cancellationToken);
}
}