using Amazon.SimpleEmailV2; using Amazon.SimpleEmailV2.Model; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using ProposalSystem.Application.Interfaces; namespace ProposalSystem.Infrastructure.Services; public class SesEmailService : IEmailService { private readonly IAmazonSimpleEmailServiceV2 _ses; private readonly string _fromAddress; private readonly ILogger _logger; public SesEmailService( IAmazonSimpleEmailServiceV2 ses, IConfiguration config, ILogger logger) { _ses = ses; _fromAddress = config["SES_FROM_ADDRESS"] ?? throw new InvalidOperationException( "SES_FROM_ADDRESS environment variable is required for email delivery."); _logger = logger; } public async Task SendProposalDeliveryAsync( string toEmail, string proposalNumber, string customerName, string pdfUrl, CancellationToken ct = default) { var subject = $"Your proposal {proposalNumber} from Sea Haven Industries"; var htmlBody = $@"

Dear {System.Net.WebUtility.HtmlEncode(customerName)},

Your proposal {System.Net.WebUtility.HtmlEncode(proposalNumber)} is ready for review.

View Proposal PDF

This link will expire in 7 days. If you have any questions, please contact us directly.

Thank you,
Sea Haven Industries

"; var textBody = $@"Dear {customerName}, Your proposal {proposalNumber} is ready for review. View the proposal PDF at: {pdfUrl} This link will expire in 7 days. If you have any questions, please contact us directly. Thank you, Sea Haven Industries"; var request = new SendEmailRequest { FromEmailAddress = _fromAddress, Destination = new Destination { ToAddresses = new List { toEmail }, }, Content = new EmailContent { Simple = new Message { Subject = new Content { Data = subject }, Body = new Body { Html = new Content { Data = htmlBody }, Text = new Content { Data = textBody }, }, }, }, }; await _ses.SendEmailAsync(request, ct); _logger.LogInformation( "Proposal delivery email sent for {ProposalNumber}", proposalNumber); } }