sozsoft-platform/api/modules/Sozsoft.MailQueue/Domain/MailQueueWorker.cs
2026-10-17 21:51:10 +03:00

120 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Sozsoft.MailQueue.Domain.Entities;
using Sozsoft.MailQueue.Domain.MailGeneration;
using Sozsoft.MailQueue.Domain.Shared;
using Sozsoft.Sender.Mail;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Timing;
using Volo.Abp.Uow;
namespace Sozsoft.MailQueue.Domain;
public class MailQueueWorker : BackgroundWorkerBase
{
public Guid TemplateId { get; set; }
public string TemplateName { get; set; }
public MailQueueWorkerOptions Options { get; set; }
protected ISozsoftEmailSender ErpEmailSender { get; }
protected IRepository<BackgroundWorker_MailQueue> Repository { get; }
public IClock Clock { get; }
public ILogManager LogManager { get; }
public ITableGenerator TableGenerator { get; }
public IMailBodyGenerator MailBodyGenerator { get; }
public IAttachmentGenerator AttachmentGenerator { get; }
public MailQueueWorker(
ISozsoftEmailSender erpEmailSender,
IRepository<BackgroundWorker_MailQueue> repository,
IClock clock,
ILogManager logManager,
ITableGenerator tableGenerator,
IMailBodyGenerator mailBodyGenerator,
IAttachmentGenerator attachmentGenerator)
{
ErpEmailSender = erpEmailSender;
Repository = repository;
Clock = clock;
LogManager = logManager;
TableGenerator = tableGenerator;
MailBodyGenerator = mailBodyGenerator;
AttachmentGenerator = attachmentGenerator;
}
/// <summary>
/// Şablonun (TemplateId) gönderilmemiş kuyruk kayıtlarını işler: her kayıt için tablo, gövde ve
/// ekler üretilir, mail gönderilir, sonuç kayda yazılır. Akış: tablo → gövde → ekler → gönderim.
/// </summary>
public override async Task StartAsync(CancellationToken cancellationToken = default)
{
var uowManager = LazyServiceProvider.LazyGetRequiredService<IUnitOfWorkManager>();
using var uow = uowManager.Begin();
var jobId = $"{TemplateId}-{Clock.Now:yyyy-MM-dd-HH-mm-ss}";
var queues = await Repository.GetListAsync(a => a.TemplateId == TemplateId && !a.SendStatus, cancellationToken: cancellationToken);
foreach (var queue in queues)
{
// Her kayıt kendi UoW'sinde: bir kaydın hatası diğerlerinin gönderimini ve kaydını düşürmez.
using var uow2 = uowManager.Begin(requiresNew: true, isTransactional: false);
try
{
await ProcessQueueAsync(queue, jobId, cancellationToken);
await uow2.CompleteAsync(cancellationToken);
}
catch (Exception ex)
{
LogManager.LogError($"Hata. Kuyruk Id: {queue.Id}. {ex}", "HATA", "KUYRUK", queue.Id, jobId);
}
}
await uow.CompleteAsync(cancellationToken);
}
private async Task ProcessQueueAsync(BackgroundWorker_MailQueue queue, string jobId, CancellationToken cancellationToken)
{
var tables = await TableGenerator.GenerateAsync(queue.TableName, queue.TableParameter, queue.Id);
var mailBody = await MailBodyGenerator.GenerateAsync(
TemplateName,
queue.MailParameter,
queue.Id,
tables,
jobId);
// Ekler tablo şablonlarından (IN olmayanlar: PDF, XLS, TXT) üretilir.
var attachments = await AttachmentGenerator.GenerateAsync(tables.Values.ToList(), queue.Id, jobId);
// IN olmayan bir tablo belirtilmiş ama hiçbiri üretilememişse hata vardır, gönderilmez.
if (tables.Values.Any(a => a.DosyaTipi != "IN") && attachments.IsNullOrEmpty())
{
LogManager.LogWarning("Tablo Attachmentlar oluşturulamadı", "ATTACHMENT", "KUYRUK", queue.Id, jobId);
return;
}
var senderKeyValue = queue.From.Split(":");
var sender = new KeyValuePair<string, string>(
senderKeyValue.ElementAtOrDefault(0),
senderKeyValue.ElementAtOrDefault(1));
var result = await ErpEmailSender.SendEmailAsync(
queue.To.Split(";").Select(a => a.Trim()).ToArray(),
sender,
null,
mailBody,
Options.MailSubject,
attachments,
true);
if (result.Success)
{
queue.AwsMessageId = result.MessageId;
}
else
{
LogManager.LogWarning($"Mail gönderilemedi. Gelen Mesaj: {result.ErrorMessage}", "MAILSEND", "KUYRUK", queue.Id, jobId);
queue.AwsMessageId = result.ErrorMessage;
}
queue.SendStatus = result.Success;
queue.SendTime = Clock.Now;
await Repository.UpdateAsync(queue, cancellationToken: cancellationToken);
}
}