Sorry forgot to link to the jar:
https://repository.apache.org/content/groups/snapshots/org/apache/james/apache-james-mailbox-jpa/0.4-SNAPSHOT/apache-james-mailbox-jpa-0.4-20110713.042245-27.jar
Be,
Norman
Am 13.07.2011 07:28, schrieb Norman Maurer:
Hi there,
you need to use this two files content:
conf/META-INF/persistence.xml:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="James" transaction-type="RESOURCE_LOCAL">
<class>org.apache.james.mailbox.jpa.mail.model.JPAMailbox</class>
<class>org.apache.james.mailbox.jpa.mail.model.JPAUserFlag</class>
<class>org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage</class>
<class>org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMessage</class>
<class>org.apache.james.mailbox.jpa.mail.model.JPAProperty</class>
<class>org.apache.james.mailbox.jpa.user.model.JPASubscription</class>
<class>org.apache.james.domainlist.jpa.model.JPADomain</class>
<class>org.apache.james.user.jpa.model.JPAUser</class>
<class>org.apache.james.rrt.jpa.model.JPARecipientRewrite</class>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)"/>
<property name="openjpa.jdbc.MappingDefaults"
value="ForeignKeyDeleteAction=cascade,
JoinForeignKeyDeleteAction=cascade"/>
<property name="openjpa.jdbc.SchemaFactory"
value="native(ForeignKeys=true)"/>
<property name="openjpa.jdbc.QuerySQLCache" value="false"/>
</properties>
</persistence-unit>
</persistence>
conf/james-mailbox-jpa-context.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd">
<!--
Mailbox JPA
-->
<bean id="jpa-locker"
class="org.apache.james.mailbox.store.JVMMailboxPathLocker"/>
<bean id="jpa-mailboxmanager"
class="org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager"
init-method="init">
<constructor-arg index="0" ref="jpa-sessionMapperFactory"/>
<constructor-arg index="1" ref="authenticator"/>
<constructor-arg index="2" ref="jpa-locker"/>
<constructor-arg index="3" value="YOURPASSWORD"/>
</bean>
<bean id ="jpa-subscriptionManager"
class="org.apache.james.mailbox.jpa.JPASubscriptionManager">
<constructor-arg index="0" ref="jpa-sessionMapperFactory"/>
</bean>
<bean id="jpa-sessionMapperFactory"
class="org.apache.james.mailbox.jpa.JPAMailboxSessionMapperFactory">
<constructor-arg index="0" ref="entityManagerFactory"/>
<constructor-arg index="1" ref="jpa-uidProvider"/>
<constructor-arg index="2" ref="jpa-modSeqProvider"/>
</bean>
<bean id="jpa-uidProvider"
class="org.apache.james.mailbox.jpa.mail.JPAUidProvider">
<constructor-arg index="0" ref="jpa-locker"/>
<constructor-arg index="1" ref="entityManagerFactory"/>
</bean>
<bean id="jpa-modSeqProvider"
class="org.apache.james.mailbox.jpa.mail.JPAModSeqProvider">
<constructor-arg index="0" ref="jpa-locker"/>
<constructor-arg index="1" ref="entityManagerFactory"/>
</bean>
</beans>
Let me know how it work out...
Bye,
Norman
Am 13.07.2011 03:16, schrieb Saibabu Vallurupalli:
Hi Norman, I am going through the fix and trying to find how to setup
password for Encryption. Is it going to be part of configuration? How
to set
the value of AdvancedFeature to use Encryption?
I am planning to start my upgrade process tomorrow morning. Can you
point me
to the latest Binaries includes this fix?
Thank you,
Sai
On Tue, Jul 12, 2011 at 2:00 PM, Norman
Maurer<norman.mau...@googlemail.com
wrote:
Its in 0.4-SNAPSHOT version of mailbox which is atm compatible with
0.3 and should also stay so...
Bye,
Norman
2011/7/12 Saibabu Vallurupalli<saibabu.vallurupa...@gmail.com>:
Hi Norman,
Thank you for applying the patch. Since I am in process of
upgrading our
Apache James thought of checking with you on next James release
this fix
is
going to be available?
Please advise.
Thank you,
Sai
On Tue, Jul 12, 2011 at 1:40 PM,<nor...@apache.org> wrote:
Author: norman
Date: Tue Jul 12 17:40:49 2011
New Revision: 1145691
URL: http://svn.apache.org/viewvc?rev=1145691&view=rev
Log:
Add support for encrypted Headers and Body of the message when using
JPA.
This work is a modified version of the classes attached to
MAILBOX-102.
Thanks again to Valluripalli, Sai for the code. We love
contributions :)
Added:
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java
Modified:
james/mailbox/trunk/jpa/pom.xml
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
james/mailbox/trunk/pom.xml
Modified: james/mailbox/trunk/jpa/pom.xml
URL:
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/pom.xml?rev=1145691&r1=1145690&r2=1145691&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/pom.xml (original)
+++ james/mailbox/trunk/jpa/pom.xml Tue Jul 12 17:40:49 2011
@@ -48,7 +48,10 @@
<groupId>${javax.mail.groupId}</groupId>
<artifactId>${javax.mail.artifactId}</artifactId>
</dependency>
-
+<dependency>
+<groupId>org.jasypt</groupId>
+<artifactId>jasypt</artifactId>
+</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit-dep</artifactId>
@@ -100,7 +103,7 @@
</property>
<property>
<name>metaDataFactory</name>
-
<value>jpa(Types=org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;org.apache.james.mailbox.jpa.mail.model.JPAHeader;org.apache.james.mailbox.jpa.mail.model.JPAMailbox;org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;org.apache.james.mailbox.jpa.mail.model.JPAProperty;org.apache.james.mailbox.jpa.user.model.JPASubscription)</value>
+
<value>jpa(Types=org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;org.apache.james.mailbox.jpa.mail.model.JPAMailbox;org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;org.apache.james.mailbox.jpa.mail.model.JPAProperty;org.apache.james.mailbox.jpa.user.model.JPASubscription)</value>
</property>
</toolProperties>
</configuration>
Added:
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java
URL:
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java?rev=1145691&view=auto
==============================================================================
---
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java
(added)
+++
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java
Tue Jul 12 17:40:49 2011
@@ -0,0 +1,66 @@
+/****************************************************************
+ * 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.jpa.mail.model.openjpa;
+
+import org.jasypt.encryption.pbe.StandardPBEByteEncryptor;
+
+/**
+ * Helper class for encrypt and de-crypt data
+ *
+ *
+ */
+public class EncryptDecryptHelper {
+
+ // Use one static instance as it is thread safe
+ private static StandardPBEByteEncryptor encryptor = new
StandardPBEByteEncryptor();
+
+
+ /**
+ * Set the password for encrypt / de-crypt. This MUST be done
before
+ * the usage of {@link #getDecrypted(byte[])} and {@link
#getEncrypted(byte[])}.
+ *
+ * So to be safe its the best to call this in a constructor
+ *
+ * @param pass
+ */
+ public static void init(String pass) {
+ encryptor.setPassword(pass);
+ }
+
+ /**
+ * Encrypt the given array and return the encrypted one
+ *
+ * @param array
+ * @return enc-array
+ */
+ public static byte[] getEncrypted(byte[] array) {
+ return encryptor.encrypt(array);
+ }
+
+ /**
+ * Decrypt the given array and return the de-crypted one
+ *
+ * @param array
+ * @return dec-array
+ */
+ public static byte[] getDecrypted(byte[] array) {
+ return encryptor.decrypt(array);
+ }
+
+}
Added:
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java
URL:
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java?rev=1145691&view=auto
==============================================================================
---
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java
(added)
+++
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java
Tue Jul 12 17:40:49 2011
@@ -0,0 +1,115 @@
+/****************************************************************
+ * 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.jpa.mail.model.openjpa;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+
+import javax.mail.Flags;
+import javax.mail.internet.SharedInputStream;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
+import org.apache.james.mailbox.store.mail.model.Message;
+import
org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.apache.openjpa.persistence.Externalizer;
+import org.apache.openjpa.persistence.Factory;
+
+@Entity(name="Message")
+@Table(name="JAMES_MAIL")
+public class JPAEncryptedMessage extends AbstractJPAMessage {
+
+ /** The value for the body field. Lazy loaded */
+ /** We use a max length to represent 1gb data. Thats prolly
overkill, but who knows */
+ @Basic(optional = false, fetch = FetchType.LAZY)
+ @Column(name = "MAIL_BYTES", length = 1048576000, nullable =
false)
+ @Externalizer("EncryptDecryptHelper.getEncrypted")
+ @Factory("EncryptDecryptHelper.getDecrypted")
+ @Lob private byte[] body;
+
+
+ /** The value for the header field. Lazy loaded */
+ /** We use a max length to represent 1gb data. Thats prolly
overkill, but who knows */
+ @Basic(optional = false, fetch = FetchType.LAZY)
+ @Column(name = "HEADER_BYTES", length = 10485760, nullable =
false)
+ @Externalizer("EncryptDecryptHelper.getEncrypted")
+ @Factory("EncryptDecryptHelper.getDecrypted")
+ @Lob private byte[] header;
+
+ @Deprecated
+ public JPAEncryptedMessage() {}
+
+ public JPAEncryptedMessage(JPAMailbox mailbox,Date
internalDate,
int size, Flags flags, SharedInputStream content, int bodyStartOctet,
final
PropertyBuilder propertyBuilder) throws MailboxException {
+ super(mailbox, internalDate, flags, size
,bodyStartOctet,
propertyBuilder);
+ try {
+ int headerEnd = bodyStartOctet -2;
+ if (headerEnd< 0) {
+ headerEnd = 0;
+ }
+ this.header =
IOUtils.toByteArray(content.newStream(0,
headerEnd));
+ this.body =
IOUtils.toByteArray(content.newStream(getBodyStartOctet(), -1));
+
+ } catch (IOException e) {
+ throw new MailboxException("Unable to parse
message",e);
+ }
+ }
+
+ /**
+ * Create a copy of the given message
+ *
+ * @param message
+ * @throws MailboxException
+ */
+ public JPAEncryptedMessage(JPAMailbox mailbox, long uid,
long
modSeq, Message<?> message) throws MailboxException{
+ super(mailbox, uid, modSeq, message);
+ try {
+ this.body =
IOUtils.toByteArray(message.getBodyContent());
+ this.header =
IOUtils.toByteArray(message.getHeaderContent());
+ } catch (IOException e) {
+ throw new MailboxException("Unable to parse
message",e);
+ }
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.mailbox.store.mail.model.Message#getBodyContent()
+ */
+ public InputStream getBodyContent() throws IOException {
+ return new ByteArrayInputStream(body);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.mailbox.store.mail.model.Message#getHeaderContent()
+ */
+ public InputStream getHeaderContent() throws IOException {
+ return new ByteArrayInputStream(header);
+ }
+
+}
Modified:
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
URL:
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java?rev=1145691&r1=1145690&r2=1145691&view=diff
==============================================================================
---
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
(original)
+++
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
Tue Jul 12 17:40:49 2011
@@ -25,6 +25,8 @@ import org.apache.james.mailbox.MailboxP
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.jpa.JPAMailboxManager;
import org.apache.james.mailbox.jpa.JPAMailboxSessionMapperFactory;
+import
org.apache.james.mailbox.jpa.mail.model.openjpa.EncryptDecryptHelper;
+import
org.apache.james.mailbox.jpa.openjpa.OpenJPAMessageManager.AdvancedFeature;
import org.apache.james.mailbox.store.Authenticator;
import org.apache.james.mailbox.store.JVMMailboxPathLocker;
import org.apache.james.mailbox.store.StoreMessageManager;
@@ -36,20 +38,34 @@ import org.apache.james.mailbox.store.ma
*/
public class OpenJPAMailboxManager extends JPAMailboxManager {
- private boolean useStreaming;
+ private AdvancedFeature feature;
public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory
mapperFactory, Authenticator authenticator, MailboxPathLocker locker,
boolean useStreaming) {
super(mapperFactory, authenticator, locker);
- this.useStreaming = useStreaming;
+ if (useStreaming) {
+ feature = AdvancedFeature.Streaming;
+ } else {
+ feature = AdvancedFeature.None;
+ }
}
+ public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory
mapperFactory, Authenticator authenticator, MailboxPathLocker locker,
String encryptPass) {
+ super(mapperFactory, authenticator, locker);
+ if (encryptPass != null) {
+ EncryptDecryptHelper.init(encryptPass);
+ feature = AdvancedFeature.Encryption;
+ } else {
+ feature = AdvancedFeature.None;
+ }
+ }
+
public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory
mapperFactory, Authenticator authenticator) {
this(mapperFactory, authenticator, new
JVMMailboxPathLocker(),
false);
}
@Override
protected StoreMessageManager<Long>
createMessageManager(Mailbox<Long>
mailboxRow, MailboxSession session) throws MailboxException {
- StoreMessageManager<Long> result = new
OpenJPAMessageManager(getMapperFactory(), getMessageSearchIndex(),
getEventDispatcher(), mailboxRow, useStreaming);
+ StoreMessageManager<Long> result = new
OpenJPAMessageManager(getMapperFactory(), getMessageSearchIndex(),
getEventDispatcher(), mailboxRow, feature);
return result;
}
}
Modified:
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
URL:
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java?rev=1145691&r1=1145690&r2=1145691&view=diff
==============================================================================
---
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
(original)
+++
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
Tue Jul 12 17:40:49 2011
@@ -27,6 +27,7 @@ import javax.mail.internet.SharedInputSt
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.jpa.JPAMessageManager;
import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
+import
org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMessage;
import
org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;
import org.apache.james.mailbox.store.MailboxEventDispatcher;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -40,30 +41,40 @@ import org.apache.james.mailbox.store.se
*/
public class OpenJPAMessageManager extends JPAMessageManager {
- private final boolean useStreaming;
+ private final AdvancedFeature feature;
+ public static enum AdvancedFeature {
+ None,
+ Streaming,
+ Encryption
+ }
+
public OpenJPAMessageManager(MailboxSessionMapperFactory<Long>
mapperFactory, MessageSearchIndex<Long> index,
MailboxEventDispatcher<Long> dispatcher, Mailbox<Long>
mailbox)
throws MailboxException {
- this(mapperFactory, index, dispatcher, mailbox, false);
+ this(mapperFactory, index, dispatcher, mailbox,
AdvancedFeature.None);
}
public OpenJPAMessageManager(MailboxSessionMapperFactory<Long>
mapperFactory, MessageSearchIndex<Long> index,
- MailboxEventDispatcher<Long> dispatcher, Mailbox<Long>
mailbox, final boolean useStreaming) throws MailboxException {
+ MailboxEventDispatcher<Long> dispatcher, Mailbox<Long>
mailbox, final AdvancedFeature f) throws MailboxException {
super(mapperFactory, index, dispatcher, mailbox);
- this.useStreaming = useStreaming;
+ this.feature = f;
}
@Override
protected Message<Long> createMessage(Date internalDate, int
size,
int
bodyStartOctet, SharedInputStream content, Flags flags,
PropertyBuilder
propertyBuilder) throws MailboxException {
- if (useStreaming) {
- int headerEnd = bodyStartOctet -2;
- if (headerEnd< 0) {
- headerEnd = 0;
- }
+ int headerEnd = bodyStartOctet -2;
+ if (headerEnd< 0) {
+ headerEnd = 0;
+ }
+ switch (feature) {
+ case Streaming:
return new JPAStreamingMessage((JPAMailbox)
getMailboxEntity(),
internalDate, size, flags, content, bodyStartOctet, propertyBuilder);
- } else {
+ case Encryption:
+ return new JPAEncryptedMessage((JPAMailbox)
getMailboxEntity(), internalDate, size, flags, content,
bodyStartOctet,
propertyBuilder);
+ default:
return super.createMessage(internalDate, size,
bodyStartOctet,
content, flags, propertyBuilder);
}
+
}
Modified: james/mailbox/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/james/mailbox/trunk/pom.xml?rev=1145691&r1=1145690&r2=1145691&view=diff
==============================================================================
--- james/mailbox/trunk/pom.xml (original)
+++ james/mailbox/trunk/pom.xml Tue Jul 12 17:40:49 2011
@@ -715,6 +715,11 @@
<artifactId>geronimo-jpa_2.0_spec</artifactId>
<version>1.1</version>
</dependency>
+<dependency>
+<groupId>org.jasypt</groupId>
+<artifactId>jasypt</artifactId>
+<version>1.7.1</version>
+</dependency>
<!--
END OpenJPA
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org