You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2017/01/11 09:26:26 UTC
[38/50] [abbrv] james-project git commit: MAILET-115 Remove abstract
service with original mail implementation
MAILET-115 Remove abstract service with original mail implementation
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/30c8a8c2
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/30c8a8c2
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/30c8a8c2
Branch: refs/heads/master
Commit: 30c8a8c2acbac99c97811cfc479037e4d0bde753
Parents: 6a87096
Author: Antoine Duprat <ad...@apache.org>
Authored: Thu Nov 17 15:15:00 2016 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Jan 11 10:03:31 2017 +0700
----------------------------------------------------------------------
.../apache/james/transport/mailets/Bounce.java | 3 +-
.../apache/james/transport/mailets/Forward.java | 6 +
.../transport/mailets/NotifyPostmaster.java | 6 +
.../james/transport/mailets/NotifySender.java | 6 +
.../james/transport/mailets/Redirect.java | 6 +
.../apache/james/transport/mailets/Resend.java | 6 +
.../mailets/redirect/AbstractRedirect.java | 122 +------------
.../mailets/redirect/ProcessRedirectNotify.java | 179 +++++++++++++++++++
8 files changed, 212 insertions(+), 122 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/30c8a8c2/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java
index d3c8595..40cebb5 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java
@@ -28,6 +28,7 @@ import org.apache.james.transport.mailets.redirect.AbstractRedirect;
import org.apache.james.transport.mailets.redirect.InitParameters;
import org.apache.james.transport.mailets.redirect.NotifyMailetInitParameters;
import org.apache.james.transport.mailets.redirect.NotifyMailetsMessage;
+import org.apache.james.transport.mailets.redirect.ProcessRedirectNotify;
import org.apache.james.transport.mailets.redirect.SpecialAddress;
import org.apache.james.transport.mailets.utils.MimeMessageModifier;
import org.apache.james.transport.mailets.utils.MimeMessageUtils;
@@ -208,7 +209,7 @@ public class Bounce extends AbstractRedirect {
if (getInitParameters().isDebug()) {
log("Processing a bounce request for a message with a reverse path. The bounce will be sent to " + originalMail.getSender().toString());
}
- super.service(originalMail);
+ ProcessRedirectNotify.from(this).process(originalMail);
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/30c8a8c2/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java
index 97bd62b..77b3c6d 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java
@@ -28,6 +28,7 @@ import javax.mail.internet.InternetAddress;
import org.apache.james.transport.mailets.redirect.AbstractRedirect;
import org.apache.james.transport.mailets.redirect.AddressExtractor;
import org.apache.james.transport.mailets.redirect.InitParameters;
+import org.apache.james.transport.mailets.redirect.ProcessRedirectNotify;
import org.apache.james.transport.mailets.redirect.RedirectMailetInitParameters;
import org.apache.james.transport.mailets.redirect.TypeCode;
import org.apache.james.transport.mailets.utils.MimeMessageModifier;
@@ -206,4 +207,9 @@ public class Forward extends AbstractRedirect {
protected MimeMessageModifier getMimeMessageModifier(Mail newMail, Mail originalMail) throws MessagingException {
return new MimeMessageModifier(newMail.getMessage());
}
+
+ @Override
+ public void service(Mail originalMail) throws MessagingException {
+ ProcessRedirectNotify.from(this).process(originalMail);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/30c8a8c2/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java
index 8059811..2c309bf 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java
@@ -29,6 +29,7 @@ import org.apache.james.transport.mailets.redirect.AddressExtractor;
import org.apache.james.transport.mailets.redirect.InitParameters;
import org.apache.james.transport.mailets.redirect.NotifyMailetInitParameters;
import org.apache.james.transport.mailets.redirect.NotifyMailetsMessage;
+import org.apache.james.transport.mailets.redirect.ProcessRedirectNotify;
import org.apache.james.transport.mailets.redirect.SpecialAddress;
import org.apache.james.transport.mailets.utils.MimeMessageModifier;
import org.apache.james.transport.mailets.utils.MimeMessageUtils;
@@ -220,4 +221,9 @@ public class NotifyPostmaster extends AbstractRedirect {
protected MimeMessageModifier getMimeMessageModifier(Mail newMail, Mail originalMail) throws MessagingException {
return new MimeMessageModifier(originalMail.getMessage());
}
+
+ @Override
+ public void service(Mail originalMail) throws MessagingException {
+ ProcessRedirectNotify.from(this).process(originalMail);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/30c8a8c2/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java
index 3db3d39..f426d1e 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java
@@ -29,6 +29,7 @@ import org.apache.james.transport.mailets.redirect.AddressExtractor;
import org.apache.james.transport.mailets.redirect.InitParameters;
import org.apache.james.transport.mailets.redirect.NotifyMailetInitParameters;
import org.apache.james.transport.mailets.redirect.NotifyMailetsMessage;
+import org.apache.james.transport.mailets.redirect.ProcessRedirectNotify;
import org.apache.james.transport.mailets.redirect.SpecialAddress;
import org.apache.james.transport.mailets.utils.MimeMessageModifier;
import org.apache.james.transport.mailets.utils.MimeMessageUtils;
@@ -220,4 +221,9 @@ public class NotifySender extends AbstractRedirect {
protected MimeMessageModifier getMimeMessageModifier(Mail newMail, Mail originalMail) throws MessagingException {
return new MimeMessageModifier(originalMail.getMessage());
}
+
+ @Override
+ public void service(Mail originalMail) throws MessagingException {
+ ProcessRedirectNotify.from(this).process(originalMail);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/30c8a8c2/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java
index 43e4e98..fa08a6d 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java
@@ -27,6 +27,7 @@ import javax.mail.internet.InternetAddress;
import org.apache.james.transport.mailets.redirect.AbstractRedirect;
import org.apache.james.transport.mailets.redirect.AddressExtractor;
import org.apache.james.transport.mailets.redirect.InitParameters;
+import org.apache.james.transport.mailets.redirect.ProcessRedirectNotify;
import org.apache.james.transport.mailets.redirect.RedirectMailetInitParameters;
import org.apache.james.transport.mailets.redirect.TypeCode;
import org.apache.james.transport.mailets.utils.MimeMessageModifier;
@@ -440,4 +441,9 @@ public class Redirect extends AbstractRedirect {
protected MimeMessageModifier getMimeMessageModifier(Mail newMail, Mail originalMail) throws MessagingException {
return new MimeMessageModifier(newMail.getMessage());
}
+
+ @Override
+ public void service(Mail originalMail) throws MessagingException {
+ ProcessRedirectNotify.from(this).process(originalMail);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/30c8a8c2/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java
index a5869d5..ad84e41 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java
@@ -27,6 +27,7 @@ import javax.mail.internet.InternetAddress;
import org.apache.james.transport.mailets.redirect.AbstractRedirect;
import org.apache.james.transport.mailets.redirect.AddressExtractor;
import org.apache.james.transport.mailets.redirect.InitParameters;
+import org.apache.james.transport.mailets.redirect.ProcessRedirectNotify;
import org.apache.james.transport.mailets.redirect.RedirectMailetInitParameters;
import org.apache.james.transport.mailets.utils.MimeMessageModifier;
import org.apache.james.transport.mailets.utils.MimeMessageUtils;
@@ -403,4 +404,9 @@ public class Resend extends AbstractRedirect {
protected MimeMessageModifier getMimeMessageModifier(Mail newMail, Mail originalMail) throws MessagingException {
return new MimeMessageModifier(newMail.getMessage());
}
+
+ @Override
+ public void service(Mail originalMail) throws MessagingException {
+ ProcessRedirectNotify.from(this).process(originalMail);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/30c8a8c2/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java
index 528e604..70ccf76 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java
@@ -23,11 +23,8 @@ import java.util.List;
import javax.inject.Inject;
import javax.mail.MessagingException;
-import javax.mail.Session;
import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-import org.apache.james.core.MailImpl;
import org.apache.james.dnsservice.api.DNSService;
import org.apache.james.transport.mailets.Redirect;
import org.apache.james.transport.mailets.utils.MimeMessageModifier;
@@ -313,124 +310,7 @@ public abstract class AbstractRedirect extends GenericMailet {
* @throws MessagingException if a problem arises formulating the redirected mail
*/
@Override
- public void service(Mail originalMail) throws MessagingException {
-
- boolean keepMessageId = false;
-
- // duplicates the Mail object, to be able to modify the new mail keeping
- // the original untouched
- MailImpl newMail = new MailImpl(originalMail);
- try {
- MailModifier mailModifier = MailModifier.builder()
- .mailet(this)
- .mail(newMail)
- .dns(dns)
- .build();
- mailModifier.setRemoteAddr();
- mailModifier.setRemoteHost();
-
- if (getInitParameters().isDebug()) {
- log("New mail - sender: " + newMail.getSender() + ", recipients: " + arrayToString(newMail.getRecipients().toArray()) + ", name: " + newMail.getName() + ", remoteHost: " + newMail.getRemoteHost() + ", remoteAddr: " + newMail.getRemoteAddr() + ", state: " + newMail.getState()
- + ", lastUpdated: " + newMail.getLastUpdated() + ", errorMessage: " + newMail.getErrorMessage());
- }
-
- // Create the message
- if (!getInitParameters().getInLineType().equals(TypeCode.UNALTERED)) {
- if (getInitParameters().isDebug()) {
- log("Alter message");
- }
- newMail.setMessage(new MimeMessage(Session.getDefaultInstance(System.getProperties(), null)));
-
- // handle the new message if altered
- MailMessageAlteringUtils.from(this)
- .originalMail(originalMail)
- .newMail(newMail)
- .alterNewMessage();
-
- } else {
- // if we need the original, create a copy of this message to
- // redirect
- if (getInitParameters().getPassThrough()) {
- newMail.setMessage(new MimeMessage(originalMail.getMessage()) {
- protected void updateHeaders() throws MessagingException {
- if (getMessageID() == null)
- super.updateHeaders();
- else {
- modified = false;
- }
- }
- });
- }
- if (getInitParameters().isDebug()) {
- log("Message resent unaltered.");
- }
- keepMessageId = true;
- }
-
- // Set additional headers
-
- mailModifier.setRecipients(getRecipients(originalMail));
- mailModifier.setTo(getTo(originalMail));
- mailModifier.setSubjectPrefix(originalMail);
- mailModifier.setReplyTo(getReplyTo(originalMail), originalMail);
- mailModifier.setReversePath(getReversePath(originalMail), originalMail);
- mailModifier.setIsReply(getInitParameters().isReply(), originalMail);
- mailModifier.setSender(getSender(originalMail), originalMail);
- mailModifier.initializeDateIfNotPresent();
- if (keepMessageId) {
- mailModifier.setMessageId(originalMail);
- }
- newMail = mailModifier.getMail();
-
- newMail.getMessage().saveChanges();
- newMail.removeAllAttributes();
-
- if (senderDomainIsValid(newMail)) {
- // Send it off...
- getMailetContext().sendMail(newMail);
- } else {
- String logBuffer = getMailetName() + " mailet cannot forward " + originalMail.getName() + ". Invalid sender domain for " + newMail.getSender() + ". Consider using the Resend mailet " + "using a different sender.";
- throw new MessagingException(logBuffer);
- }
-
- } finally {
- newMail.dispose();
- }
-
- if (!getInitParameters().getPassThrough()) {
- originalMail.setState(Mail.GHOST);
- }
- }
+ public abstract void service(Mail originalMail) throws MessagingException;
protected abstract MimeMessageModifier getMimeMessageModifier(Mail newMail, Mail originalMail) throws MessagingException;
-
- /**
- * <p>
- * Checks if a sender domain of <i>mail</i> is valid.
- * </p>
- * <p>
- * If we do not do this check, and someone uses a redirection mailet in a
- * processor initiated by SenderInFakeDomain, then a fake sender domain will
- * cause an infinite loop (the forwarded e-mail still appears to come from a
- * fake domain).<br>
- * Although this can be viewed as a configuration error, the consequences of
- * such a mis-configuration are severe enough to warrant protecting against
- * the infinite loop.
- * </p>
- * <p>
- * This check can be skipped if {@link #getFakeDomainCheck(Mail)} returns
- * true.
- * </p>
- *
- * @param mail the mail object to check
- * @return true if the if the sender is null or
- * {@link org.apache.mailet.MailetContext#getMailServers} returns
- * true for the sender host part
- */
- @SuppressWarnings("deprecation")
- protected final boolean senderDomainIsValid(Mail mail) throws MessagingException {
- return !getInitParameters().getFakeDomainCheck()
- || mail.getSender() == null
- || !getMailetContext().getMailServers(mail.getSender().getDomain()).isEmpty();
- }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/30c8a8c2/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
new file mode 100644
index 0000000..e41ca83
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
@@ -0,0 +1,179 @@
+/****************************************************************
+ * 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.transport.mailets.redirect;
+
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.james.core.MailImpl;
+import org.apache.mailet.Mail;
+
+public class ProcessRedirectNotify {
+
+ public static ProcessRedirectNotify from(AbstractRedirect mailet) {
+ return new ProcessRedirectNotify(mailet);
+ }
+
+ private final AbstractRedirect mailet;
+ private final boolean isDebug;
+
+ private ProcessRedirectNotify(AbstractRedirect mailet) {
+ this.mailet = mailet;
+ this.isDebug = mailet.getInitParameters().isDebug();
+ }
+
+ public void process(Mail originalMail) throws MessagingException {
+
+ // duplicates the Mail object, to be able to modify the new mail keeping
+ // the original untouched
+ MailImpl newMail = new MailImpl(originalMail);
+ try {
+ MailModifier mailModifier = MailModifier.builder()
+ .mailet(mailet)
+ .mail(newMail)
+ .dns(mailet.dns)
+ .build();
+ mailModifier.setRemoteAddr();
+ mailModifier.setRemoteHost();
+
+ if (isDebug) {
+ mailet.log("New mail - sender: " + newMail.getSender() + ", recipients: " + mailet.arrayToString(newMail.getRecipients().toArray()) + ", name: " + newMail.getName() + ", remoteHost: " + newMail.getRemoteHost() + ", remoteAddr: " + newMail.getRemoteAddr() + ", state: " + newMail.getState()
+ + ", lastUpdated: " + newMail.getLastUpdated() + ", errorMessage: " + newMail.getErrorMessage());
+ }
+
+ // Create the message
+ boolean keepMessageId = keepMessageId();
+ if (!keepMessageId) {
+ createAlterMessage(originalMail, newMail);
+ } else {
+ createUnalteredMessage(originalMail, newMail);
+ }
+
+ // Set additional headers
+
+ mailModifier.setRecipients(mailet.getRecipients(originalMail));
+ mailModifier.setTo(mailet.getTo(originalMail));
+ mailModifier.setSubjectPrefix(originalMail);
+ mailModifier.setReplyTo(mailet.getReplyTo(originalMail), originalMail);
+ mailModifier.setReversePath(mailet.getReversePath(originalMail), originalMail);
+ mailModifier.setIsReply(mailet.getInitParameters().isReply(), originalMail);
+ mailModifier.setSender(mailet.getSender(originalMail), originalMail);
+ mailModifier.initializeDateIfNotPresent();
+ if (keepMessageId) {
+ mailModifier.setMessageId(originalMail);
+ }
+ finalize(newMail);
+
+ if (senderDomainIsValid(newMail)) {
+ // Send it off...
+ mailet.getMailetContext().sendMail(newMail);
+ } else {
+ throw new MessagingException(mailet.getMailetName() + " mailet cannot forward " + originalMail.getName() + ". " +
+ "Invalid sender domain for " + newMail.getSender() + ". " +
+ "Consider using the Resend mailet " + "using a different sender.");
+ }
+
+ } finally {
+ newMail.dispose();
+ }
+
+ if (!mailet.getInitParameters().getPassThrough()) {
+ originalMail.setState(Mail.GHOST);
+ }
+ }
+
+ private void finalize(MailImpl mail) throws MessagingException {
+ mail.getMessage().saveChanges();
+ mail.removeAllAttributes();
+ }
+
+ private boolean keepMessageId() {
+ return mailet.getInitParameters().getInLineType().equals(TypeCode.UNALTERED);
+ }
+
+ private void createAlterMessage(Mail originalMail, MailImpl newMail) throws MessagingException {
+ if (isDebug) {
+ mailet.log("Alter message");
+ }
+ newMail.setMessage(new MimeMessage(Session.getDefaultInstance(System.getProperties(), null)));
+
+ // handle the new message if altered
+ MailMessageAlteringUtils.from(mailet)
+ .originalMail(originalMail)
+ .newMail(newMail)
+ .alterNewMessage();
+ }
+
+ private void createUnalteredMessage(Mail originalMail, MailImpl newMail) throws MessagingException {
+ // if we need the original, create a copy of this message to
+ // redirect
+ if (mailet.getInitParameters().getPassThrough()) {
+ newMail.setMessage(new CopiedMimeMessage(originalMail.getMessage()));
+ }
+ if (isDebug) {
+ mailet.log("Message resent unaltered.");
+ }
+ }
+
+ private static class CopiedMimeMessage extends MimeMessage {
+
+ public CopiedMimeMessage(MimeMessage originalMessage) throws MessagingException {
+ super(originalMessage);
+ }
+
+ protected void updateHeaders() throws MessagingException {
+ if (getMessageID() == null)
+ super.updateHeaders();
+ else {
+ modified = false;
+ }
+ }
+ }
+
+ /**
+ * <p>
+ * Checks if a sender domain of <i>mail</i> is valid.
+ * </p>
+ * <p>
+ * If we do not do this check, and someone uses a redirection mailet in a
+ * processor initiated by SenderInFakeDomain, then a fake sender domain will
+ * cause an infinite loop (the forwarded e-mail still appears to come from a
+ * fake domain).<br>
+ * Although this can be viewed as a configuration error, the consequences of
+ * such a mis-configuration are severe enough to warrant protecting against
+ * the infinite loop.
+ * </p>
+ * <p>
+ * This check can be skipped if {@link #getFakeDomainCheck(Mail)} returns
+ * true.
+ * </p>
+ *
+ * @param mail the mail object to check
+ * @return true if the if the sender is null or
+ * {@link org.apache.mailet.MailetContext#getMailServers} returns
+ * true for the sender host part
+ */
+ @SuppressWarnings("deprecation")
+ private boolean senderDomainIsValid(Mail mail) throws MessagingException {
+ return !mailet.getInitParameters().getFakeDomainCheck()
+ || mail.getSender() == null
+ || !mailet.getMailetContext().getMailServers(mail.getSender().getDomain()).isEmpty();
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org