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