邮件日志修改
continuous-integration/drone/push Build is failing Details

Test_IRC_Net8
he 2025-12-08 13:36:41 +08:00
parent 06f10e38f5
commit 1427940224
2 changed files with 47 additions and 17 deletions

View File

@ -130,12 +130,27 @@ public class GetEmailInfoOutDto:EmailLogView
public class GetEmailInfoInDto
{
public Guid Id { get; set; }
public Guid? TrialId { get; set; }
}
public class SynchronizationEmailInDto
{
public Guid? TrialId { get; set; }
}
public class ResendEmailInDto
{
public Guid Id { get; set; }
public Guid? TrialId { get; set; }
}
public class EmailAuthorization
{
public string FromEmail { get; set; } = string.Empty;
public string AuthorizationCode { get; set; } = string.Empty;
}
public class EmailLogQuery:PageInput

View File

@ -23,6 +23,7 @@ using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Threading.Tasks;
using Panda.DynamicWebApi.Attributes;
namespace IRaCIS.Core.Application.Service;
/// <summary>
@ -54,14 +55,14 @@ public class EmailLogService(IRepository<EmailLog> _emailLogRepository,
[HttpPost]
public async Task<PageOutput<EmailLogView>> GetEmailLogList(EmailLogQuery inDto)
{
var emailFromName = await _trialRepository.Where(x=>x.Id==inDto.TrialId).Select(x=>x.EmailFromName).FirstOrDefaultAsync();
var emailFromEmail = await _trialRepository.Where(x=>x.Id==inDto.TrialId).Select(x=>x.EmailFromEmail).FirstOrDefaultAsync();
if (emailFromName.IsNullOrEmpty())
if (emailFromEmail.IsNullOrEmpty())
{
emailFromName = _systemEmailConfig.FromName;
emailFromEmail = _systemEmailConfig.FromEmail;
}
var emailLogQueryable = _emailLogRepository
.Where(x=>x.SenderName== emailFromName)
.Where(x=>x.SenderAddress== emailFromEmail)
.WhereIf(inDto.EmailStartDate.HasValue, x => x.EmailDate >= inDto.EmailStartDate.Value)
.WhereIf(inDto.EmailEndDate.HasValue, x => x.EmailDate <= inDto.EmailEndDate.Value)
.WhereIf(inDto.EmailStateEnum.HasValue, x => x.EmailStateEnum == inDto.EmailStateEnum.Value)
@ -119,8 +120,7 @@ public class EmailLogService(IRepository<EmailLog> _emailLogRepository,
{
try
{
client.Connect(_systemEmailConfig.Imap, _systemEmailConfig.ImapPort, SecureSocketOptions.SslOnConnect);
AuthenticateImap(client);
await AuthenticateImap(client,inDto.TrialId);
var sentFolder = OpenSentFolder(client);
var uid = new UniqueId(uint.Parse(emailInfo.UniqueId));
var message = sentFolder.GetMessage(uid);
@ -205,8 +205,7 @@ public class EmailLogService(IRepository<EmailLog> _emailLogRepository,
{
try
{
client.Connect(_systemEmailConfig.Imap, _systemEmailConfig.ImapPort, SecureSocketOptions.SslOnConnect);
AuthenticateImap(client);
await AuthenticateImap(client,inDto.TrialId);
var sentFolder = OpenSentFolder(client);
var uid = new UniqueId(uint.Parse(emailInfo.UniqueId));
var message = sentFolder.GetMessage(uid);
@ -267,7 +266,7 @@ public class EmailLogService(IRepository<EmailLog> _emailLogRepository,
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> SynchronizationEmail()
public async Task<IResponseOutput> SynchronizationEmail(SynchronizationEmailInDto inDto)
{
var maxTime = await _emailLogRepository.MaxAsync(t => t.EmailDate);
var startDate = maxTime ?? DateTime.MinValue;
@ -279,8 +278,8 @@ public class EmailLogService(IRepository<EmailLog> _emailLogRepository,
{
try
{
client.Connect(_systemEmailConfig.Imap, _systemEmailConfig.ImapPort, SecureSocketOptions.SslOnConnect);
AuthenticateImap(client);
await AuthenticateImap(client, inDto.TrialId);
var sentFolder = OpenSentFolder(client);
var searchQuery = SearchQuery.All.And(SearchQuery.DeliveredAfter(startDate));
@ -368,7 +367,7 @@ public class EmailLogService(IRepository<EmailLog> _emailLogRepository,
// 第二步:处理收件箱中的邮件发送失败通知
try
{
await ProcessInboxFailureNotifications(startDate);
await ProcessInboxFailureNotifications(startDate,inDto.TrialId);
}
catch (Exception ex)
{
@ -490,11 +489,27 @@ public class EmailLogService(IRepository<EmailLog> _emailLogRepository,
return folder;
}
private void AuthenticateImap(ImapClient client)
private async Task AuthenticateImap(ImapClient client, Guid? trialId)
{
try
{
client.Authenticate(_systemEmailConfig.FromEmail, _systemEmailConfig.AuthorizationCode);
EmailAuthorization authorization = new EmailAuthorization()
{
FromEmail = _systemEmailConfig.FromEmail,
AuthorizationCode = _systemEmailConfig.AuthorizationCode,
};
if (trialId != null)
{
authorization = await _trialRepository.Where(x => x.Id == trialId.Value).Select(x => new EmailAuthorization()
{
AuthorizationCode = x.EmailAuthorizationCode,
FromEmail = x.EmailFromEmail
}).FirstNotNullAsync();
}
client.Connect(_systemEmailConfig.Imap, _systemEmailConfig.ImapPort, SecureSocketOptions.SslOnConnect);
client.Authenticate(authorization.FromEmail, authorization.AuthorizationCode);
}
catch (AuthenticationException)
{
@ -523,14 +538,14 @@ public class EmailLogService(IRepository<EmailLog> _emailLogRepository,
/// 处理收件箱中的邮件发送失败通知
/// </summary>
/// <returns></returns>
public async Task ProcessInboxFailureNotifications(DateTime startTime)
public async Task ProcessInboxFailureNotifications(DateTime startTime, Guid? trialId)
{
using (var client = new ImapClient())
{
try
{
client.Connect(_systemEmailConfig.Imap, _systemEmailConfig.ImapPort, SecureSocketOptions.SslOnConnect);
AuthenticateImap(client);
await AuthenticateImap(client, trialId);
var inboxFolder = OpenInboxFolder(client);
// 搜索可能包含失败通知的邮件