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

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

commit 1dd1b147eef439a19f000c345be41c884d1e4882
Author: hung phan <hp...@linagora.com>
AuthorDate: Tue Mar 19 15:53:50 2024 +0700

    JAMES-2586 Create AttachmentIdFactory
---
 .../apache/james/mailbox/AttachmentIdFactory.java  | 28 ++++++++++
 .../mailbox/StringBackedAttachmentIdFactory.java   | 34 +++++++++++++
 .../apache/james/mailbox/model/AttachmentId.java   | 59 ++--------------------
 ...chmentId.java => StringBackedAttachmentId.java} | 18 ++++---
 .../mailbox/model/AttachmentMetadataTest.java      |  6 +--
 .../model/MessageAttachmentMetadataTest.java       | 12 ++---
 ...Test.java => StringBackedAttachmentIdTest.java} | 14 ++---
 .../CassandraMailboxSessionMapperFactory.java      |  3 +-
 .../cassandra/mail/CassandraAttachmentDAOV2.java   |  3 +-
 .../cassandra/mail/CassandraAttachmentMapper.java  |  7 ++-
 .../cassandra/mail/CassandraMessageDAOV3.java      |  4 +-
 .../mail/MessageAttachmentRepresentation.java      | 12 ++---
 .../cassandra/CassandraMailboxManagerTest.java     |  3 +-
 .../cassandra/mail/AttachmentLoaderTest.java       | 12 ++---
 .../mail/CassandraAttachmentDAOV2Test.java         |  8 ++-
 .../MessageAttachmentRepresentationByIdTest.java   | 10 ++--
 .../mailbox/cassandra/mail/utils/GuiceUtils.java   |  5 +-
 .../mailbox/jpa/mail/JPAAttachmentMapper.java      |  5 +-
 .../mailbox/jpa/mail/model/JPAAttachment.java      |  4 +-
 .../model/openjpa/AbstractJPAMailboxMessage.java   |  6 +--
 .../inmemory/mail/InMemoryAttachmentMapper.java    |  3 +-
 .../OpenSearchListeningMessageSearchIndexTest.java |  4 +-
 .../opensearch/json/IndexableMessageTest.java      |  5 +-
 .../james/vault/DeletedMessageConverterTest.java   |  4 +-
 .../mailbox/store/StoreAttachmentManagerTest.java  |  4 +-
 .../store/mail/model/AttachmentMapperTest.java     | 15 +++---
 .../mail/model/impl/SimpleMailboxMessageTest.java  |  4 +-
 .../modules/mailbox/CassandraMailboxModule.java    |  3 ++
 .../james/modules/mailbox/JPAMailboxModule.java    |  3 ++
 .../james/modules/mailbox/MemoryMailboxModule.java |  3 ++
 .../methods/integration/SetMessagesMethodTest.java |  6 +--
 .../james/jmap/draft/methods/BlobManagerImpl.java  | 10 ++--
 .../org/apache/james/jmap/draft/model/BlobId.java  |  4 --
 .../jmap/draft/methods/BlobManagerImplTest.java    |  7 +--
 .../draft/methods/MIMEMessageConverterTest.java    | 34 ++++++-------
 .../message/view/MessageFastViewFactoryTest.java   |  3 +-
 .../message/view/MessageFullViewFactoryTest.java   |  8 +--
 .../message/view/MessageHeaderViewFactoryTest.java |  4 +-
 .../view/MessageMetadataViewFactoryTest.java       |  4 +-
 ...mputeMessageFastViewProjectionListenerTest.java |  4 +-
 .../apache/james/jmap/routes/DownloadRoutes.scala  |  8 +--
 41 files changed, 214 insertions(+), 179 deletions(-)

diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentIdFactory.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentIdFactory.java
new file mode 100644
index 0000000000..97749e4663
--- /dev/null
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentIdFactory.java
@@ -0,0 +1,28 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox;
+
+import org.apache.james.mailbox.model.AttachmentId;
+
+public interface AttachmentIdFactory {
+    AttachmentId random();
+
+    AttachmentId from(String id);
+}
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/StringBackedAttachmentIdFactory.java
 
b/mailbox/api/src/main/java/org/apache/james/mailbox/StringBackedAttachmentIdFactory.java
new file mode 100644
index 0000000000..e7cff8ad48
--- /dev/null
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/StringBackedAttachmentIdFactory.java
@@ -0,0 +1,34 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox;
+
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
+
+public class StringBackedAttachmentIdFactory implements AttachmentIdFactory {
+    @Override
+    public StringBackedAttachmentId random() {
+        return StringBackedAttachmentId.random();
+    }
+
+    @Override
+    public StringBackedAttachmentId from(String id) {
+        return StringBackedAttachmentId.from(id);
+    }
+}
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
index e7950a3120..4cf32d93d4 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
@@ -16,64 +16,13 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
+
 package org.apache.james.mailbox.model;
 
-import java.nio.charset.StandardCharsets;
 import java.util.UUID;
 
-import org.apache.commons.text.RandomStringGenerator;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
-
-public class AttachmentId {
-
-    public static final RandomStringGenerator RANDOM_STRING_GENERATOR = new 
RandomStringGenerator.Builder().withinRange('a', 'z').build();
-
-    public static AttachmentId random() {
-        return new AttachmentId(RANDOM_STRING_GENERATOR.generate(20));
-    }
-
-    public static AttachmentId from(String id) {
-        Preconditions.checkNotNull(id);
-        Preconditions.checkArgument(!id.isEmpty());
-        return new AttachmentId(id);
-    }
-
-    private final String id;
-
-    private AttachmentId(String id) {
-        this.id = id;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public UUID asUUID() {
-        return UUID.nameUUIDFromBytes(id.getBytes(StandardCharsets.UTF_8));
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof AttachmentId) {
-            AttachmentId other = (AttachmentId) obj;
-            return Objects.equal(id, other.id);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(id);
-    }
+public interface AttachmentId {
+    String getId();
 
-    @Override
-    public String toString() {
-        return MoreObjects
-                .toStringHelper(this)
-                .add("id", id)
-                .toString();
-    }
+    UUID asUUID();
 }
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/StringBackedAttachmentId.java
similarity index 81%
copy from 
mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
copy to 
mailbox/api/src/main/java/org/apache/james/mailbox/model/StringBackedAttachmentId.java
index e7950a3120..1b204253ff 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/StringBackedAttachmentId.java
@@ -27,38 +27,40 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
-public class AttachmentId {
+public class StringBackedAttachmentId implements AttachmentId {
 
     public static final RandomStringGenerator RANDOM_STRING_GENERATOR = new 
RandomStringGenerator.Builder().withinRange('a', 'z').build();
 
-    public static AttachmentId random() {
-        return new AttachmentId(RANDOM_STRING_GENERATOR.generate(20));
+    public static StringBackedAttachmentId random() {
+        return new 
StringBackedAttachmentId(RANDOM_STRING_GENERATOR.generate(20));
     }
 
-    public static AttachmentId from(String id) {
+    public static StringBackedAttachmentId from(String id) {
         Preconditions.checkNotNull(id);
         Preconditions.checkArgument(!id.isEmpty());
-        return new AttachmentId(id);
+        return new StringBackedAttachmentId(id);
     }
 
     private final String id;
 
-    private AttachmentId(String id) {
+    protected StringBackedAttachmentId(String id) {
         this.id = id;
     }
 
+    @Override
     public String getId() {
         return id;
     }
 
+    @Override
     public UUID asUUID() {
         return UUID.nameUUIDFromBytes(id.getBytes(StandardCharsets.UTF_8));
     }
 
     @Override
     public boolean equals(Object obj) {
-        if (obj instanceof AttachmentId) {
-            AttachmentId other = (AttachmentId) obj;
+        if (obj instanceof StringBackedAttachmentId) {
+            StringBackedAttachmentId other = (StringBackedAttachmentId) obj;
             return Objects.equal(id, other.id);
         }
         return false;
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java
index f75bc1bdb2..67911aced6 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java
@@ -56,7 +56,7 @@ class AttachmentMetadataTest {
     @Test
     void buildShouldThrowWhenSizeIsNotProvided() {
         assertThatThrownBy(() -> AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.random())
+                .attachmentId(StringBackedAttachmentId.random())
                 .type("TYPE")
                 .build())
             .isInstanceOf(IllegalStateException.class);
@@ -65,7 +65,7 @@ class AttachmentMetadataTest {
     @Test
     void buildShouldThrowWhenTypeIsNotProvided() {
         assertThatThrownBy(() -> AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.random())
+                .attachmentId(StringBackedAttachmentId.random())
                 .size(36)
                 .build())
             .isInstanceOf(IllegalStateException.class);
@@ -74,7 +74,7 @@ class AttachmentMetadataTest {
     @Test
     void sizeShouldThrowOnNegativeValue() {
         assertThatThrownBy(() -> AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.random())
+                .attachmentId(StringBackedAttachmentId.random())
                 .size(-3))
             .isInstanceOf(IllegalArgumentException.class);
     }
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java
index a6790b5756..a01490b1ab 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java
@@ -45,7 +45,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void buildShouldWorkWhenMandatoryAttributesAreGiven() {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -62,7 +62,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void buildShouldAcceptIsInlineAndNoCid() {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -79,7 +79,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void buildShouldSetAttributesWhenAllAreGiven() {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -99,7 +99,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void isInlinedWithCidShouldReturnTrueWhenIsInlineAndHasCid() throws 
Exception {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -118,7 +118,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void isInlinedWithCidShouldReturnFalseWhenIsNotInline() throws Exception {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -137,7 +137,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void isInlinedWithCidShouldReturnFalseWhenIsInlineButNoCid() throws 
Exception {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentIdTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/StringBackedAttachmentIdTest.java
similarity index 77%
rename from 
mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentIdTest.java
rename to 
mailbox/api/src/test/java/org/apache/james/mailbox/model/StringBackedAttachmentIdTest.java
index 2388447b2c..7b007613c5 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentIdTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/StringBackedAttachmentIdTest.java
@@ -26,35 +26,35 @@ import java.util.UUID;
 
 import org.junit.jupiter.api.Test;
 
-class AttachmentIdTest {
+class StringBackedAttachmentIdTest {
     @Test
     void randomShouldGenerateDifferentIds() {
-        AttachmentId attachmentId = AttachmentId.random();
-        AttachmentId attachmentId2 = AttachmentId.random();
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.random();
+        StringBackedAttachmentId attachmentId2 = 
StringBackedAttachmentId.random();
         assertThat(attachmentId.getId()).isNotEqualTo(attachmentId2.getId());
     }
 
     @Test
     void fromShouldThrowWhenIdIsNull() {
         String value = null;
-        assertThatThrownBy(() -> 
AttachmentId.from(value)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> 
StringBackedAttachmentId.from(value)).isInstanceOf(NullPointerException.class);
     }
 
     @Test
     void fromShouldThrowWhenIdIsEmpty() {
-        assertThatThrownBy(() -> 
AttachmentId.from("")).isInstanceOf(IllegalArgumentException.class);
+        assertThatThrownBy(() -> 
StringBackedAttachmentId.from("")).isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     void fromStringShouldWork() {
         String expectedId = "f07e5a815613c5abeddc4b682247a4c42d8a95df";
-        AttachmentId attachmentId = AttachmentId.from(expectedId);
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from(expectedId);
         assertThat(attachmentId.getId()).isEqualTo(expectedId);
     }
 
     @Test
     void asUUIDShouldReturnAValidUUID() {
-        AttachmentId attachmentId = AttachmentId.from("magic");
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from("magic");
 
         assertThat(attachmentId.asUUID())
             
.isEqualTo(UUID.fromString("2f3a4fcc-ca64-36e3-9bcf-33e92dd93135"));
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index 585b640825..f2c3b7b85b 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import 
org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.cassandra.mail.ACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
@@ -131,7 +132,7 @@ public class CassandraMailboxSessionMapperFactory extends 
MailboxSessionMapperFa
             deletedMessageDAO);
         this.cassandraMailboxMapper = new CassandraMailboxMapper(mailboxDAO, 
mailboxPathV3DAO, userMailboxRightsDAO, aclMapper, cassandraConfiguration);
         this.cassandraSubscriptionMapper = new 
CassandraSubscriptionMapper(session);
-        this.cassandraAttachmentMapper = new 
CassandraAttachmentMapper(attachmentDAOV2, blobStore);
+        this.cassandraAttachmentMapper = new 
CassandraAttachmentMapper(attachmentDAOV2, blobStore, new 
StringBackedAttachmentIdFactory());
         this.cassandraMessageMapper = new CassandraMessageMapper(
             uidProvider,
             modSeqProvider,
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
index c5e926e4a5..7adaa752db 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
@@ -44,6 +44,7 @@ import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ContentType;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
@@ -132,7 +133,7 @@ public class CassandraAttachmentDAOV2 {
 
         return new DAOAttachment(
             messageId,
-            AttachmentId.from(row.getString(ID)),
+            StringBackedAttachmentId.from(row.getString(ID)),
             blobIfFactory.from(row.getString(BLOB_ID)),
             ContentType.of(row.getString(TYPE)),
             row.getLong(SIZE));
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
index c78947bf02..4e7c99d5f1 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
@@ -31,6 +31,7 @@ import java.util.List;
 import javax.inject.Inject;
 
 import org.apache.james.blob.api.BlobStore;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.model.AttachmentId;
@@ -55,11 +56,13 @@ public class CassandraAttachmentMapper implements 
AttachmentMapper {
 
     private final CassandraAttachmentDAOV2 attachmentDAOV2;
     private final BlobStore blobStore;
+    private final AttachmentIdFactory attachmentIdFactory;
 
     @Inject
-    public CassandraAttachmentMapper(CassandraAttachmentDAOV2 attachmentDAOV2, 
BlobStore blobStore) {
+    public CassandraAttachmentMapper(CassandraAttachmentDAOV2 attachmentDAOV2, 
BlobStore blobStore, AttachmentIdFactory attachmentIdFactory) {
         this.attachmentDAOV2 = attachmentDAOV2;
         this.blobStore = blobStore;
+        this.attachmentIdFactory = attachmentIdFactory;
     }
 
     @Override
@@ -127,7 +130,7 @@ public class CassandraAttachmentMapper implements 
AttachmentMapper {
 
     private Mono<MessageAttachmentMetadata> 
storeAttachmentAsync(ParsedAttachment parsedAttachment, MessageId 
ownerMessageId) {
         try {
-            AttachmentId attachmentId = AttachmentId.random();
+            AttachmentId attachmentId = attachmentIdFactory.random();
             ByteSource content = parsedAttachment.getContent();
             long size = content.size();
             return Mono.from(blobStore.save(blobStore.getDefaultBucketName(), 
content, LOW_COST))
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
index fe45b058e8..91f38b9fc7 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
@@ -70,13 +70,13 @@ import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import 
org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.Attachments;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.Content;
 import org.apache.james.mailbox.model.HeaderAndBodyByteContent;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.Properties;
@@ -380,7 +380,7 @@ public class CassandraMessageDAOV3 {
 
     private MessageAttachmentRepresentation messageAttachmentByIdFrom(UdtValue 
udtValue) {
         return MessageAttachmentRepresentation.builder()
-            .attachmentId(AttachmentId.from(udtValue.get(Attachments.ID, 
TypeCodecs.TEXT)))
+            
.attachmentId(StringBackedAttachmentId.from(udtValue.get(Attachments.ID, 
TypeCodecs.TEXT)))
             .name(udtValue.get(Attachments.NAME, TypeCodecs.TEXT))
             .cid(cidParser.parse(udtValue.get(Attachments.CID, 
TypeCodecs.TEXT)))
             .isInline(udtValue.getBoolean(Attachments.IS_INLINE))
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java
index 838ac5609b..b06703d40d 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java
@@ -21,8 +21,8 @@ package org.apache.james.mailbox.cassandra.mail;
 
 import java.util.Optional;
 
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
@@ -37,7 +37,7 @@ public class MessageAttachmentRepresentation {
 
     public static class Builder {
 
-        private AttachmentId attachmentId;
+        private StringBackedAttachmentId attachmentId;
         private Optional<String> name;
         private Optional<Cid> cid;
         private Optional<Boolean> isInline;
@@ -48,7 +48,7 @@ public class MessageAttachmentRepresentation {
             isInline = Optional.empty();
         }
 
-        public Builder attachmentId(AttachmentId attachmentId) {
+        public Builder attachmentId(StringBackedAttachmentId attachmentId) {
             Preconditions.checkArgument(attachmentId != null);
             this.attachmentId = attachmentId;
             return this;
@@ -83,20 +83,20 @@ public class MessageAttachmentRepresentation {
         }
     }
 
-    private final AttachmentId attachmentId;
+    private final StringBackedAttachmentId attachmentId;
     private final Optional<String> name;
     private final Optional<Cid> cid;
     private final boolean isInline;
 
     @VisibleForTesting
-    MessageAttachmentRepresentation(AttachmentId attachmentId, 
Optional<String> name, Optional<Cid> cid, boolean isInline) {
+    MessageAttachmentRepresentation(StringBackedAttachmentId attachmentId, 
Optional<String> name, Optional<Cid> cid, boolean isInline) {
         this.attachmentId = attachmentId;
         this.name = name;
         this.cid = cid;
         this.isInline = isInline;
     }
 
-    public AttachmentId getAttachmentId() {
+    public StringBackedAttachmentId getAttachmentId() {
         return attachmentId;
     }
 
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index a9279c4489..81d18b7ad9 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -33,8 +33,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.IntStream;
 
-import jakarta.mail.Flags;
-
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
@@ -103,6 +101,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
 
+import jakarta.mail.Flags;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
index b122a0df85..7d15c11ac8 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
@@ -26,10 +26,10 @@ import java.util.Collection;
 import java.util.Optional;
 
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -51,7 +51,7 @@ class AttachmentLoaderTest {
 
     @Test
     void getAttachmentsShouldWorkWithDuplicatedAttachments() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from("1");
 
         AttachmentMetadata attachment = AttachmentMetadata.builder()
             .attachmentId(attachmentId)
@@ -78,7 +78,7 @@ class AttachmentLoaderTest {
 
     @Test
     void getAttachmentsShouldWorkWithDuplicatedIds() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from("1");
 
         AttachmentMetadata attachment = AttachmentMetadata.builder()
             .attachmentId(attachmentId)
@@ -107,8 +107,8 @@ class AttachmentLoaderTest {
 
     @Test
     void 
getAttachmentsShouldReturnMultipleAttachmentWhenSeveralAttachmentsRepresentation()
 {
-        AttachmentId attachmentId1 = AttachmentId.from("1");
-        AttachmentId attachmentId2 = AttachmentId.from("2");
+        StringBackedAttachmentId attachmentId1 = 
StringBackedAttachmentId.from("1");
+        StringBackedAttachmentId attachmentId2 = 
StringBackedAttachmentId.from("2");
 
         AttachmentMetadata attachment1 = AttachmentMetadata.builder()
             .attachmentId(attachmentId1)
@@ -145,7 +145,7 @@ class AttachmentLoaderTest {
 
     @Test
     void getAttachmentsShouldReturnEmptyByDefault() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from("1");
 
         AttachmentMetadata attachment = AttachmentMetadata.builder()
             .attachmentId(attachmentId)
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
index 4833582bb0..f5e9d6cb8f 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
@@ -31,19 +31,17 @@ import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.datastax.oss.driver.api.core.uuid.Uuids;
 
-import reactor.core.publisher.Mono;
-
 class CassandraAttachmentDAOV2Test {
-    private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
-    private static final AttachmentId ATTACHMENT_ID_2 = 
AttachmentId.from("id2");
+    private static final StringBackedAttachmentId ATTACHMENT_ID = 
StringBackedAttachmentId.from("id1");
+    private static final StringBackedAttachmentId ATTACHMENT_ID_2 = 
StringBackedAttachmentId.from("id2");
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new 
HashBlobId.Factory();
 
     @RegisterExtension
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
index 254fc84ad4..d2c7a35c0f 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
@@ -24,9 +24,9 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
 
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.junit.jupiter.api.Test;
 
 
@@ -46,7 +46,7 @@ class MessageAttachmentRepresentationByIdTest {
 
     @Test
     void buildShouldWorkWhenMandatoryAttributesAreGiven() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from("1");
         MessageAttachmentRepresentation 
expectedMessageAttachmentRepresentation = new 
MessageAttachmentRepresentation(attachmentId, Optional.empty(), 
Optional.empty(), false);
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = 
MessageAttachmentRepresentation.builder()
@@ -58,7 +58,7 @@ class MessageAttachmentRepresentationByIdTest {
 
     @Test
     void buildShouldSetIsInlineDefaultValueWhenNotGiven() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from("1");
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = 
MessageAttachmentRepresentation.builder()
             .attachmentId(attachmentId)
@@ -69,7 +69,7 @@ class MessageAttachmentRepresentationByIdTest {
 
     @Test
     void buildShouldAcceptInlineAndWithoutCid() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from("1");
         MessageAttachmentRepresentation 
expectedMessageAttachmentRepresentation = new 
MessageAttachmentRepresentation(attachmentId, Optional.empty(), 
Optional.empty(), true);
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = 
MessageAttachmentRepresentation.builder()
@@ -82,7 +82,7 @@ class MessageAttachmentRepresentationByIdTest {
 
     @Test
     void buildShouldSetAttributesWhenAllAreGiven() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = 
StringBackedAttachmentId.from("1");
         MessageAttachmentRepresentation 
expectedMessageAttachmentRepresentation = new 
MessageAttachmentRepresentation(attachmentId, Optional.of("name"), 
Optional.of(Cid.from("cid")), true);
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = 
MessageAttachmentRepresentation.builder()
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java
index 4d4a09b192..b26d0ebdf0 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java
@@ -37,6 +37,8 @@ import org.apache.james.eventsourcing.eventstore.dto.EventDTO;
 import org.apache.james.eventsourcing.eventstore.dto.EventDTOModule;
 import org.apache.james.json.DTO;
 import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.AttachmentIdFactory;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.ACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
@@ -96,6 +98,7 @@ public class GuiceUtils {
             binder -> 
binder.bind(EventStore.class).to(CassandraEventStore.class),
             binder -> 
binder.bind(CassandraTypesProvider.class).toInstance(typesProvider),
             binder -> 
binder.bind(CassandraConfiguration.class).toInstance(configuration),
-            binder -> binder.bind(Clock.class).toInstance(Clock.systemUTC()));
+            binder -> binder.bind(Clock.class).toInstance(Clock.systemUTC()),
+            binder -> 
binder.bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class));
     }
 }
diff --git 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java
 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java
index a2bff6a77e..41d4f84e4b 100644
--- 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java
+++ 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 
 import com.github.fge.lambdas.Throwing;
@@ -108,9 +109,9 @@ public class JPAAttachmentMapper extends 
JPATransactionalMapper implements Attac
         try {
             try (InputStream stream = 
parsedAttachment.getContent().openStream()) {
                 byte[] bytes = IOUtils.toByteArray(stream);
-                JPAAttachment persistedAttachment = new 
JPAAttachment(parsedAttachment.asMessageAttachment(AttachmentId.random(), 
ownerMessageId), bytes);
+                JPAAttachment persistedAttachment = new 
JPAAttachment(parsedAttachment.asMessageAttachment(StringBackedAttachmentId.random(),
 ownerMessageId), bytes);
                 getEntityManager().persist(persistedAttachment);
-                AttachmentId attachmentId = 
AttachmentId.from(persistedAttachment.getAttachmentId());
+                AttachmentId attachmentId = 
StringBackedAttachmentId.from(persistedAttachment.getAttachmentId());
                 return parsedAttachment.asMessageAttachment(attachmentId, 
bytes.length, ownerMessageId);
             }
         } catch (IOException e) {
diff --git 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java
 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java
index 60e3e9ad4b..272f386bac 100644
--- 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java
+++ 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java
@@ -35,10 +35,10 @@ import javax.persistence.Lob;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 
 @Entity(name = "Attachment")
@@ -102,7 +102,7 @@ public class JPAAttachment {
 
     public AttachmentMetadata toAttachmentMetadata() {
         return AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from(attachmentId))
+            .attachmentId(StringBackedAttachmentId.from(attachmentId))
             .messageId(new DefaultMessageId())
             .type(type)
             .size(size)
diff --git 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index fac5ffc4b3..933ad1c998 100644
--- 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -50,12 +50,12 @@ import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
 import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
@@ -574,7 +574,7 @@ public abstract class AbstractJPAMailboxMessage implements 
MailboxMessage {
         }
     }
 
-    private AttachmentId generateFixedAttachmentId(int position) {
-        return AttachmentId.from(getMailboxId().serialize() + "-" + 
getUid().asLong() + "-" + position);
+    private StringBackedAttachmentId generateFixedAttachmentId(int position) {
+        return StringBackedAttachmentId.from(getMailboxId().serialize() + "-" 
+ getUid().asLong() + "-" + position);
     }
 }
diff --git 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
index a8e77f000c..433b5324dd 100644
--- 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
+++ 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 
 import com.github.fge.lambdas.Throwing;
@@ -88,7 +89,7 @@ public class InMemoryAttachmentMapper implements 
AttachmentMapper {
     }
 
     private MessageAttachmentMetadata storeAttachmentForMessage(MessageId 
ownerMessageId, ParsedAttachment parsedAttachment) throws MailboxException {
-        AttachmentId attachmentId = AttachmentId.random();
+        AttachmentId attachmentId = StringBackedAttachmentId.random();
         try {
             try (InputStream stream = 
parsedAttachment.getContent().openStream()) {
                 byte[] bytes = IOUtils.toByteArray(stream);
diff --git 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java
 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java
index 0bdd95383b..497fc158d6 100644
--- 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java
+++ 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java
@@ -55,7 +55,6 @@ import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.manager.ManagerTestProvisionner;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.ContentType;
@@ -65,6 +64,7 @@ import 
org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.model.ThreadId;
@@ -153,7 +153,7 @@ class OpenSearchListeningMessageSearchIndexTest {
     static final MessageAttachmentMetadata MESSAGE_ATTACHMENT = 
MessageAttachmentMetadata.builder()
         .attachment(AttachmentMetadata.builder()
             .messageId(MESSAGE_ID_3)
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .type("type")
             .size(523)
             .build())
diff --git 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java
 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java
index 08e6258aff..a04f181073 100644
--- 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java
+++ 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java
@@ -37,10 +37,10 @@ import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.extractor.ParsedContent;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.opensearch.IndexAttachments;
@@ -57,7 +57,6 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 
 import reactor.core.publisher.Mono;
 
@@ -100,7 +99,7 @@ class IndexableMessageTest {
             .thenReturn(ImmutableList.of(MessageAttachmentMetadata.builder()
                 .attachment(AttachmentMetadata.builder()
                     .messageId(messageId)
-                    .attachmentId(AttachmentId.from("1"))
+                    .attachmentId(StringBackedAttachmentId.from("1"))
                     .type("text/plain")
                     .size(36)
                     .build())
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
index 3274de962f..41af292c2e 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
@@ -41,10 +41,10 @@ import java.util.List;
 
 import org.apache.james.core.MaybeSender;
 import org.apache.james.core.Username;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.MessageBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
@@ -73,7 +73,7 @@ class DeletedMessageConverterTest {
     private static final Collection<MessageAttachmentMetadata> NO_ATTACHMENT = 
ImmutableList.of();
     private static final Collection<MessageAttachmentMetadata> ATTACHMENTS = 
ImmutableList.of(MessageAttachmentMetadata.builder()
         .attachment(AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .messageId(DeletedMessageFixture.MESSAGE_ID)
             .type("type")
             .size(48)
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java
index 8677f9cf34..45f14f5742 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java
@@ -27,9 +27,9 @@ import static org.mockito.Mockito.when;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
@@ -42,7 +42,7 @@ import com.google.common.collect.ImmutableSet;
 class StoreAttachmentManagerTest {
     static final TestMessageId MESSAGE_ID = TestMessageId.of(1L);
     static final ImmutableList<MessageId> MESSAGE_IDS = 
ImmutableList.of(MESSAGE_ID);
-    static final AttachmentId ATTACHMENT_ID = AttachmentId.from("1");
+    static final StringBackedAttachmentId ATTACHMENT_ID = 
StringBackedAttachmentId.from("1");
     static final AttachmentMetadata ATTACHMENT = AttachmentMetadata.builder()
         .attachmentId(ATTACHMENT_ID)
         .messageId(MESSAGE_ID)
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
index a866a2e516..4adafca733 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
@@ -19,31 +19,30 @@
 
 package org.apache.james.mailbox.store.mail.model;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
 import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ContentType;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.io.ByteSource;
-
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.ByteSource;
 
 public abstract class AttachmentMapperTest {
-    private static final AttachmentId UNKNOWN_ATTACHMENT_ID = 
AttachmentId.from("unknown");
+    private static final StringBackedAttachmentId UNKNOWN_ATTACHMENT_ID = 
StringBackedAttachmentId.from("unknown");
     private static final Username OWNER = Username.of("owner");
     private static final Username ADDITIONAL_OWNER = 
Username.of("additionalOwner");
 
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
index d6518c14f0..eb57fbb69b 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
@@ -37,11 +37,11 @@ import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.model.ThreadId;
@@ -190,7 +190,7 @@ class SimpleMailboxMessageTest {
         MessageUid uid = MessageUid.of(45);
         MessageAttachmentMetadata messageAttachment = 
MessageAttachmentMetadata.builder()
             .attachment(AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.from("1"))
+                .attachmentId(StringBackedAttachmentId.from("1"))
                 .messageId(MESSAGE_ID)
                 .type("type")
                 .size(485)
diff --git 
a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
 
b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index ef018149f7..6a04edc670 100644
--- 
a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ 
b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -52,6 +52,7 @@ import 
org.apache.james.jmap.cassandra.change.CassandraStateFactory;
 import org.apache.james.jmap.cassandra.change.EmailChangeRepositoryDAO;
 import org.apache.james.jmap.cassandra.change.MailboxChangeRepositoryDAO;
 import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.MailboxManager;
@@ -59,6 +60,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
@@ -184,6 +186,7 @@ public class CassandraMailboxModule extends AbstractModule {
 
         
bind(MessageMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         
bind(MailboxMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
+        
bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class);
         
bind(AttachmentMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         
bind(MailboxSessionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         
bind(SubscriptionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
diff --git 
a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
 
b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
index 230c13e4a3..594d15e4cf 100644
--- 
a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
+++ 
b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
@@ -30,11 +30,13 @@ import 
org.apache.james.adapter.mailbox.UserRepositoryAuthenticator;
 import org.apache.james.adapter.mailbox.UserRepositoryAuthorizator;
 import org.apache.james.events.EventListener;
 import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.Authorizator;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
@@ -116,6 +118,7 @@ public class JPAMailboxModule extends AbstractModule {
         bind(Authorizator.class).to(UserRepositoryAuthorizator.class);
         bind(MailboxId.Factory.class).to(JPAId.Factory.class);
         bind(MailboxACLResolver.class).to(UnionMailboxACLResolver.class);
+        
bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class);
         
bind(AttachmentContentLoader.class).to(JPAAttachmentContentLoader.class);
 
         bind(ReIndexer.class).to(ReIndexerImpl.class);
diff --git 
a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
 
b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
index 922f1a8454..6278e704fe 100644
--- 
a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
+++ 
b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
@@ -37,6 +37,7 @@ import org.apache.james.jmap.api.change.State;
 import org.apache.james.jmap.memory.change.MemoryEmailChangeRepository;
 import org.apache.james.jmap.memory.change.MemoryMailboxChangeRepository;
 import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.Authorizator;
@@ -45,6 +46,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryId;
@@ -100,6 +102,7 @@ public class MemoryMailboxModule extends AbstractModule {
 
         
bind(MessageMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
         
bind(MailboxMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
+        
bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class);
         
bind(AttachmentMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
         
bind(MailboxSessionMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
         bind(ModSeqProvider.class).to(InMemoryModSeqProvider.class);
diff --git 
a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
 
b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
index fd2cf26d7f..1411b61f38 100644
--- 
a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
+++ 
b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
@@ -93,7 +93,6 @@ import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.Role;
 import org.apache.james.mailbox.events.MailboxEvents.Added;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -103,6 +102,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.probe.ACLProbe;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.mailbox.probe.QuotaProbe;
@@ -4419,7 +4419,7 @@ public abstract class SetMessagesMethodTest {
 
         return AttachmentMetadata.builder()
             .messageId(new DefaultMessageId())
-            .attachmentId(AttachmentId.from(json.getString("blobId")))
+            
.attachmentId(StringBackedAttachmentId.from(json.getString("blobId")))
             .size(json.getLong("size"))
             .type(json.getString("type"))
             .build();
@@ -4438,7 +4438,7 @@ public abstract class SetMessagesMethodTest {
 
         return AttachmentMetadata.builder()
             .messageId(new DefaultMessageId())
-            .attachmentId(AttachmentId.from(json.getString("blobId")))
+            
.attachmentId(StringBackedAttachmentId.from(json.getString("blobId")))
             .size(json.getLong("size"))
             .type(json.getString("type"))
             .build();
diff --git 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java
 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java
index 5d7211d4b5..7f714d1fe5 100644
--- 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java
+++ 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java
@@ -34,6 +34,7 @@ import org.apache.james.jmap.api.upload.UploadRepository;
 import org.apache.james.jmap.draft.exceptions.BlobNotFoundException;
 import org.apache.james.jmap.draft.model.Blob;
 import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
@@ -65,14 +66,17 @@ public class BlobManagerImpl implements BlobManager {
     private final MessageIdManager messageIdManager;
     private final MessageId.Factory messageIdFactory;
     private final UploadRepository uploadRepository;
+    private final AttachmentIdFactory attachmentIdFactory;
 
     @Inject
     public BlobManagerImpl(AttachmentManager attachmentManager, 
MessageIdManager messageIdManager,
-                           MessageId.Factory messageIdFactory, 
UploadRepository uploadRepository) {
+                           MessageId.Factory messageIdFactory, 
UploadRepository uploadRepository,
+                           AttachmentIdFactory attachmentIdFactory) {
         this.attachmentManager = attachmentManager;
         this.messageIdManager = messageIdManager;
         this.messageIdFactory = messageIdFactory;
         this.uploadRepository = uploadRepository;
+        this.attachmentIdFactory = attachmentIdFactory;
     }
 
     @Override
@@ -88,7 +92,7 @@ public class BlobManagerImpl implements BlobManager {
 
 
         List<AttachmentId> notEncodingUploadsAsAttachmentIds = 
notEncodingUploads.stream()
-            .map(BlobId::asAttachmentId)
+            .map(blobId -> attachmentIdFactory.from(blobId.getRawValue()))
             .collect(ImmutableList.toImmutableList());
 
         Flux<Blob> attachmentOrMessage = Mono.fromCallable(() -> 
attachmentManager.getAttachments(notEncodingUploadsAsAttachmentIds, session))
@@ -145,7 +149,7 @@ public class BlobManagerImpl implements BlobManager {
 
     private Optional<Blob> getBlobFromAttachment(BlobId blobId, MailboxSession 
mailboxSession) throws MailboxException {
         try {
-            AttachmentId attachmentId = blobId.asAttachmentId();
+            AttachmentId attachmentId = 
attachmentIdFactory.from(blobId.getRawValue());
             AttachmentMetadata attachment = 
attachmentManager.getAttachment(attachmentId, mailboxSession);
 
             return Optional.of(loadAttachmentContent(attachment, 
mailboxSession));
diff --git 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java
 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java
index 6ab75e3357..030e2b3ab9 100644
--- 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java
+++ 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java
@@ -60,10 +60,6 @@ public class BlobId {
         return rawValue;
     }
 
-    public AttachmentId asAttachmentId() {
-        return AttachmentId.from(rawValue);
-    }
-
     public Optional<UploadId> asUploadId() {
         if (rawValue.startsWith(UPLOAD_PREFIX)) {
             UploadId uploadId = 
UploadId.from(rawValue.substring(UPLOAD_PREFIX.length()));
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java
index 1877c91b46..3d06570ac5 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java
@@ -44,10 +44,11 @@ import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
-import org.apache.james.mailbox.model.AttachmentId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.Content;
@@ -68,7 +69,7 @@ import reactor.core.publisher.Mono;
 
 class BlobManagerImplTest {
     static final String ID = "abc";
-    static final AttachmentId ATTACHMENT_ID = AttachmentId.from(ID);
+    static final StringBackedAttachmentId ATTACHMENT_ID = 
StringBackedAttachmentId.from(ID);
     static final ContentType CONTENT_TYPE = ContentType.of("text/plain");
     static final byte[] BYTES = "abc".getBytes(StandardCharsets.UTF_8);
     static final TestMessageId MESSAGE_ID = TestMessageId.of(125);
@@ -88,7 +89,7 @@ class BlobManagerImplTest {
 
         blobManager = new BlobManagerImpl(attachmentManager, messageIdManager, 
new TestMessageId.Factory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new 
MemoryBlobStoreDAO(), BucketName.of("default"), new HashBlobId.Factory()),
-                Clock.systemUTC()));
+                Clock.systemUTC()), new StringBackedAttachmentIdFactory());
     }
 
     @Test
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
index 00e81b6b52..12911b30a6 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
@@ -40,9 +40,7 @@ import 
org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.draft.model.CreationMessageId;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mime4j.codec.EncoderUtil;
-import org.apache.james.mime4j.codec.EncoderUtil.Usage;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mime4j.dom.Entity;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.Multipart;
@@ -612,7 +610,7 @@ class MIMEMessageConverterTest {
             String expectedMimeType = "image/png";
             String text = "123456";
             TextBody expectedBody = new 
BasicBodyFactory().textBody(text.getBytes(), StandardCharsets.UTF_8);
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
                     .blobId(BlobId.of(blodId.getId()))
@@ -662,7 +660,7 @@ class MIMEMessageConverterTest {
             String expectedMimeType = "text/calendar; charset=\"iso-8859-1\"";
             String text = "123456";
             TextBody expectedBody = new 
BasicBodyFactory().textBody(text.getBytes(), StandardCharsets.UTF_8);
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -718,7 +716,7 @@ class MIMEMessageConverterTest {
             String text = "123456";
             TextBody expectedAttachmentBody = new 
BasicBodyFactory().textBody(text.getBytes(), StandardCharsets.UTF_8);
 
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
                     .blobId(BlobId.of(blodId.getId()))
@@ -801,7 +799,7 @@ class MIMEMessageConverterTest {
             String expectedMimeType = "image/png";
             String text = "123456";
             String name = "ديناصور.png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -845,7 +843,7 @@ class MIMEMessageConverterTest {
 
             String text = "123456";
             String type = "image/png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -884,7 +882,7 @@ class MIMEMessageConverterTest {
 
             String text = "123456";
             String type = "image/png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -922,7 +920,7 @@ class MIMEMessageConverterTest {
                 .build();
 
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
             String type = "image/png";
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
@@ -963,7 +961,7 @@ class MIMEMessageConverterTest {
 
             String text = "123456";
             String type = "image/png; name=abc.png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -991,7 +989,7 @@ class MIMEMessageConverterTest {
             MIMEMessageConverter sut = new MIMEMessageConverter();
 
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
             String type = "image/png; name=abc.png; charset=\"iso-8859-1\"";
 
             Attachment attachment = Attachment.builder()
@@ -1013,7 +1011,7 @@ class MIMEMessageConverterTest {
 
             String text = "123456";
             String type = "image/png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
             Attachment attachment = Attachment.builder()
                 .blobId(BlobId.of(blodId.getId()))
                 .cid("cid")
@@ -1032,7 +1030,7 @@ class MIMEMessageConverterTest {
             MIMEMessageConverter sut = new MIMEMessageConverter();
 
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
             String type = "image/png; name=abc.png";
 
             Attachment attachment = Attachment.builder()
@@ -1052,7 +1050,7 @@ class MIMEMessageConverterTest {
             MIMEMessageConverter sut = new MIMEMessageConverter();
 
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
             String type = "image/png";
             Attachment attachment = Attachment.builder()
                 .blobId(BlobId.of(blodId.getId()))
@@ -1079,7 +1077,7 @@ class MIMEMessageConverterTest {
 
             String name = "ديناصور.png";
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
             String type = "image/png";
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
@@ -1123,7 +1121,7 @@ class MIMEMessageConverterTest {
 
             String text = "inline data";
             String type = "image/png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = 
StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob inline = new Attachment.WithBlob(
                 Attachment.builder()
@@ -1142,7 +1140,7 @@ class MIMEMessageConverterTest {
                     .build());
 
             String text2 = "attachment data";
-            final AttachmentId blodId2 = AttachmentId.from("blodId2");
+            final StringBackedAttachmentId blodId2 = 
StringBackedAttachmentId.from("blodId2");
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
                     .blobId(BlobId.of(blodId.getId()))
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java
index 313488e7a4..ffac500a2f 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java
@@ -53,6 +53,7 @@ import 
org.apache.james.jmap.memory.upload.InMemoryUploadRepository;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
@@ -153,7 +154,7 @@ class MessageFastViewFactoryTest {
 
         blobManager = new BlobManagerImpl(resources.getAttachmentManager(), 
resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new 
MemoryBlobStoreDAO(), BucketName.of("default"), new HashBlobId.Factory()),
-                Clock.systemUTC()));
+                Clock.systemUTC()), new StringBackedAttachmentIdFactory());
         messageFullViewFactory = new MessageFullViewFactory(blobManager, 
messageContentExtractor, htmlTextExtractor, messageIdManager,
             new MemoryMessageFastViewProjection(new RecordingMetricFactory()));
         messageFastViewFactory = new MessageFastViewFactory(blobManager, 
messageIdManager, fastViewProjection, messageFullViewFactory);
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
index dcd52d971f..dbe2c2fcb1 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
@@ -62,11 +62,11 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -77,6 +77,7 @@ import 
org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore;
@@ -135,7 +136,8 @@ class MessageFullViewFactoryTest {
         fastViewProjection = spy(new MemoryMessageFastViewProjection(new 
RecordingMetricFactory()));
         BlobManagerImpl blobManager = new 
BlobManagerImpl(resources.getAttachmentManager(), 
resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new 
MemoryBlobStoreDAO(),
-                BucketName.of("default"), new HashBlobId.Factory()), 
Clock.systemUTC()));
+                BucketName.of("default"), new HashBlobId.Factory()), 
Clock.systemUTC()),
+            new StringBackedAttachmentIdFactory());
         messageFullViewFactory = new MessageFullViewFactory(blobManager, 
messageContentExtractor, htmlTextExtractor,
             messageIdManager,
             fastViewProjection);
@@ -505,7 +507,7 @@ class MessageFullViewFactoryTest {
                 
.attachments(ImmutableList.of(MessageAttachmentMetadata.builder()
                         .attachment(AttachmentMetadata.builder()
                                 .messageId(InMemoryMessageId.of(46))
-                                
.attachmentId(AttachmentId.from(blodId.getRawValue()))
+                                
.attachmentId(StringBackedAttachmentId.from(blodId.getRawValue()))
                                 .size(payload.length())
                                 .type(type)
                                 .build())
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
index 7ded4ed2de..5b72e2b8a4 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
@@ -43,6 +43,7 @@ import 
org.apache.james.jmap.memory.upload.InMemoryUploadRepository;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -84,7 +85,8 @@ class MessageHeaderViewFactoryTest {
             session).getId();
         BlobManagerImpl blobManager = new 
BlobManagerImpl(resources.getAttachmentManager(), 
resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new 
MemoryBlobStoreDAO(), BucketName.of("default"), new HashBlobId.Factory()),
-                Clock.systemUTC()));
+                Clock.systemUTC()),
+            new StringBackedAttachmentIdFactory());
 
         testee = new MessageHeaderViewFactory(blobManager, messageIdManager);
     }
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
index 6311090239..25370a5c4f 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
@@ -38,6 +38,7 @@ import 
org.apache.james.jmap.memory.upload.InMemoryUploadRepository;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -79,7 +80,8 @@ class MessageMetadataViewFactoryTest {
 
         BlobManagerImpl blobManager = new 
BlobManagerImpl(resources.getAttachmentManager(), 
resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new 
MemoryBlobStoreDAO(), BucketName.of("default"), new HashBlobId.Factory()),
-                Clock.systemUTC()));
+                Clock.systemUTC()),
+            new StringBackedAttachmentIdFactory());
         testee = new MessageMetadataViewFactory(blobManager, messageIdManager);
     }
 
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java
index ab16217b97..0c36705640 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java
@@ -54,6 +54,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -145,7 +146,8 @@ class ComputeMessageFastViewProjectionListenerTest {
 
         BlobManagerImpl blobManager = new 
BlobManagerImpl(resources.getAttachmentManager(), 
resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new 
MemoryBlobStoreDAO(), BucketName.of("default"),
-                new HashBlobId.Factory()), Clock.systemUTC()));
+                new HashBlobId.Factory()), Clock.systemUTC()),
+            new StringBackedAttachmentIdFactory());
         messageFullViewFactory = new MessageFullViewFactory(blobManager, 
messageContentExtractor, htmlTextExtractor, messageIdManager, 
messageFastViewProjection);
 
         FakeAuthenticator authenticator = new FakeAuthenticator();
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala
index a445c43ea4..b5c2439397 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala
@@ -48,7 +48,7 @@ import 
org.apache.james.jmap.routes.DownloadRoutes.{BUFFER_SIZE, LOGGER}
 import org.apache.james.jmap.{Endpoint, JMAPRoute, JMAPRoutes}
 import org.apache.james.mailbox.model.ContentType.{MediaType, MimeType, 
SubType}
 import org.apache.james.mailbox.model._
-import org.apache.james.mailbox.{AttachmentManager, MailboxSession, 
MessageIdManager}
+import org.apache.james.mailbox.{AttachmentIdFactory, AttachmentManager, 
MailboxSession, MessageIdManager}
 import org.apache.james.mime4j.codec.EncoderUtil
 import org.apache.james.mime4j.codec.EncoderUtil.Usage
 import org.apache.james.mime4j.dom.SingleBody
@@ -173,10 +173,10 @@ class UploadResolver @Inject()(val uploadService: 
UploadService) extends BlobRes
   }
 }
 
-class AttachmentBlobResolver @Inject()(val attachmentManager: 
AttachmentManager) extends BlobResolver {
+class AttachmentBlobResolver @Inject()(val attachmentManager: 
AttachmentManager, val attachmentIdFactory: AttachmentIdFactory) extends 
BlobResolver {
   override def resolve(blobId: BlobId, mailboxSession: MailboxSession): 
BlobResolutionResult =
-    AttachmentId.from(blobId.value.value) match {
-      case attachmentId: AttachmentId =>
+    attachmentIdFactory.from(blobId.value.value) match {
+      case attachmentId: StringBackedAttachmentId =>
         Try(attachmentManager.getAttachment(attachmentId, mailboxSession)) 
match {
           case Success(attachmentMetadata) =>
             
Applicable(SMono(attachmentManager.loadReactive(attachmentMetadata, 
mailboxSession))


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org


Reply via email to