QueuedMailService.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging.Email;
  3. using Domain.Entities.Common;
  4. using Domain.Entities.Common.ValueObject;
  5. using Microsoft.Extensions.Logging;
  6. namespace Infrastructure.Messaging.Email;
  7. /// <summary>
  8. /// EmailLog 큐에 INSERT만 수행. MailWorker가 별도로 폴링하여 SMTP 송신.
  9. /// API 단에서만 사용. (Admin은 DirectMailService로 즉시 발송)
  10. /// </summary>
  11. public class QueuedMailService : IMailService
  12. {
  13. private readonly ILogger<QueuedMailService> _logger;
  14. private readonly IAppDbContext _db;
  15. public QueuedMailService(ILogger<QueuedMailService> logger, IAppDbContext db)
  16. {
  17. _logger = logger;
  18. _db = db;
  19. }
  20. public async Task SendAsync(SendData data, CancellationToken ct = default)
  21. {
  22. var now = DateTime.UtcNow;
  23. var entry = new EmailLog
  24. {
  25. ToAddress = data.ToAddress,
  26. Subject = data.Subject,
  27. MessageHtml = data.MessageHtml,
  28. MessageText = data.MessageText,
  29. Status = MailStatus.Pending,
  30. RetryCount = 0,
  31. MaxRetryCount = 3,
  32. NextRetryAt = now,
  33. CreatedAt = now
  34. };
  35. await _db.EmailLog.AddAsync(entry, ct);
  36. await _db.SaveChangesAsync(ct);
  37. _logger.LogInformation("Email queued (ID={ID}) to {ToAddress} subject={Subject}", entry.ID, data.ToAddress, data.Subject);
  38. }
  39. }