using Application.Abstractions.Data; using Application.Abstractions.Messaging.Email; using Domain.Entities.Common; using Domain.Entities.Common.ValueObject; using Microsoft.Extensions.Logging; namespace Infrastructure.Messaging.Email; /// /// EmailLog 큐에 INSERT만 수행. MailWorker가 별도로 폴링하여 SMTP 송신. /// API 단에서만 사용. (Admin은 DirectMailService로 즉시 발송) /// public class QueuedMailService : IMailService { private readonly ILogger _logger; private readonly IAppDbContext _db; public QueuedMailService(ILogger logger, IAppDbContext db) { _logger = logger; _db = db; } public async Task SendAsync(SendData data, CancellationToken ct = default) { var now = DateTime.UtcNow; var entry = new EmailLog { ToAddress = data.ToAddress, Subject = data.Subject, MessageHtml = data.MessageHtml, MessageText = data.MessageText, Status = MailStatus.Pending, RetryCount = 0, MaxRetryCount = 3, NextRetryAt = now, CreatedAt = now }; await _db.EmailLog.AddAsync(entry, ct); await _db.SaveChangesAsync(ct); _logger.LogInformation("Email queued (ID={ID}) to {ToAddress} subject={Subject}", entry.ID, data.ToAddress, data.Subject); } }