Files
emall-api/FutureMailAPI/Helpers/MailDeliveryJob.cs

102 lines
4.1 KiB
C#
Raw Normal View History

2025-10-16 09:56:36 +08:00
using Microsoft.EntityFrameworkCore;
using Quartz;
using FutureMailAPI.Data;
using FutureMailAPI.Models;
namespace FutureMailAPI.Helpers
{
[DisallowConcurrentExecution]
public class MailDeliveryJob : IJob
{
private readonly FutureMailDbContext _context;
private readonly ILogger<MailDeliveryJob> _logger;
public MailDeliveryJob(FutureMailDbContext context, ILogger<MailDeliveryJob> logger)
{
_context = context;
_logger = logger;
}
public async Task Execute(IJobExecutionContext context)
{
_logger.LogInformation("开始执行邮件投递任务: {time}", DateTime.Now);
try
{
// 查找所有需要投递的邮件
var mailsToDeliver = await _context.SentMails
.Where(m => m.Status == 1 && m.DeliveryTime <= DateTime.UtcNow)
.Include(m => m.Sender)
.ToListAsync();
_logger.LogInformation("找到 {count} 封待投递邮件", mailsToDeliver.Count);
foreach (var mail in mailsToDeliver)
{
try
{
// 更新邮件状态为投递中
mail.Status = 2;
await _context.SaveChangesAsync();
// 根据收件人类型创建接收邮件记录
if (mail.RecipientType == 0) // 发给自己
{
var receivedMail = new ReceivedMail
{
SentMailId = mail.Id,
RecipientId = mail.SenderId,
ReceivedAt = DateTime.UtcNow
};
_context.ReceivedMails.Add(receivedMail);
}
else if (mail.RecipientType == 1 && mail.RecipientId.HasValue) // 发给指定用户
{
var receivedMail = new ReceivedMail
{
SentMailId = mail.Id,
RecipientId = mail.RecipientId.Value,
ReceivedAt = DateTime.UtcNow
};
_context.ReceivedMails.Add(receivedMail);
}
else if (mail.RecipientType == 2) // 公开时间胶囊
{
// 公开时间胶囊的处理逻辑,可能需要更复杂的机制
// 这里简化处理,暂时不实现
}
// 更新邮件状态为已送达
mail.Status = 3;
// 更新对应的时间胶囊状态
var timeCapsule = await _context.TimeCapsules
.FirstOrDefaultAsync(tc => tc.SentMailId == mail.Id);
if (timeCapsule != null)
{
timeCapsule.Status = 3; // 已开启
}
await _context.SaveChangesAsync();
_logger.LogInformation("邮件 {mailId} 投递成功", mail.Id);
}
catch (Exception ex)
{
_logger.LogError(ex, "投递邮件 {mailId} 时发生错误", mail.Id);
// 可以添加重试逻辑或错误通知
}
}
_logger.LogInformation("邮件投递任务完成: {time}", DateTime.Now);
}
catch (Exception ex)
{
_logger.LogError(ex, "执行邮件投递任务时发生错误");
}
}
}
}