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]