diff --git a/src/core/DigitalData.MessagingService.Application/Common/Interfaces/IImapEmailService.cs b/src/core/DigitalData.MessagingService.Application/Common/Interfaces/IImapEmailService.cs index 0fd507f..f67a0b4 100644 --- a/src/core/DigitalData.MessagingService.Application/Common/Interfaces/IImapEmailService.cs +++ b/src/core/DigitalData.MessagingService.Application/Common/Interfaces/IImapEmailService.cs @@ -13,10 +13,12 @@ public interface IImapEmailService /// /// Account whose IMAP settings will be used. /// Filter to apply when fetching emails. + /// When , attachment data is included in the results; otherwise attachments are omitted. Defaults to . /// Cancellation token. Task> FetchEmailsAsync( EmailAccountDto account, MailSearchFilter filter, + bool withAttachments = false, CancellationToken cancellationToken = default); /// diff --git a/src/core/DigitalData.MessagingService.Application/EmailReceiving/Queries/FetchEmailsQuery.cs b/src/core/DigitalData.MessagingService.Application/EmailReceiving/Queries/FetchEmailsQuery.cs index 9b1a6bb..bba1e4d 100644 --- a/src/core/DigitalData.MessagingService.Application/EmailReceiving/Queries/FetchEmailsQuery.cs +++ b/src/core/DigitalData.MessagingService.Application/EmailReceiving/Queries/FetchEmailsQuery.cs @@ -21,6 +21,12 @@ public record FetchEmailsQuery : IRequest> /// Mail query used to filter and limit the emails retrieved. /// public MailSearchFilter Mail { get; init; } = new(); + + /// + /// When , attachment data is included in the results; otherwise attachments are omitted. + /// Defaults to . + /// + public bool WithAttachments { get; init; } = false; } public class FetchEmailsQueryHandler( @@ -40,6 +46,7 @@ public class FetchEmailsQueryHandler( return await ImapService.FetchEmailsAsync( account, request.Mail, + request.WithAttachments, cancellationToken); } } diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/LimilabsImapEmailService.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/LimilabsImapEmailService.cs index da57906..318e987 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/LimilabsImapEmailService.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/LimilabsImapEmailService.cs @@ -27,6 +27,7 @@ public class LimilabsImapEmailService( public async Task> FetchEmailsAsync( EmailAccountDto account, MailSearchFilter filter, + bool withAttachments = false, CancellationToken cancellationToken = default) { using var imap = new Imap(); @@ -38,7 +39,7 @@ public class LimilabsImapEmailService( List criterions = []; if (filter.UnseenOnly) - criterions.Add((ICriterion)Flag.Unseen); + criterions.Add(Expression.HasFlag(Flag.Unseen)); if (filter.SubjectContains is not null) criterions.Add(Expression.Subject(filter.SubjectContains)); @@ -103,7 +104,7 @@ public class LimilabsImapEmailService( if (filter.HasAttachments && mail.Attachments.Count == 0 && mail.Visuals.Count == 0) continue; - results.Add(MapToContext(uid, mail, flags)); + results.Add(MapToContext(uid, mail, flags, withAttachments)); } catch (Exception ex) { @@ -179,32 +180,35 @@ public class LimilabsImapEmailService( await imap.SelectAsync(folder); } - private static ReceivedEmailContext MapToContext(long uid, IMail mail, List flags) + private static ReceivedEmailContext MapToContext(long uid, IMail mail, List flags, bool withAttachments = false) { var attachments = new List(); - foreach (var att in mail.Attachments) + if (withAttachments) { - attachments.Add(new EmailAttachmentContext + foreach (var att in mail.Attachments) { - FileName = att.FileName ?? "attachment", - Content = att.Data, - ContentType = att.ContentType?.ToString() ?? "application/octet-stream", - IsInline = false, - ContentId = att.ContentId - }); - } + attachments.Add(new EmailAttachmentContext + { + FileName = att.FileName ?? "attachment", + Content = att.Data, + ContentType = att.ContentType?.ToString() ?? "application/octet-stream", + IsInline = false, + ContentId = att.ContentId + }); + } - foreach (var vis in mail.Visuals) - { - attachments.Add(new EmailAttachmentContext + foreach (var vis in mail.Visuals) { - FileName = vis.FileName ?? "inline", - Content = vis.Data, - ContentType = vis.ContentType?.ToString() ?? "application/octet-stream", - IsInline = true, - ContentId = vis.ContentId - }); + attachments.Add(new EmailAttachmentContext + { + FileName = vis.FileName ?? "inline", + Content = vis.Data, + ContentType = vis.ContentType?.ToString() ?? "application/octet-stream", + IsInline = true, + ContentId = vis.ContentId + }); + } } return new ReceivedEmailContext