This is an automated email from the ASF dual-hosted git repository.

hqtran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 6405128478 JAMES-4176 Retire email_query_view_sent_at
6405128478 is described below

commit 64051284789cddf59bd38229feaeeb6e123750a8
Author: Quan Tran <[email protected]>
AuthorDate: Mon Mar 2 17:21:05 2026 +0700

    JAMES-4176 Retire email_query_view_sent_at
---
 .../projections/CassandraEmailQueryView.java       | 112 ++--------
 .../CassandraEmailQueryViewDataDefinition.java     |  17 +-
 .../table/CassandraEmailQueryViewTable.java        |   2 -
 .../projections/PostgresEmailQueryView.java        |  14 +-
 .../projections/PostgresEmailQueryViewDAO.java     |  25 +--
 .../PostgresEmailQueryViewDataDefinition.java      |   7 -
 .../PostgresEmailQueryViewManagerRLSTest.java      |   5 +-
 .../james/jmap/api/projections/EmailQueryView.java |  51 +----
 .../memory/projections/MemoryEmailQueryView.java   |  29 +--
 .../api/projections/EmailQueryViewContract.java    | 244 +++------------------
 .../jmap/event/PopulateEmailQueryViewListener.java |  28 +--
 .../james/jmap/method/EmailQueryMethod.scala       |  17 --
 .../event/PopulateEmailQueryViewListenerTest.java  |  14 +-
 .../data/jmap/EmailQueryViewPopulator.java         |  20 +-
 .../PopulateEmailQueryViewRequestToTaskTest.java   |   6 +-
 15 files changed, 73 insertions(+), 518 deletions(-)

diff --git 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java
 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java
index 58bd2b3178..614ccc2748 100644
--- 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java
+++ 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java
@@ -28,9 +28,7 @@ import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQu
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.MAILBOX_ID;
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.MESSAGE_ID;
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.RECEIVED_AT;
-import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.SENT_AT;
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.TABLE_NAME_RECEIVED_AT;
-import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.TABLE_NAME_SENT_AT;
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.THREAD_ID;
 
 import java.time.Instant;
@@ -66,19 +64,14 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
     private static final String LIMIT_MARKER = "LIMIT_BIND_MARKER";
 
     private final CassandraAsyncExecutor executor;
-    private final PreparedStatement listMailboxContentBySentAt;
     private final PreparedStatement listMailboxContentByReceivedAt;
-    private final PreparedStatement listMailboxContentSinceSentAt;
     private final PreparedStatement listMailboxContentSinceReceivedAt;
     private final PreparedStatement listMailboxContentBeforeReceivedAt;
     private final PreparedStatement insertInLookupTable;
     private final PreparedStatement insertReceivedAt;
-    private final PreparedStatement insertSentAt;
     private final PreparedStatement deleteLookupRecord;
-    private final PreparedStatement deleteSentAt;
     private final PreparedStatement deleteReceivedAt;
     private final PreparedStatement deleteAllLookupRecords;
-    private final PreparedStatement deleteAllSentAt;
     private final PreparedStatement deleteAllReceivedAt;
     private final PreparedStatement lookupDate;
 
@@ -86,13 +79,6 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
     public CassandraEmailQueryView(CqlSession session) {
         this.executor = new CassandraAsyncExecutor(session);
 
-        listMailboxContentBySentAt = 
session.prepare(selectFrom(TABLE_NAME_SENT_AT)
-            .columns(MESSAGE_ID, SENT_AT, THREAD_ID)
-            .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
-            .orderBy(SENT_AT, DESC)
-            .limit(bindMarker(LIMIT_MARKER))
-            .build());
-
         listMailboxContentByReceivedAt = 
session.prepare(selectFrom(TABLE_NAME_RECEIVED_AT)
             .columns(MESSAGE_ID, RECEIVED_AT, THREAD_ID)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
@@ -100,16 +86,8 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
             .limit(bindMarker(LIMIT_MARKER))
             .build());
 
-        listMailboxContentSinceSentAt = 
session.prepare(selectFrom(TABLE_NAME_SENT_AT)
-            .columns(MESSAGE_ID, SENT_AT, THREAD_ID)
-            .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
-            .whereColumn(SENT_AT).isGreaterThanOrEqualTo(bindMarker(SENT_AT))
-            .orderBy(SENT_AT, DESC)
-            .limit(bindMarker(LIMIT_MARKER))
-            .build());
-
         listMailboxContentSinceReceivedAt = 
session.prepare(selectFrom(TABLE_NAME_RECEIVED_AT)
-            .columns(MESSAGE_ID, SENT_AT, THREAD_ID)
+            .columns(MESSAGE_ID, RECEIVED_AT, THREAD_ID)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             
.whereColumn(RECEIVED_AT).isGreaterThanOrEqualTo(bindMarker(RECEIVED_AT))
             .orderBy(RECEIVED_AT, DESC)
@@ -117,7 +95,7 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
             .build());
 
         listMailboxContentBeforeReceivedAt = 
session.prepare(selectFrom(TABLE_NAME_RECEIVED_AT)
-            .columns(MESSAGE_ID, SENT_AT, THREAD_ID)
+            .columns(MESSAGE_ID, RECEIVED_AT, THREAD_ID)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             
.whereColumn(RECEIVED_AT).isLessThanOrEqualTo(bindMarker(RECEIVED_AT))
             .orderBy(RECEIVED_AT, DESC)
@@ -127,22 +105,13 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
         insertInLookupTable = session.prepare(insertInto(DATE_LOOKUP_TABLE)
             .value(MAILBOX_ID, bindMarker(MAILBOX_ID))
             .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
-            .value(SENT_AT, bindMarker(SENT_AT))
             .value(RECEIVED_AT, bindMarker(RECEIVED_AT))
             .build());
 
-        insertSentAt = session.prepare(insertInto(TABLE_NAME_SENT_AT)
-            .value(MAILBOX_ID, bindMarker(MAILBOX_ID))
-            .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
-            .value(SENT_AT, bindMarker(SENT_AT))
-            .value(THREAD_ID, bindMarker(THREAD_ID))
-            .build());
-
         insertReceivedAt = session.prepare(insertInto(TABLE_NAME_RECEIVED_AT)
             .value(MAILBOX_ID, bindMarker(MAILBOX_ID))
             .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
             .value(RECEIVED_AT, bindMarker(RECEIVED_AT))
-            .value(SENT_AT, bindMarker(SENT_AT))
             .value(THREAD_ID, bindMarker(THREAD_ID))
             .build());
 
@@ -151,12 +120,6 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
             .whereColumn(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID))
             .build());
 
-        deleteSentAt = session.prepare(deleteFrom(TABLE_NAME_SENT_AT)
-            .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
-            .whereColumn(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID))
-            .whereColumn(SENT_AT).isEqualTo(bindMarker(SENT_AT))
-            .build());
-
         deleteReceivedAt = 
session.prepare(QueryBuilder.deleteFrom(TABLE_NAME_RECEIVED_AT)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             .whereColumn(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID))
@@ -167,10 +130,6 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             .build());
 
-        deleteAllSentAt = 
session.prepare(QueryBuilder.deleteFrom(TABLE_NAME_SENT_AT)
-            .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
-            .build());
-
         deleteAllReceivedAt = 
session.prepare(QueryBuilder.deleteFrom(TABLE_NAME_RECEIVED_AT)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             .build());
@@ -182,17 +141,6 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
             .build());
     }
 
-    @Override
-    public Flux<MessageId> listMailboxContentSortedBySentAt(MailboxId 
mailboxId, Limit limit, boolean collapseThreads) {
-        CassandraId cassandraId = (CassandraId) mailboxId;
-
-        return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
-            .resolve(backendFetchLimit -> 
executor.executeRows(listMailboxContentBySentAt.bind()
-                    .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
-                    .setInt(LIMIT_MARKER, backendFetchLimit.getLimit().get()))
-                .map(asEmailEntry(SENT_AT)));
-    }
-
     @Override
     public Flux<MessageId> listMailboxContentSortedByReceivedAt(MailboxId 
mailboxId, Limit limit, boolean collapseThreads) {
         CassandraId cassandraId = (CassandraId) mailboxId;
@@ -213,7 +161,7 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
                     .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                     .setInstant(RECEIVED_AT, since.toInstant())
                     .setInt(LIMIT_MARKER, backendFetchLimit.getLimit().get()))
-                .map(asEmailEntry(SENT_AT)));
+                .map(asEmailEntry(RECEIVED_AT)));
     }
 
     @Override
@@ -225,19 +173,7 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
                         .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                         .setInstant(RECEIVED_AT, since.toInstant())
                         .setInt(LIMIT_MARKER, 
backendFetchLimit.getLimit().get()))
-                    .map(asEmailEntry(SENT_AT)));
-    }
-
-    @Override
-    public Flux<MessageId> listMailboxContentSinceSentAt(MailboxId mailboxId, 
ZonedDateTime since, Limit limit, boolean collapseThreads) {
-        CassandraId cassandraId = (CassandraId) mailboxId;
-
-        return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
-            .resolve(backendFetchLimit -> 
executor.executeRows(listMailboxContentSinceSentAt.bind()
-                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
-                .setInstant(SENT_AT, since.toInstant())
-                .setInt(LIMIT_MARKER, backendFetchLimit.getLimit().get()))
-            .map(asEmailEntry(SENT_AT)));
+                    .map(asEmailEntry(RECEIVED_AT)));
     }
 
     private Function<Row, EmailEntry> asEmailEntry(CqlIdentifier dateField) {
@@ -264,17 +200,11 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
 
     public Mono<? extends Void> doDelete(CassandraMessageId 
cassandraMessageId, CassandraId cassandraId, Row row) {
         Instant receivedAt = row.getInstant(RECEIVED_AT);
-        Instant sentAt = row.getInstant(SENT_AT);
 
-        return Flux.concat(
-            executor.executeVoid(deleteSentAt.bind()
+        return executor.executeVoid(deleteReceivedAt.bind()
                 .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                 .setUuid(MESSAGE_ID, cassandraMessageId.get())
-                .setInstant(SENT_AT, sentAt)),
-            executor.executeVoid(deleteReceivedAt.bind()
-                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
-                .setUuid(MESSAGE_ID, cassandraMessageId.get())
-                .setInstant(RECEIVED_AT, receivedAt)))
+                .setInstant(RECEIVED_AT, receivedAt))
             .then(executor.executeVoid(deleteLookupRecord.bind()
                 .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                 .setUuid(MESSAGE_ID, cassandraMessageId.get())));
@@ -284,37 +214,25 @@ public class CassandraEmailQueryView implements 
EmailQueryView {
     public Mono<Void> delete(MailboxId mailboxId) {
         CassandraId cassandraId = (CassandraId) mailboxId;
 
-        return Flux.concat(
-            executor.executeVoid(deleteAllSentAt.bind()
-                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)),
-            executor.executeVoid(deleteAllReceivedAt.bind()
-                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)))
+        return executor.executeVoid(deleteAllReceivedAt.bind()
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID))
             .then(executor.executeVoid(deleteAllLookupRecords.bind()
                 .setUuid(MAILBOX_ID, ((CassandraId) mailboxId).asUuid())));
     }
 
     @Override
-    public Mono<Void> save(MailboxId mailboxId, ZonedDateTime sentAt, 
ZonedDateTime receivedAt, MessageId messageId, ThreadId threadId) {
+    public Mono<Void> save(MailboxId mailboxId, ZonedDateTime receivedAt, 
MessageId messageId, ThreadId threadId) {
         CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId;
         CassandraId cassandraId = (CassandraId) mailboxId;
 
         return executor.executeVoid(insertInLookupTable.bind()
             .setUuid(MESSAGE_ID, cassandraMessageId.get())
             .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
-            .setInstant(RECEIVED_AT, receivedAt.toInstant())
-            .setInstant(SENT_AT, sentAt.toInstant()))
-            .then(Flux.concat(
-                executor.executeVoid(insertSentAt.bind()
-                    .setUuid(MESSAGE_ID, cassandraMessageId.get())
-                    .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
-                    .setInstant(SENT_AT, sentAt.toInstant())
-                    .setUuid(THREAD_ID, ((CassandraMessageId) 
threadId.getBaseMessageId()).get())),
-                executor.executeVoid(insertReceivedAt.bind()
-                    .setUuid(MESSAGE_ID, cassandraMessageId.get())
-                    .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
-                    .setInstant(RECEIVED_AT, receivedAt.toInstant())
-                    .setInstant(SENT_AT, sentAt.toInstant())
-                    .setUuid(THREAD_ID, ((CassandraMessageId) 
threadId.getBaseMessageId()).get())))
-                .then());
+            .setInstant(RECEIVED_AT, receivedAt.toInstant()))
+            .then(executor.executeVoid(insertReceivedAt.bind()
+                .setUuid(MESSAGE_ID, cassandraMessageId.get())
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
+                .setInstant(RECEIVED_AT, receivedAt.toInstant())
+                .setUuid(THREAD_ID, ((CassandraMessageId) 
threadId.getBaseMessageId()).get())));
     }
 }
diff --git 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewDataDefinition.java
 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewDataDefinition.java
index 195f775eb2..56fed840fd 100644
--- 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewDataDefinition.java
+++ 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewDataDefinition.java
@@ -26,9 +26,7 @@ import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQu
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.MAILBOX_ID;
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.MESSAGE_ID;
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.RECEIVED_AT;
-import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.SENT_AT;
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.TABLE_NAME_RECEIVED_AT;
-import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.TABLE_NAME_SENT_AT;
 import static 
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.THREAD_ID;
 
 import org.apache.james.backends.cassandra.components.CassandraDataDefinition;
@@ -36,18 +34,7 @@ import 
org.apache.james.backends.cassandra.components.CassandraDataDefinition;
 import com.datastax.oss.driver.api.core.type.DataTypes;
 
 public interface CassandraEmailQueryViewDataDefinition {
-    CassandraDataDefinition MODULE = 
CassandraDataDefinition.table(TABLE_NAME_SENT_AT)
-        .comment("Storing the JMAP projections for list of emails within a 
mailbox to not rely on OpenSearch for basic Email/query (sorts sentAt).")
-        .options(options -> options
-            .withClusteringOrder(SENT_AT, DESC)
-            .withCaching(true, rows(DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(MAILBOX_ID, DataTypes.UUID)
-            .withClusteringColumn(SENT_AT, DataTypes.TIMESTAMP)
-            .withClusteringColumn(MESSAGE_ID, DataTypes.UUID)
-            .withColumn(THREAD_ID, DataTypes.UUID))
-
-        .table(TABLE_NAME_RECEIVED_AT)
+    CassandraDataDefinition MODULE = 
CassandraDataDefinition.table(TABLE_NAME_RECEIVED_AT)
         .comment("Storing the JMAP projections for list of emails within a 
mailbox to not rely on OpenSearch for basic Email/query (sorts and filter on 
receivedAt).")
         .options(options -> options
             .withClusteringOrder(RECEIVED_AT, DESC)
@@ -56,7 +43,6 @@ public interface CassandraEmailQueryViewDataDefinition {
             .withPartitionKey(MAILBOX_ID, DataTypes.UUID)
             .withClusteringColumn(RECEIVED_AT, DataTypes.TIMESTAMP)
             .withClusteringColumn(MESSAGE_ID, DataTypes.UUID)
-            .withColumn(SENT_AT, DataTypes.TIMESTAMP)
             .withColumn(THREAD_ID, DataTypes.UUID))
 
         .table(DATE_LOOKUP_TABLE)
@@ -66,7 +52,6 @@ public interface CassandraEmailQueryViewDataDefinition {
         .statement(statement -> types -> statement
             .withPartitionKey(MAILBOX_ID, DataTypes.UUID)
             .withClusteringColumn(MESSAGE_ID, DataTypes.UUID)
-            .withColumn(SENT_AT, DataTypes.TIMESTAMP)
             .withColumn(RECEIVED_AT, DataTypes.TIMESTAMP))
 
         .build();
diff --git 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java
 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java
index a7ccea8f1b..3629752f2d 100644
--- 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java
+++ 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java
@@ -22,13 +22,11 @@ package org.apache.james.jmap.cassandra.projections.table;
 import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraEmailQueryViewTable {
-    String TABLE_NAME_SENT_AT = "email_query_view_sent_at";
     String TABLE_NAME_RECEIVED_AT = "email_query_view_received_at";
     String DATE_LOOKUP_TABLE = "email_query_view_date_lookup";
 
     CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
     CqlIdentifier MESSAGE_ID = CqlIdentifier.fromCql("messageId");
     CqlIdentifier RECEIVED_AT = CqlIdentifier.fromCql("receivedAt");
-    CqlIdentifier SENT_AT = CqlIdentifier.fromCql("sentAt");
     CqlIdentifier THREAD_ID = CqlIdentifier.fromCql("thread_id");
 }
diff --git 
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java
 
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java
index 503b2418f8..585a4baba8 100644
--- 
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java
+++ 
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java
@@ -42,11 +42,6 @@ public class PostgresEmailQueryView implements 
EmailQueryView {
         this.emailQueryViewDAO = emailQueryViewDAO;
     }
 
-    @Override
-    public Flux<MessageId> listMailboxContentSortedBySentAt(MailboxId 
mailboxId, Limit limit, boolean collapseThreads) {
-        return 
emailQueryViewDAO.listMailboxContentSortedBySentAt(PostgresMailboxId.class.cast(mailboxId),
 limit, collapseThreads);
-    }
-
     @Override
     public Flux<MessageId> listMailboxContentSortedByReceivedAt(MailboxId 
mailboxId, Limit limit, boolean collapseThreads) {
         return 
emailQueryViewDAO.listMailboxContentSortedByReceivedAt(PostgresMailboxId.class.cast(mailboxId),
 limit, collapseThreads);
@@ -62,11 +57,6 @@ public class PostgresEmailQueryView implements 
EmailQueryView {
         return 
emailQueryViewDAO.listMailboxContentBeforeSortedByReceivedAt(PostgresMailboxId.class.cast(mailboxId),
 since, limit, collapseThreads);
     }
 
-    @Override
-    public Flux<MessageId> listMailboxContentSinceSentAt(MailboxId mailboxId, 
ZonedDateTime since, Limit limit, boolean collapseThreads) {
-        return 
emailQueryViewDAO.listMailboxContentSinceSentAt(PostgresMailboxId.class.cast(mailboxId),
 since, limit, collapseThreads);
-    }
-
     @Override
     public Mono<Void> delete(MailboxId mailboxId, MessageId messageId) {
         return 
emailQueryViewDAO.delete(PostgresMailboxId.class.cast(mailboxId), 
PostgresMessageId.class.cast(messageId));
@@ -78,7 +68,7 @@ public class PostgresEmailQueryView implements EmailQueryView 
{
     }
 
     @Override
-    public Mono<Void> save(MailboxId mailboxId, ZonedDateTime sentAt, 
ZonedDateTime receivedAt, MessageId messageId, ThreadId threadId) {
-        return emailQueryViewDAO.save(PostgresMailboxId.class.cast(mailboxId), 
sentAt, receivedAt, PostgresMessageId.class.cast(messageId), threadId);
+    public Mono<Void> save(MailboxId mailboxId, ZonedDateTime receivedAt, 
MessageId messageId, ThreadId threadId) {
+        return emailQueryViewDAO.save(PostgresMailboxId.class.cast(mailboxId), 
receivedAt, PostgresMessageId.class.cast(messageId), threadId);
     }
 }
diff --git 
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java
 
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java
index aa49bfd174..032d00c41e 100644
--- 
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java
+++ 
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java
@@ -23,7 +23,6 @@ import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewD
 import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.MESSAGE_ID;
 import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.PK_CONSTRAINT_NAME;
 import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.RECEIVED_AT;
-import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.SENT_AT;
 import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.TABLE_NAME;
 import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.THREAD_ID;
 
@@ -58,16 +57,6 @@ public class PostgresEmailQueryViewDAO {
         this.postgresExecutor = postgresExecutor;
     }
 
-    public Flux<MessageId> listMailboxContentSortedBySentAt(PostgresMailboxId 
mailboxId, Limit limit, boolean collapseThreads) {
-        return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
-            .resolve(backendFetchLimit -> 
postgresExecutor.executeRows(dslContext -> 
Flux.from(dslContext.select(MESSAGE_ID, SENT_AT, THREAD_ID)
-                    .from(TABLE_NAME)
-                    .where(MAILBOX_ID.eq(mailboxId.asUuid()))
-                    .orderBy(SENT_AT.desc())
-                    .limit(backendFetchLimit.getLimit().get())))
-                .map(asEmailEntry(SENT_AT)));
-    }
-
     public Flux<MessageId> 
listMailboxContentSortedByReceivedAt(PostgresMailboxId mailboxId, Limit limit, 
boolean collapseThreads) {
         return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
             .resolve(backendFetchLimit -> 
postgresExecutor.executeRows(dslContext -> 
Flux.from(dslContext.select(MESSAGE_ID, RECEIVED_AT, THREAD_ID)
@@ -100,17 +89,6 @@ public class PostgresEmailQueryViewDAO {
                 .map(asEmailEntry(RECEIVED_AT)));
     }
 
-    public Flux<MessageId> listMailboxContentSinceSentAt(PostgresMailboxId 
mailboxId, ZonedDateTime since, Limit limit, boolean collapseThreads) {
-        return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
-            .resolve(backendFetchLimit -> 
postgresExecutor.executeRows(dslContext -> 
Flux.from(dslContext.select(MESSAGE_ID, SENT_AT, THREAD_ID)
-                    .from(TABLE_NAME)
-                    .where(MAILBOX_ID.eq(mailboxId.asUuid()))
-                    .and(SENT_AT.greaterOrEqual(since.toOffsetDateTime()))
-                    .orderBy(SENT_AT.desc())
-                    .limit(backendFetchLimit.getLimit().get())))
-                .map(asEmailEntry(SENT_AT)));
-    }
-
     private Function<Record, EmailEntry> asEmailEntry(Field<OffsetDateTime> 
dateField) {
         return (Record record) -> {
             PostgresMessageId messageId = 
PostgresMessageId.Factory.of(record.get(MESSAGE_ID));
@@ -133,11 +111,10 @@ public class PostgresEmailQueryViewDAO {
             .where(MAILBOX_ID.eq(mailboxId.asUuid()))));
     }
 
-    public Mono<Void> save(PostgresMailboxId mailboxId, ZonedDateTime sentAt, 
ZonedDateTime receivedAt, PostgresMessageId messageId, ThreadId threadId) {
+    public Mono<Void> save(PostgresMailboxId mailboxId, ZonedDateTime 
receivedAt, PostgresMessageId messageId, ThreadId threadId) {
         return postgresExecutor.executeVoid(dslContext -> 
Mono.from(dslContext.insertInto(TABLE_NAME)
             .set(MAILBOX_ID, mailboxId.asUuid())
             .set(MESSAGE_ID, messageId.asUuid())
-            .set(SENT_AT, sentAt.toOffsetDateTime())
             .set(RECEIVED_AT, receivedAt.toOffsetDateTime())
             .set(THREAD_ID, ((PostgresMessageId) 
threadId.getBaseMessageId()).asUuid())
             .onConflictOnConstraint(PK_CONSTRAINT_NAME)
diff --git 
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDataDefinition.java
 
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDataDefinition.java
index d023576f51..689c499154 100644
--- 
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDataDefinition.java
+++ 
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDataDefinition.java
@@ -21,7 +21,6 @@ package org.apache.james.jmap.postgres.projections;
 
 import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.MAILBOX_ID_INDEX;
 import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.MAILBOX_ID_RECEIVED_AT_INDEX;
-import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.MAILBOX_ID_SENT_AT_INDEX;
 import static 
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.TABLE;
 
 import java.time.OffsetDateTime;
@@ -45,7 +44,6 @@ public interface PostgresEmailQueryViewDataDefinition {
         Field<UUID> MAILBOX_ID = DSL.field("mailbox_id", 
SQLDataType.UUID.notNull());
         Field<UUID> MESSAGE_ID = PostgresMessageDataDefinition.MESSAGE_ID;
         Field<OffsetDateTime> RECEIVED_AT = DSL.field("received_at", 
SQLDataType.TIMESTAMPWITHTIMEZONE.notNull());
-        Field<OffsetDateTime> SENT_AT = DSL.field("sent_at", 
SQLDataType.TIMESTAMPWITHTIMEZONE.notNull());
         Field<UUID> THREAD_ID = 
PostgresMessageDataDefinition.MessageToMailboxTable.THREAD_ID;
 
         Name PK_CONSTRAINT_NAME = DSL.name("email_query_view_pkey");
@@ -55,7 +53,6 @@ public interface PostgresEmailQueryViewDataDefinition {
                 .column(MAILBOX_ID)
                 .column(MESSAGE_ID)
                 .column(RECEIVED_AT)
-                .column(SENT_AT)
                 .column(THREAD_ID)
                 
.constraint(DSL.constraint(PK_CONSTRAINT_NAME).primaryKey(MAILBOX_ID, 
MESSAGE_ID))))
             .supportsRowLevelSecurity()
@@ -69,15 +66,11 @@ public interface PostgresEmailQueryViewDataDefinition {
             .createIndexStep((dslContext, indexName) -> 
dslContext.createIndexIfNotExists(indexName)
                 .on(TABLE_NAME, MAILBOX_ID, RECEIVED_AT));
 
-        PostgresIndex MAILBOX_ID_SENT_AT_INDEX = 
PostgresIndex.name("email_query_view_mailbox_id_sent_at_index")
-            .createIndexStep((dslContext, indexName) -> 
dslContext.createIndexIfNotExists(indexName)
-                .on(TABLE_NAME, MAILBOX_ID, SENT_AT));
     }
 
     PostgresDataDefinition MODULE = PostgresDataDefinition.builder()
         .addTable(TABLE)
         .addIndex(MAILBOX_ID_INDEX)
         .addIndex(MAILBOX_ID_RECEIVED_AT_INDEX)
-        .addIndex(MAILBOX_ID_SENT_AT_INDEX)
         .build();
 }
\ No newline at end of file
diff --git 
a/server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java
 
b/server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java
index 695bc78a92..8d83367b6b 100644
--- 
a/server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java
+++ 
b/server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java
@@ -39,7 +39,6 @@ public class PostgresEmailQueryViewManagerRLSTest {
     public static final PostgresMessageId.Factory MESSAGE_ID_FACTORY = new 
PostgresMessageId.Factory();
     public static final PostgresMessageId MESSAGE_ID_1 = 
MESSAGE_ID_FACTORY.generate();
     public static final ThreadId THREAD_ID_1 = 
ThreadId.fromBaseMessageId(MESSAGE_ID_FACTORY.generate());
-    private static final ZonedDateTime DATE_1 = 
ZonedDateTime.parse("2010-10-30T15:12:00Z");
     private static final ZonedDateTime DATE_2 = 
ZonedDateTime.parse("2010-10-30T16:12:00Z");
     private static final boolean NO_COLLAPSE_THREAD = false;
 
@@ -57,7 +56,7 @@ public class PostgresEmailQueryViewManagerRLSTest {
     void emailQueryViewCanBeAccessedAtTheDataLevelByMembersOfTheSameDomain() {
         Username username = Username.of("alice@domain1");
 
-        emailQueryViewManager.getEmailQueryView(username).save(MAILBOX_ID_1, 
DATE_1, DATE_2, MESSAGE_ID_1, THREAD_ID_1).block();
+        emailQueryViewManager.getEmailQueryView(username).save(MAILBOX_ID_1, 
DATE_2, MESSAGE_ID_1, THREAD_ID_1).block();
 
         
assertThat(emailQueryViewManager.getEmailQueryView(username).listMailboxContentSortedByReceivedAt(MAILBOX_ID_1,
 Limit.limit(1), NO_COLLAPSE_THREAD).collectList().block())
             .isNotEmpty();
@@ -68,7 +67,7 @@ public class PostgresEmailQueryViewManagerRLSTest {
         Username username = Username.of("alice@domain1");
         Username username2 = Username.of("bob@domain2");
 
-        emailQueryViewManager.getEmailQueryView(username).save(MAILBOX_ID_1, 
DATE_1, DATE_2, MESSAGE_ID_1, THREAD_ID_1).block();
+        emailQueryViewManager.getEmailQueryView(username).save(MAILBOX_ID_1, 
DATE_2, MESSAGE_ID_1, THREAD_ID_1).block();
 
         
assertThat(emailQueryViewManager.getEmailQueryView(username2).listMailboxContentSortedByReceivedAt(MAILBOX_ID_1,
 Limit.limit(1), NO_COLLAPSE_THREAD).collectList().block())
             .isEmpty();
diff --git 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java
 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java
index a561b25ed3..d0a1720181 100644
--- 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java
+++ 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java
@@ -34,14 +34,12 @@ public interface EmailQueryView {
     class Entry {
         private final MailboxId mailboxId;
         private final MessageId messageId;
-        private final ZonedDateTime sentAt;
         private final ZonedDateTime receivedAt;
         private final ThreadId threadId;
 
-        public Entry(MailboxId mailboxId, MessageId messageId, ZonedDateTime 
sentAt, ZonedDateTime receivedAt, ThreadId threadId) {
+        public Entry(MailboxId mailboxId, MessageId messageId, ZonedDateTime 
receivedAt, ThreadId threadId) {
             this.mailboxId = mailboxId;
             this.messageId = messageId;
-            this.sentAt = sentAt;
             this.receivedAt = receivedAt;
             this.threadId = threadId;
         }
@@ -54,10 +52,6 @@ public interface EmailQueryView {
             return messageId;
         }
 
-        public ZonedDateTime getSentAt() {
-            return sentAt;
-        }
-
         public ZonedDateTime getReceivedAt() {
             return receivedAt;
         }
@@ -73,7 +67,6 @@ public interface EmailQueryView {
 
                 return Objects.equals(this.mailboxId, entry.mailboxId)
                     && Objects.equals(this.messageId, entry.messageId)
-                    && Objects.equals(this.sentAt, entry.sentAt)
                     && Objects.equals(this.receivedAt, entry.receivedAt)
                     && Objects.equals(this.threadId, entry.threadId);
             }
@@ -82,37 +75,10 @@ public interface EmailQueryView {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(mailboxId, messageId, sentAt, receivedAt, 
threadId);
+            return Objects.hash(mailboxId, messageId, receivedAt, threadId);
         }
     }
 
-    /**
-     *
-     * Sample JMAP requests:
-     *
-     *    - RFC-8621:
-     *
-     *    ["Email/query",
-     *     {
-     *       "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-     *       "filter: {
-     *           "inMailbox":"abcd"
-     *       }
-     *       "sort": [{
-     *         "property":"sentAt",
-     *         "isAscending": false
-     *       }]
-     *     },
-     *     "c1"]
-     *
-     *   - Draft
-     *
-     *   [["getMessageList", {"filter":{"inMailboxes": ["abcd"]}, "sort": 
["date desc"]}, "#0"]]
-     *
-     * @return messageIds of the messages in this mailbox, sorted by sentAt.
-     */
-    Flux<MessageId> listMailboxContentSortedBySentAt(MailboxId mailboxId, 
Limit limit, boolean collapseThreads);
-
     /**
      *
      * Sample JMAP requests:
@@ -182,20 +148,9 @@ public interface EmailQueryView {
      */
     Flux<MessageId> listMailboxContentBeforeSortedByReceivedAt(MailboxId 
mailboxId, ZonedDateTime since, Limit limit, boolean collapseThreads);
 
-    /**
-     *  Sample JMAP requests:
-     *
-     *   - Draft
-     *
-     *   [["getMessageList", {"filter":{"after":"aDate", "inMailboxes": 
["abcd"]}, "sort": ["date desc"]}, "#0"]]
-     *
-     * @return messageIds of the messages in this mailbox, sorted by sentAt, 
since being sentAt
-     */
-    Flux<MessageId> listMailboxContentSinceSentAt(MailboxId mailboxId, 
ZonedDateTime since, Limit limit, boolean collapseThreads);
-
     Mono<Void> delete(MailboxId mailboxId, MessageId messageId);
 
     Mono<Void> delete(MailboxId mailboxId);
 
-    Mono<Void> save(MailboxId mailboxId, ZonedDateTime sentAt, ZonedDateTime 
receivedAt, MessageId messageId, ThreadId threadId);
+    Mono<Void> save(MailboxId mailboxId, ZonedDateTime receivedAt, MessageId 
messageId, ThreadId threadId);
 }
diff --git 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java
 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java
index 88cfdbd002..dd649a4345 100644
--- 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java
+++ 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java
@@ -48,32 +48,9 @@ public class MemoryEmailQueryView implements EmailQueryView {
     }
 
     @Override
-    public Flux<MessageId> listMailboxContentSortedBySentAt(MailboxId 
mailboxId, Limit limit, boolean collapseThreads) {
-        Preconditions.checkArgument(!limit.isUnlimited(), "Limit should be 
defined");
-
-        Flux<Entry> baseEntries = 
Flux.fromIterable(entries.row(mailboxId).values());
-
-        return maybeCollapseThreads(Entry::getSentAt, 
collapseThreads).apply(baseEntries)
-            .sort(Comparator.comparing(Entry::getSentAt).reversed())
-            .map(Entry::getMessageId)
-            .take(limit.getLimit().get());
-    }
-
-    @Override
-    public Flux<MessageId> listMailboxContentSinceSentAt(MailboxId mailboxId, 
ZonedDateTime since, Limit limit, boolean collapseThreads) {
+    public Flux<MessageId> listMailboxContentSortedByReceivedAt(MailboxId 
mailboxId, Limit limit, boolean collapseThreads) {
         Preconditions.checkArgument(!limit.isUnlimited(), "Limit should be 
defined");
 
-        Flux<Entry> baseEntries = 
Flux.fromIterable(entries.row(mailboxId).values())
-            .filter(e -> e.getSentAt().isAfter(since) || 
e.getSentAt().isEqual(since));
-
-        return maybeCollapseThreads(Entry::getSentAt, 
collapseThreads).apply(baseEntries)
-            .sort(Comparator.comparing(Entry::getSentAt).reversed())
-            .map(Entry::getMessageId)
-            .take(limit.getLimit().get());
-    }
-
-    @Override
-    public Flux<MessageId> listMailboxContentSortedByReceivedAt(MailboxId 
mailboxId, Limit limit, boolean collapseThreads) {
         Flux<Entry> baseEntries = 
Flux.fromIterable(entries.row(mailboxId).values());
 
         return maybeCollapseThreads(Entry::getReceivedAt, 
collapseThreads).apply(baseEntries)
@@ -126,7 +103,7 @@ public class MemoryEmailQueryView implements EmailQueryView 
{
     }
 
     @Override
-    public Mono<Void> save(MailboxId mailboxId, ZonedDateTime sentAt, 
ZonedDateTime receivedAt, MessageId messageId, ThreadId threadId) {
-        return Mono.fromRunnable(() -> entries.put(mailboxId, messageId, new 
Entry(mailboxId, messageId, sentAt, receivedAt, threadId)));
+    public Mono<Void> save(MailboxId mailboxId, ZonedDateTime receivedAt, 
MessageId messageId, ThreadId threadId) {
+        return Mono.fromRunnable(() -> entries.put(mailboxId, messageId, new 
Entry(mailboxId, messageId, receivedAt, threadId)));
     }
 }
diff --git 
a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java
 
b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java
index ab62b44170..d7d799daaa 100644
--- 
a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java
+++ 
b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java
@@ -21,7 +21,6 @@ package org.apache.james.jmap.api.projections;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.time.ZonedDateTime;
 
@@ -33,13 +32,11 @@ import org.junit.jupiter.api.Test;
 
 public interface EmailQueryViewContract {
     boolean COLLAPSE_THREAD = true;
-    ZonedDateTime DATE_1 = ZonedDateTime.parse("2010-10-30T15:12:00Z");
     ZonedDateTime DATE_2 = ZonedDateTime.parse("2010-10-30T16:12:00Z");
     ZonedDateTime DATE_3 = ZonedDateTime.parse("2010-10-30T17:12:00Z");
     ZonedDateTime DATE_4 = ZonedDateTime.parse("2010-10-30T18:12:00Z");
     ZonedDateTime DATE_5 = ZonedDateTime.parse("2010-10-30T19:12:00Z");
     ZonedDateTime DATE_6 = ZonedDateTime.parse("2010-10-30T20:12:00Z");
-    ZonedDateTime DATE_7 = ZonedDateTime.parse("2010-10-30T21:12:00Z");
 
     EmailQueryView testee();
 
@@ -54,138 +51,16 @@ public interface EmailQueryViewContract {
     MessageId messageId4();
 
     ThreadId threadId1();
-    
-    ThreadId threadId2();
-    
-    ThreadId threadId3();
-
-    @Test
-    default void listMailboxContentShouldReturnEmptyByDefault() {
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .isEmpty();
-    }
-
-    @Test
-    default void listMailboxContentShouldBeOrderedBySentAt() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId2(), messageId3(), messageId1());
-    }
-
-    @Test
-    default void listMailboxContentShouldApplyLimit() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(2), !COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId2(), messageId3());
-    }
-
-    @Test
-    default void listMailboxContentSinceSentdAtShouldExcludeTooOldItems() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(), 
DATE_2, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId3(), messageId2());
-    }
-
-    @Test
-    default void listMailboxContentSinceSentAtAtShouldApplyLimit() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(), 
DATE_1, Limit.limit(2), !COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId3(), messageId2());
-    }
-
-    @Test
-    default void listMailboxContentSinceSentAtShouldReturnEmptyWhenNoneMatch() 
{
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(), 
DATE_7, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .isEmpty();
-    }
-
-    @Test
-    default void listMailboxContentShouldNotReturnClearedContent() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(), 
threadId1()).block();
-
-        testee().delete(mailboxId1()).block();
-
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .isEmpty();
-    }
-
-    @Test
-    default void listMailboxContentShouldNotReturnDeletedContent() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(), 
threadId1()).block();
-
-        testee().delete(mailboxId1(), messageId2()).block();
-
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId3(), messageId1());
-    }
-
-    @Test
-    default void listMailboxContentSinceSentAtShouldNotReturnClearedContent() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-
-        testee().delete(mailboxId1()).block();
 
-        assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(), 
DATE_4, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .isEmpty();
-    }
-
-    @Test
-    default void saveShouldBeIdempotent() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId1());
-    }
-
-    @Test
-    default void datesCanBeDuplicated() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId2(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .containsExactlyInAnyOrder(messageId1(), messageId2());
-    }
-
-    @Test
-    default void listMailboxContentSinceSentAtShouldNotReturnDeletedContent() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-
-        testee().delete(mailboxId1(), messageId2()).block();
+    ThreadId threadId2();
 
-        assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(), 
DATE_3, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId3());
-    }
+    ThreadId threadId3();
 
     @Test
     default void 
listMailboxContentSortedByReceivedAtShouldBeSortedByReceivedAt() {
-        testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
 
         assertThat(testee().listMailboxContentSortedByReceivedAt(mailboxId1(), 
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId3(), messageId1(), messageId2());
@@ -193,9 +68,9 @@ public interface EmailQueryViewContract {
 
     @Test
     default void 
listMailboxContentSinceSortedByReceivedAtShouldBeSortedByReceivedAt() {
-        testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
 
         
assertThat(testee().listMailboxContentSinceAfterSortedByReceivedAt(mailboxId1(),
 DATE_4, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId3(), messageId1());
@@ -203,9 +78,9 @@ public interface EmailQueryViewContract {
 
     @Test
     default void 
listMailboxContentBeforeSortedByReceivedAtShouldBeSortedByReceivedAt() {
-        testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
 
         
assertThat(testee().listMailboxContentBeforeSortedByReceivedAt(mailboxId1(), 
DATE_4, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId1(), messageId2());
@@ -221,66 +96,11 @@ public interface EmailQueryViewContract {
         assertThatCode(() -> testee().delete(mailboxId1(), 
messageId4()).block()).doesNotThrowAnyException();
     }
 
-    @Test
-    default void listMailboxContentShouldThrowOnUndefinedLimit() {
-        assertThatThrownBy(() -> 
testee().listMailboxContentSortedBySentAt(mailboxId1(), Limit.unlimited(), 
!COLLAPSE_THREAD).blockLast())
-            .isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    default void listMailboxContentSinceSentAtShouldThrowOnUndefinedLimit() {
-        assertThatThrownBy(() -> 
testee().listMailboxContentSinceSentAt(mailboxId1(), DATE_3, Limit.unlimited(), 
!COLLAPSE_THREAD).blockLast())
-            .isInstanceOf(IllegalArgumentException.class);
-    }
-
-
-    @Test
-    default void 
listMailboxContentSortedBySentAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
 {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(12), COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId2());
-    }
-
-    @Test
-    default void 
listMailboxContentSortedBySentAtShouldApplyLimitWithCollapseThreads() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId2()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(), 
threadId3()).block();
-        testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(), 
Limit.limit(2), COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId4(), messageId3());
-    }
-
-    @Test
-    default void 
listMailboxContentSinceSentdAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
 {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(), 
DATE_2, Limit.limit(12), COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId3());
-    }
-
-    @Test
-    default void 
listMailboxContentSinceSentAtShouldApplyLimitWithCollapseThreads() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId2()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId3()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(), 
threadId1()).block();
-
-        assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(), 
DATE_1, Limit.limit(2), COLLAPSE_THREAD).collectList().block())
-            .containsExactly(messageId3(), messageId2());
-    }
-
     @Test
     default void 
listMailboxContentSortedByReceivedAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
 {
-        testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
 
         assertThat(testee().listMailboxContentSortedByReceivedAt(mailboxId1(), 
Limit.limit(12), COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId3());
@@ -288,10 +108,10 @@ public interface EmailQueryViewContract {
 
     @Test
     default void 
listMailboxContentSortedByReceivedAtShouldApplyLimitWithCollapseThreads() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId2()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId3()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_2, messageId1(), threadId2()).block();
+        testee().save(mailboxId1(), DATE_4, messageId2(), threadId3()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_5, messageId4(), threadId1()).block();
 
         assertThat(testee().listMailboxContentSortedByReceivedAt(mailboxId1(), 
Limit.limit(2), COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId3(), messageId2());
@@ -299,9 +119,9 @@ public interface EmailQueryViewContract {
 
     @Test
     default void 
listMailboxContentSinceSortedByReceivedAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
 {
-        testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
 
         
assertThat(testee().listMailboxContentSinceAfterSortedByReceivedAt(mailboxId1(),
 DATE_4, Limit.limit(12), COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId3());
@@ -309,10 +129,10 @@ public interface EmailQueryViewContract {
 
     @Test
     default void 
listMailboxContentSinceSortedByReceivedAtShouldApplyLimitWithCollapseThreads() {
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId2()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId3()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_2, messageId1(), threadId2()).block();
+        testee().save(mailboxId1(), DATE_4, messageId2(), threadId3()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_5, messageId4(), threadId1()).block();
 
         
assertThat(testee().listMailboxContentSinceAfterSortedByReceivedAt(mailboxId1(),
 DATE_4, Limit.limit(2), COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId3(), messageId2());
@@ -320,9 +140,9 @@ public interface EmailQueryViewContract {
 
     @Test
     default void 
listMailboxContentBeforeSortedByReceivedAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
 {
-        testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
 
         
assertThat(testee().listMailboxContentBeforeSortedByReceivedAt(mailboxId1(), 
DATE_4, Limit.limit(12), COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId1());
@@ -330,10 +150,10 @@ public interface EmailQueryViewContract {
 
     @Test
     default void 
listMailboxContentBeforeSortedByReceivedAtShouldApplyLimitWithCollapseThreads() 
{
-        testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(), 
threadId2()).block();
-        testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(), 
threadId1()).block();
-        testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(), 
threadId3()).block();
-        testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(), 
threadId1()).block();
+        testee().save(mailboxId1(), DATE_2, messageId1(), threadId2()).block();
+        testee().save(mailboxId1(), DATE_4, messageId2(), threadId1()).block();
+        testee().save(mailboxId1(), DATE_6, messageId3(), threadId3()).block();
+        testee().save(mailboxId1(), DATE_5, messageId4(), threadId1()).block();
 
         
assertThat(testee().listMailboxContentBeforeSortedByReceivedAt(mailboxId1(), 
DATE_5, Limit.limit(2), COLLAPSE_THREAD).collectList().block())
             .containsExactly(messageId4(), messageId1());
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
 
b/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
index 253b954440..31fa0629a6 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
+++ 
b/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
@@ -22,10 +22,8 @@ package org.apache.james.jmap.event;
 import static jakarta.mail.Flags.Flag.DELETED;
 import static org.apache.james.util.ReactorUtils.publishIfPresent;
 
-import java.io.IOException;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
-import java.util.Date;
 import java.util.Optional;
 
 import jakarta.inject.Inject;
@@ -43,19 +41,12 @@ import org.apache.james.mailbox.events.MailboxEvents.Added;
 import org.apache.james.mailbox.events.MailboxEvents.Expunged;
 import org.apache.james.mailbox.events.MailboxEvents.FlagsUpdated;
 import org.apache.james.mailbox.events.MailboxEvents.MailboxDeletion;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.UpdatedFlags;
-import org.apache.james.mime4j.codec.DecodeMonitor;
-import org.apache.james.mime4j.dom.Header;
-import org.apache.james.mime4j.dom.field.DateTimeField;
-import org.apache.james.mime4j.field.DateTimeFieldLenientImpl;
-import org.apache.james.mime4j.message.DefaultMessageBuilder;
-import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.util.FunctionalUtils;
 import org.reactivestreams.Publisher;
 
@@ -181,23 +172,8 @@ public class PopulateEmailQueryViewListener implements 
ReactiveGroupEventListene
 
     public Mono<Void> handleAdded(MailboxId mailboxId, MessageResult 
messageResult, Username username) {
         ZonedDateTime receivedAt = 
ZonedDateTime.ofInstant(messageResult.getInternalDate().toInstant(), 
ZoneOffset.UTC);
-
-        return Mono.fromCallable(() -> parseMessage(messageResult))
-            .map(header -> 
date(header).orElse(messageResult.getInternalDate()))
-            .map(date -> ZonedDateTime.ofInstant(date.toInstant(), 
ZoneOffset.UTC))
-            .flatMap(sentAt -> 
viewManager.getEmailQueryView(username).save(mailboxId, sentAt, receivedAt, 
messageResult.getMessageId(), messageResult.getThreadId()))
+        return viewManager.getEmailQueryView(username)
+            .save(mailboxId, receivedAt, messageResult.getMessageId(), 
messageResult.getThreadId())
             .then();
     }
-
-    private Header parseMessage(MessageResult messageResult) throws 
IOException, MailboxException {
-        DefaultMessageBuilder defaultMessageBuilder = new 
DefaultMessageBuilder();
-        defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
-        return 
defaultMessageBuilder.parseHeader(messageResult.getFullContent().getInputStream());
-    }
-
-    private Optional<Date> date(Header header) {
-        return Optional.ofNullable(header.getField("Date"))
-            .map(field -> DateTimeFieldLenientImpl.PARSER.parse(field, 
DecodeMonitor.SILENT))
-            .map(DateTimeField::getDate);
-    }
 }
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
index 3b18389198..467e29c72e 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
@@ -93,8 +93,6 @@ class EmailQueryMethod @Inject() (serializer: 
EmailQuerySerializer,
 
   private def executeQuery(session: MailboxSession, request: 
EmailQueryRequest, searchQuery: MultimailboxesSearchQuery, position: Position, 
limit: Limit): SMono[EmailQueryResponse] = {
     val ids: SMono[Seq[MessageId]] = request match {
-      case request: EmailQueryRequest if 
matchesInMailboxSortedBySentAt(request) =>
-        queryViewForListingSortedBySentAt(session, position, limit, request, 
searchQuery.getNamespace)
       case request: EmailQueryRequest if 
matchesInMailboxSortedByReceivedAt(request) =>
         queryViewForListingSortedByReceivedAt(session, position, limit, 
request, searchQuery.getNamespace)
       case request: EmailQueryRequest if 
matchesInMailboxAfterSortedByReceivedAt(request) =>
@@ -132,16 +130,6 @@ class EmailQueryMethod @Inject() (serializer: 
EmailQuerySerializer,
     fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession, 
position, limitToUse, namespace)
   }
 
-  private def queryViewForListingSortedBySentAt(mailboxSession: 
MailboxSession, position: Position, limitToUse: Limit, request: 
EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
-    val mailboxId: MailboxId = 
request.filter.get.asInstanceOf[FilterCondition].inMailbox.get
-    val collapseThreads: Boolean = getCollapseThreads(request)
-
-    val queryViewEntries: SFlux[MessageId] = 
SFlux.fromPublisher(emailQueryViewManager.getEmailQueryView(mailboxSession.getUser)
-      .listMailboxContentSortedBySentAt(mailboxId, 
JavaLimit.from(limitToUse.value + position.value), collapseThreads))
-
-    fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession, 
position, limitToUse, namespace)
-  }
-
   private def queryViewForListingSortedByReceivedAt(mailboxSession: 
MailboxSession, position: Position, limitToUse: Limit, request: 
EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
     val mailboxId: MailboxId = 
request.filter.get.asInstanceOf[FilterCondition].inMailbox.get
     val collapseThreads: Boolean = getCollapseThreads(request)
@@ -165,11 +153,6 @@ class EmailQueryMethod @Inject() (serializer: 
EmailQuerySerializer,
         case e => SMono.error[Seq[MessageId]](e)
       })
 
-  private def matchesInMailboxSortedBySentAt(request: EmailQueryRequest): 
Boolean =
-    configuration.isEmailQueryViewEnabled &&
-      request.filter.exists(_.inMailboxFilterOnly) &&
-      request.sort.contains(Set(Comparator.SENT_AT_DESC))
-
   private def matchesInMailboxSortedByReceivedAt(request: EmailQueryRequest): 
Boolean =
     configuration.isEmailQueryViewEnabled &&
       request.filter.exists(_.inMailboxFilterOnly) &&
diff --git 
a/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java
 
b/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java
index bbe44d03c4..0469938a8c 100644
--- 
a/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java
+++ 
b/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java
@@ -138,7 +138,7 @@ class PopulateEmailQueryViewListenerTest {
                 
.build(emptyMessage(Date.from(ZonedDateTime.parse("2014-10-30T14:12:00Z").toInstant()))),
             mailboxSession).getId();
 
-        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
             .containsOnly(composedId.getMessageId());
     }
 
@@ -151,7 +151,7 @@ class PopulateEmailQueryViewListenerTest {
                 
.build(emptyMessage(Date.from(ZonedDateTime.parse("2014-10-30T14:12:00Z").toInstant()))),
             mailboxSession).getId();
 
-        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
             .isEmpty();
     }
 
@@ -190,7 +190,7 @@ class PopulateEmailQueryViewListenerTest {
 
         Mono.from(queryViewListener.reactiveEvent(addedOutDatedEvent)).block();
 
-        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(outboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(outboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
             .isEmpty();
     }
 
@@ -206,7 +206,7 @@ class PopulateEmailQueryViewListenerTest {
 
         inboxMessageManager.setFlags(new Flags(), 
MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), mailboxSession);
 
-        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
             .containsOnly(composedId.getMessageId());
     }
 
@@ -220,7 +220,7 @@ class PopulateEmailQueryViewListenerTest {
 
         inboxMessageManager.setFlags(new Flags(DELETED), 
MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), mailboxSession);
 
-        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
             .isEmpty();
     }
 
@@ -234,7 +234,7 @@ class PopulateEmailQueryViewListenerTest {
 
         mailboxManager.deleteMailbox(inboxId, mailboxSession);
 
-        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
             .isEmpty();
     }
 
@@ -248,7 +248,7 @@ class PopulateEmailQueryViewListenerTest {
 
         
inboxMessageManager.delete(ImmutableList.of(composedMessageId.getUid()), 
mailboxSession);
 
-        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
 Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
             .isEmpty();
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
 
b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
index 144ca3e362..d8ac749cb0 100644
--- 
a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
+++ 
b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
@@ -22,12 +22,9 @@ package org.apache.james.webadmin.data.jmap;
 import static jakarta.mail.Flags.Flag.DELETED;
 import static 
org.apache.james.mailbox.MailboxManager.MailboxSearchFetchType.Minimal;
 
-import java.io.IOException;
 import java.time.Duration;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
-import java.util.Date;
-import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
 import jakarta.inject.Inject;
@@ -45,9 +42,6 @@ import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.search.MailboxQuery;
-import org.apache.james.mime4j.dom.Message;
-import org.apache.james.mime4j.message.DefaultMessageBuilder;
-import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.task.Task;
 import org.apache.james.task.Task.Result;
 import org.apache.james.user.api.UsersRepository;
@@ -155,14 +149,9 @@ public class EmailQueryViewPopulator {
             MessageId messageId = messageResult.getMessageId();
             ThreadId threadId = messageResult.getThreadId();
             ZonedDateTime receivedAt = 
ZonedDateTime.ofInstant(messageResult.getInternalDate().toInstant(), 
ZoneOffset.UTC);
-            Message mime4JMessage = parseMessage(messageResult);
-            Date sentAtDate = 
Optional.ofNullable(mime4JMessage.getDate()).orElse(messageResult.getInternalDate());
-            ZonedDateTime sentAt = 
ZonedDateTime.ofInstant(sentAtDate.toInstant(), ZoneOffset.UTC);
-            mime4JMessage.dispose();
-
-            return new EmailQueryView.Entry(mailboxId, messageId, sentAt, 
receivedAt, threadId);
+            return new EmailQueryView.Entry(mailboxId, messageId, receivedAt, 
threadId);
         })
-            .flatMap(entry -> emailQueryView.save(entry.getMailboxId(), 
entry.getSentAt(), entry.getReceivedAt(), entry.getMessageId(), 
entry.getThreadId()))
+            .flatMap(entry -> emailQueryView.save(entry.getMailboxId(), 
entry.getReceivedAt(), entry.getMessageId(), entry.getThreadId()))
             .thenReturn(Result.COMPLETED)
             .doOnSuccess(any -> progress.incrementProcessedMessageCount())
             .onErrorResume(e -> {
@@ -196,9 +185,4 @@ public class EmailQueryViewPopulator {
         return 
Flux.from(messageManager.getMessagesReactive(MessageRange.all(), 
FetchGroup.HEADERS, session));
     }
 
-    private Message parseMessage(MessageResult messageResult) throws 
IOException, MailboxException {
-        DefaultMessageBuilder defaultMessageBuilder = new 
DefaultMessageBuilder();
-        defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
-        return 
defaultMessageBuilder.parseMessage(messageResult.getFullContent().getInputStream());
-    }
 }
diff --git 
a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java
 
b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java
index 476e16d152..25e4046410 100644
--- 
a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java
+++ 
b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java
@@ -267,7 +267,7 @@ class PopulateEmailQueryViewRequestToTaskTest {
             .basePath(TasksRoutes.BASE)
             .get(taskId + "/await");
 
-        
assertThat(view.listMailboxContentSortedBySentAt(messageId.getMailboxId(), 
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(view.listMailboxContentSortedByReceivedAt(messageId.getMailboxId(), 
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
             .containsOnly(messageId.getMessageId());
     }
 
@@ -289,7 +289,7 @@ class PopulateEmailQueryViewRequestToTaskTest {
             .basePath(TasksRoutes.BASE)
             .get(taskId + "/await");
 
-        
assertThat(view.listMailboxContentSortedBySentAt(messageId.getMailboxId(), 
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(view.listMailboxContentSortedByReceivedAt(messageId.getMailboxId(), 
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
             .isEmpty();
     }
 
@@ -317,7 +317,7 @@ class PopulateEmailQueryViewRequestToTaskTest {
             .basePath(TasksRoutes.BASE)
             .get(taskId2 + "/await");
 
-        
assertThat(view.listMailboxContentSortedBySentAt(messageId.getMailboxId(), 
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
+        
assertThat(view.listMailboxContentSortedByReceivedAt(messageId.getMailboxId(), 
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
             .containsOnly(messageId.getMessageId());
     }
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to