| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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;
- /// <summary>
- /// EmailLog 큐에 INSERT만 수행. MailWorker가 별도로 폴링하여 SMTP 송신.
- /// API 단에서만 사용. (Admin은 DirectMailService로 즉시 발송)
- /// </summary>
- public class QueuedMailService : IMailService
- {
- private readonly ILogger<QueuedMailService> _logger;
- private readonly IAppDbContext _db;
- public QueuedMailService(ILogger<QueuedMailService> 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);
- }
- }
|