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

btellier 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 b0905bfbba [ENHACEMENT] Include mailbox storage ids in the audit trail 
upon rece… (#2796)
b0905bfbba is described below

commit b0905bfbba1b10652b4ca307e07d676596f0ba67
Author: Benoit TELLIER <[email protected]>
AuthorDate: Mon Sep 15 17:10:18 2025 +0200

    [ENHACEMENT] Include mailbox storage ids in the audit trail upon rece… 
(#2796)
    
    Co-authored-by: Rene Cordier <[email protected]>
---
 .../james/transport/mailets/delivery/MailDispatcher.java     | 10 ++++++----
 .../apache/james/transport/mailets/delivery/MailStore.java   |  3 ++-
 .../james/transport/mailets/delivery/SimpleMailStore.java    |  6 +++---
 .../james/transport/mailets/delivery/MailDispatcherTest.java | 12 ++++++++----
 4 files changed, 19 insertions(+), 12 deletions(-)

diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailDispatcher.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailDispatcher.java
index e393ec9d56..9d17fefa8c 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailDispatcher.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailDispatcher.java
@@ -32,6 +32,7 @@ import org.apache.james.core.MailAddress;
 import org.apache.james.core.Username;
 import org.apache.james.lifecycle.api.LifecycleUtil;
 import org.apache.james.mailbox.exception.OverQuotaException;
+import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.server.core.MailImpl;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
@@ -192,6 +193,8 @@ public class MailDispatcher {
                                         
.map(Throwing.function(MimeMessage::getMessageID))
                                         .orElse(""),
                                     "sender", mail.getMaybeSender().asString(),
+                                    "mailboxId", 
success.getMailboxId().serialize(),
+                                    "uid", 
Long.toString(success.getUid().asLong()),
                                     "recipient", recipient.asString())))
                                 .log("Local delivered mail.")))
                             .then(Mono.<MailAddress>empty());
@@ -208,11 +211,11 @@ public class MailDispatcher {
             .block();
     }
 
-    private Mono<Void> storeMailWithRetry(Mail mail, MailAddress recipient) {
+    private Mono<ComposedMessageId> storeMailWithRetry(Mail mail, MailAddress 
recipient) {
         Username username = computeUsername(recipient);
         AtomicInteger remainRetries = new AtomicInteger(retries.orElse(0));
 
-        Mono<Void> operation = Mono.from(mailStore.storeMail(recipient, mail))
+        Mono<ComposedMessageId> operation = 
Mono.from(mailStore.storeMail(recipient, mail))
             .doOnError(OverQuotaException.class, e -> LOGGER.info("Could not 
store mail due to quota error for user {}", username.asString()))
             .doOnError(e -> !(e instanceof OverQuotaException), error -> 
LOGGER.warn("Error While storing mail. This error will be retried for {} more 
times.", remainRetries.getAndDecrement(), error));
 
@@ -221,8 +224,7 @@ public class MailDispatcher {
                 .retryWhen(Retry.backoff(count, FIRST_BACKOFF)
                     .maxBackoff(MAX_BACKOFF)
                     .filter(e -> !(e instanceof OverQuotaException))
-                    .scheduler(Schedulers.parallel()))
-                .then())
+                    .scheduler(Schedulers.parallel())))
             .orElse(operation);
     }
 
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java
index 04a42aa9f8..23f890ea07 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java
@@ -20,9 +20,10 @@
 package org.apache.james.transport.mailets.delivery;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.mailet.Mail;
 import org.reactivestreams.Publisher;
 
 public interface MailStore {
-    Publisher<Void> storeMail(MailAddress recipient, Mail mail);
+    Publisher<ComposedMessageId> storeMail(MailAddress recipient, Mail mail);
 }
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java
index dbbfbaa6d6..4448fa917a 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java
@@ -23,6 +23,7 @@ import jakarta.mail.MessagingException;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.Username;
+import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.metrics.api.Metric;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
@@ -91,7 +92,7 @@ public class SimpleMailStore implements MailStore {
     }
 
     @Override
-    public Mono<Void> storeMail(MailAddress recipient, Mail mail) {
+    public Mono<ComposedMessageId> storeMail(MailAddress recipient, Mail mail) 
{
         Username username = computeUsername(recipient);
         StorageDirective storageDirective = 
StorageDirective.fromMail(computeUsername(recipient), mail)
             .withDefaultFolder(folder);
@@ -102,8 +103,7 @@ public class SimpleMailStore implements MailStore {
                     metric.increment();
                     LOGGER.info("Local delivered mail {} with messageId {} 
successfully from {} to {} in folder {} with composedMessageId {}",
                         mail.getName(), getMessageId(mail), 
mail.getMaybeSender().asString(), recipient.asPrettyString(), 
storageDirective.getTargetFolders().get(), ids);
-                })
-                .then();
+                });
         } catch (MessagingException e) {
             throw new RuntimeException("Could not retrieve mail message 
content", e);
         }
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
index 8b86d5f6c8..38f1db722b 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
@@ -38,6 +38,10 @@ import jakarta.mail.MessagingException;
 import org.apache.commons.io.IOUtils;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.memory.MemoryUsersRepository;
 import org.apache.james.util.MimeMessageUtil;
@@ -52,7 +56,6 @@ import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 import org.reactivestreams.Publisher;
 
-import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ArrayListMultimap;
 
 import reactor.core.publisher.Mono;
@@ -514,13 +517,14 @@ class MailDispatcherTest {
         }
 
         @Override
-        public Publisher<Void> storeMail(MailAddress recipient, Mail mail) {
-            return Mono.fromRunnable(Throwing.runnable(() -> {
+        public Publisher<ComposedMessageId> storeMail(MailAddress recipient, 
Mail mail) {
+            return Mono.fromCallable(() -> {
                 String[] header = mail.getMessage().getHeader(headerName);
                 if (header != null) {
                     headerValues.put(recipient, header);
                 }
-            }));
+                return new ComposedMessageId(TestId.of(34), 
TestMessageId.of(4), MessageUid.of(5));
+            });
         }
 
         public Collection<String[]> getHeaderValues(MailAddress recipient) {


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

Reply via email to