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 no...@apache.org on 2010/06/14 18:17:45 UTC

svn commit: r954538 [2/2] - in /james/server/trunk: common-util/ core-api/ core-function/ core-library/ fetchmail/ imapserver/ jcr-store/ jcr-store/src/main/java/org/apache/james/jcr/ jpa-store/ mailets/ management/ netty-socket/ netty-socket/src/main/...

Modified: james/server/trunk/smtpserver/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/pom.xml?rev=954538&r1=954537&r2=954538&view=diff
==============================================================================
--- james/server/trunk/smtpserver/pom.xml (original)
+++ james/server/trunk/smtpserver/pom.xml Mon Jun 14 16:17:44 2010
@@ -1,163 +1,159 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
-<!--
-  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.    
--->
-<project>
-  <parent>
-    <artifactId>james-server</artifactId>
-    <groupId>org.apache.james</groupId>
-    <version>3.0-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.james</groupId>
-  <artifactId>james-server-smtpserver</artifactId>
-  <name>Apache JAMES Server SMTP</name>
-  
-  <dependencies>
-    <dependency>
-      <groupId>${javax.mail.groupId}</groupId>
-      <artifactId>${javax.mail.artifactId}</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-mailet</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-javamail-util</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-common-util</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-user-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james.protocols</groupId>
-      <artifactId>protocols-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-domain-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-core-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-core-api</artifactId>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-core-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james.protocols</groupId>
-      <artifactId>protocols-smtp</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-netty-socket</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>${javax.activation.groupId}</groupId>
-      <artifactId>${javax.activation.artifactId}</artifactId>
-    </dependency>
-
-    
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-jspf</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.netty</groupId>
-      <artifactId>netty</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-    </dependency> 
-    <dependency>
-      <groupId>commons-configuration</groupId>
-      <artifactId>commons-configuration</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>javax.annotation</groupId>
-      <artifactId>jsr250-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james.protocols</groupId>
-      <artifactId>protocols-impl</artifactId>
-    </dependency>    
-    <dependency>
-      <artifactId>dnsjava</artifactId>
-      <groupId>dnsjava</groupId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-core-library</artifactId>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-user-library</artifactId>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-   <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-user-library</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james.protocols</groupId>
-      <artifactId>protocols-smtp</artifactId>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-net</groupId>
-      <artifactId>commons-net</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-mailet-base</artifactId>
-      <classifier>tests</classifier>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-   	  <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-domain-api</artifactId>
-      <scope>test</scope>
-      <type>test-jar</type>
-    </dependency>
-  </dependencies>
-</project>
+<?xml version="1.0" encoding="ISO-8859-15"?>
+<!--
+  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.    
+-->
+<project>
+  <parent>
+    <artifactId>james-server</artifactId>
+    <groupId>org.apache.james</groupId>
+    <version>3.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.james</groupId>
+  <artifactId>james-server-smtpserver</artifactId>
+  <name>Apache JAMES Server SMTP</name>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-javamail-util</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-common-util</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-user-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-core-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-core-library</artifactId>
+    </dependency>    
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-netty-socket</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-domain-api</artifactId>
+    </dependency>            
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-mailet</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james.protocols</groupId>
+      <artifactId>protocols-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james.protocols</groupId>
+      <artifactId>protocols-smtp</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james.protocols</groupId>
+      <artifactId>protocols-impl</artifactId>
+    </dependency>   
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-jspf</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+    </dependency> 
+    <dependency>
+      <groupId>commons-configuration</groupId>
+      <artifactId>commons-configuration</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>${javax.mail.groupId}</groupId>
+      <artifactId>${javax.mail.artifactId}</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.netty</groupId>
+      <artifactId>netty</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>javax.annotation</groupId>
+      <artifactId>jsr250-api</artifactId>
+    </dependency>
+
+
+    <!-- Test dependencies -->
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-core-api</artifactId>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <artifactId>dnsjava</artifactId>
+      <groupId>dnsjava</groupId>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-core-library</artifactId>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-user-library</artifactId>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+   <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-user-library</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james.protocols</groupId>
+      <artifactId>protocols-smtp</artifactId>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>commons-net</groupId>
+      <artifactId>commons-net</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-mailet-base</artifactId>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+   	  <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-domain-api</artifactId>
+      <scope>test</scope>
+      <type>test-jar</type>
+    </dependency>
+  </dependencies>
+</project>

Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java?rev=954538&r1=954537&r2=954538&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java Mon Jun 14 16:17:44 2010
@@ -1,310 +1,318 @@
-/****************************************************************
- * 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.smtpserver.netty;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.james.api.dnsservice.util.NetMatcher;
-import org.apache.james.protocols.api.ProtocolHandlerChain;
-import org.apache.james.protocols.impl.AbstractSSLAwareChannelPipelineFactory;
-import org.apache.james.protocols.smtp.SMTPConfiguration;
-import org.apache.james.protocols.smtp.SMTPServerMBean;
-import org.apache.james.socket.netty.AbstractConfigurableAsyncServer;
-import org.jboss.netty.channel.ChannelPipelineFactory;
-import org.jboss.netty.channel.ChannelUpstreamHandler;
-import org.jboss.netty.channel.group.ChannelGroup;
-import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
-
-/**
- * NIO SMTPServer which use Netty
- * 
- *
- */
-public class NioSMTPServer extends AbstractConfigurableAsyncServer implements SMTPServerMBean{
-
-    
-    /**
-     * The handler chain - SMTPhandlers can lookup handlerchain to obtain
-     * Command handlers , Message handlers and connection handlers
-     * Constructed during initialisation to allow dependency injection.
-     */
-    private ProtocolHandlerChain handlerChain;
-
-    /**
-     * Whether authentication is required to use
-     * this SMTP server.
-     */
-    private final static int AUTH_DISABLED = 0;
-    private final static int AUTH_REQUIRED = 1;
-    private final static int AUTH_ANNOUNCE = 2;
-    private int authRequired = AUTH_DISABLED;
-
-    /**
-     * Whether the server needs helo to be send first
-     */
-    private boolean heloEhloEnforcement = false;
-
-    /**
-     * SMTPGreeting to use 
-     */
-    private String smtpGreeting = null;
-
-    /**
-     * This is a Network Matcher that should be configured to contain
-     * authorized networks that bypass SMTP AUTH requirements.
-     */
-    private NetMatcher authorizedNetworks = null;
-
-    /**
-     * The maximum message size allowed by this SMTP server.  The default
-     * value, 0, means no limit.
-     */
-    private long maxMessageSize = 0;
-
-    /**
-     * The number of bytes to read before resetting
-     * the connection timeout timer.  Defaults to
-     * 20 KB.
-     */
-    private int lengthReset = 20 * 1024;
-
-    /**
-     * The configuration data to be passed to the handler
-     */
-    private final SMTPConfiguration theConfigData = new SMTPHandlerConfigurationDataImpl();
-
-    private boolean addressBracketsEnforcement = true;
-
-    
-
-    public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
-        this.handlerChain = handlerChain;
-    }
-
-    
-    public void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
-        if (isEnabled()) {
-            HierarchicalConfiguration handlerConfiguration = configuration.configurationAt("handler");
-            String authRequiredString = handlerConfiguration.getString("authRequired","false").trim().toLowerCase();
-            if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
-            else if (authRequiredString.equals("announce")) authRequired = AUTH_ANNOUNCE;
-            else authRequired = AUTH_DISABLED;
-            if (authRequired != AUTH_DISABLED) {
-                getLogger().info("This SMTP server requires authentication.");
-            } else {
-                getLogger().info("This SMTP server does not require authentication.");
-            }
-
-            String authorizedAddresses = handlerConfiguration.getString("authorizedAddresses",null);
-            if (authRequired == AUTH_DISABLED && authorizedAddresses == null) {
-                /* if SMTP AUTH is not requred then we will use
-                 * authorizedAddresses to determine whether or not to
-                 * relay e-mail.  Therefore if SMTP AUTH is not
-                 * required, we will not relay e-mail unless the
-                 * sending IP address is authorized.
-                 *
-                 * Since this is a change in behavior for James v2,
-                 * create a default authorizedAddresses network of
-                 * 0.0.0.0/0, which matches all possible addresses, thus
-                 * preserving the current behavior.
-                 *
-                 * James v3 should require the <authorizedAddresses>
-                 * element.
-                 */
-                authorizedAddresses = "0.0.0.0/0.0.0.0";
-            }
-
-            if (authorizedAddresses != null) {
-                java.util.StringTokenizer st = new java.util.StringTokenizer(authorizedAddresses, ", ", false);
-                java.util.Collection<String> networks = new java.util.ArrayList<String>();
-                while (st.hasMoreTokens()) {
-                    String addr = st.nextToken();
-                    networks.add(addr);
-                }
-                authorizedNetworks = new NetMatcher(networks, getDNSService());
-            }
-
-            if (authorizedNetworks != null) {
-                getLogger().info("Authorized addresses: " + authorizedNetworks.toString());
-            }
-
-            // get the message size limit from the conf file and multiply
-            // by 1024, to put it in bytes
-            maxMessageSize = handlerConfiguration.getLong( "maxmessagesize",maxMessageSize ) * 1024;
-            if (maxMessageSize > 0) {
-                getLogger().info("The maximum allowed message size is " + maxMessageSize + " bytes.");
-            } else {
-                getLogger().info("No maximum message size is enforced for this server.");
-            }
-            // How many bytes to read before updating the timer that data is being transfered
-            lengthReset = configuration.getInt("lengthReset", lengthReset);
-            if (lengthReset <= 0) {
-                throw new ConfigurationException("The configured value for the idle timeout reset, " + lengthReset + ", is not valid.");
-            }
-            if (getLogger().isInfoEnabled()) {
-                getLogger().info("The idle timeout will be reset every " + lengthReset + " bytes.");
-            }
-
-            heloEhloEnforcement = handlerConfiguration.getBoolean("heloEhloEnforcement",true);
-
-            if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
-
-            // get the smtpGreeting
-            smtpGreeting = handlerConfiguration.getString("smtpGreeting",null);
-
-            addressBracketsEnforcement = handlerConfiguration.getBoolean("addressBracketsEnforcement",true);
-        }
-    }
-
-    /**
-     * @see org.apache.james.socket.AbstractConfigurableAsyncServer.AbstractAsyncServer#getDefaultPort()
-     */
-    protected int getDefaultPort() {
-        return 25;
-    }
-
-    /**
-     * @see org.apache.james.core.AbstractProtocolServer#getServiceType()
-     */
-    public String getServiceType() {
-        return "SMTP Service";
-    }
-
-
-    /**
-     * A class to provide SMTP handler configuration to the handlers
-     */
-    private class SMTPHandlerConfigurationDataImpl implements SMTPConfiguration {
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getHelloName()
-         */
-        public String getHelloName() {
-            if (NioSMTPServer.this.getHelloName() == null) {
-                return NioSMTPServer.this.getMailServer().getHelloName();
-            } else {
-                return NioSMTPServer.this.getHelloName();
-            }
-        }
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getResetLength()
-         */
-        public int getResetLength() {
-            return NioSMTPServer.this.lengthReset;
-        }
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getMaxMessageSize()
-         */
-        public long getMaxMessageSize() {
-            return NioSMTPServer.this.maxMessageSize;
-        }
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isAuthSupported(String)
-         */
-        public boolean isRelayingAllowed(String remoteIP) {
-            boolean relayingAllowed = false;
-            if (authorizedNetworks != null) {
-                relayingAllowed = NioSMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
-            }
-            return relayingAllowed;
-        }
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#useHeloEhloEnforcement()
-         */
-        public boolean useHeloEhloEnforcement() {
-            return NioSMTPServer.this.heloEhloEnforcement;
-        }
-
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getSMTPGreeting()
-         */
-        public String getSMTPGreeting() {
-            return NioSMTPServer.this.smtpGreeting;
-        }
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#useAddressBracketsEnforcement()
-         */
-        public boolean useAddressBracketsEnforcement() {
-            return NioSMTPServer.this.addressBracketsEnforcement;
-        }
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isAuthRequired(java.lang.String)
-         */
-        public boolean isAuthRequired(String remoteIP) {
-            if (NioSMTPServer.this.authRequired == AUTH_ANNOUNCE) return true;
-            boolean authRequired = NioSMTPServer.this.authRequired != AUTH_DISABLED;
-            if (authorizedNetworks != null) {
-                authRequired = authRequired && !NioSMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
-            }
-            return authRequired;
-        }
-
-        /**
-         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isStartTLSSupported()
-         */
-        public boolean isStartTLSSupported() {
-            return NioSMTPServer.this.isStartTLSSupported();
-        }
-
-    }
-    
-    @Override
-    protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) {
-        return new SMTPChannelPipelineFactory(getTimeout(), connectionLimit, connPerIP, group);
-    }
-    
-    
-    private final class SMTPChannelPipelineFactory extends AbstractSSLAwareChannelPipelineFactory {
-
-        public SMTPChannelPipelineFactory(int timeout, int maxConnections,
-                int maxConnectsPerIp, ChannelGroup group) {
-            super(timeout, maxConnections, maxConnectsPerIp, group);
-        }
-
-        @Override
-        protected SSLContext getSSLContext() {
-            return NioSMTPServer.this.getSSLContext();
-        }
-
-        @Override
-        protected boolean isSSLSocket() {
-            return  NioSMTPServer.this.isSSLSocket();
-        }
-
-        @Override
-        protected OneToOneEncoder createEncoder() {
-            return new SMTPResponseEncoder();
-        }
-
-        @Override
-        protected ChannelUpstreamHandler createHandler() {
-            return new SMTPChannelUpstreamHandler(handlerChain, theConfigData, getLogger(), getSSLContext());
-        }
-        
-    }
-}
+/****************************************************************
+ * 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.smtpserver.netty;
+
+import javax.annotation.Resource;
+import javax.net.ssl.SSLContext;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.api.dnsservice.util.NetMatcher;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.impl.AbstractSSLAwareChannelPipelineFactory;
+import org.apache.james.protocols.smtp.SMTPConfiguration;
+import org.apache.james.protocols.smtp.SMTPServerMBean;
+import org.apache.james.services.MailServer;
+import org.apache.james.socket.netty.AbstractConfigurableAsyncServer;
+import org.jboss.netty.channel.ChannelPipelineFactory;
+import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.channel.group.ChannelGroup;
+import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
+
+/**
+ * NIO SMTPServer which use Netty
+ * 
+ *
+ */
+public class NioSMTPServer extends AbstractConfigurableAsyncServer implements SMTPServerMBean{
+
+    
+    /**
+     * The handler chain - SMTPhandlers can lookup handlerchain to obtain
+     * Command handlers , Message handlers and connection handlers
+     * Constructed during initialisation to allow dependency injection.
+     */
+    private ProtocolHandlerChain handlerChain;
+
+    /**
+     * Whether authentication is required to use
+     * this SMTP server.
+     */
+    private final static int AUTH_DISABLED = 0;
+    private final static int AUTH_REQUIRED = 1;
+    private final static int AUTH_ANNOUNCE = 2;
+    private int authRequired = AUTH_DISABLED;
+
+    /**
+     * Whether the server needs helo to be send first
+     */
+    private boolean heloEhloEnforcement = false;
+
+    /**
+     * SMTPGreeting to use 
+     */
+    private String smtpGreeting = null;
+
+    /**
+     * This is a Network Matcher that should be configured to contain
+     * authorized networks that bypass SMTP AUTH requirements.
+     */
+    private NetMatcher authorizedNetworks = null;
+
+    /**
+     * The maximum message size allowed by this SMTP server.  The default
+     * value, 0, means no limit.
+     */
+    private long maxMessageSize = 0;
+
+    /**
+     * The number of bytes to read before resetting
+     * the connection timeout timer.  Defaults to
+     * 20 KB.
+     */
+    private int lengthReset = 20 * 1024;
+
+    /**
+     * The configuration data to be passed to the handler
+     */
+    private final SMTPConfiguration theConfigData = new SMTPHandlerConfigurationDataImpl();
+
+    private boolean addressBracketsEnforcement = true;
+
+    private MailServer mailServer;
+
+    @Resource(name="James")
+    public final void setMailServer(MailServer mailServer) {
+        this.mailServer = mailServer;
+    }
+    
+
+    public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+        this.handlerChain = handlerChain;
+    }
+
+    
+    public void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
+        if (isEnabled()) {
+            HierarchicalConfiguration handlerConfiguration = configuration.configurationAt("handler");
+            String authRequiredString = handlerConfiguration.getString("authRequired","false").trim().toLowerCase();
+            if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
+            else if (authRequiredString.equals("announce")) authRequired = AUTH_ANNOUNCE;
+            else authRequired = AUTH_DISABLED;
+            if (authRequired != AUTH_DISABLED) {
+                getLogger().info("This SMTP server requires authentication.");
+            } else {
+                getLogger().info("This SMTP server does not require authentication.");
+            }
+
+            String authorizedAddresses = handlerConfiguration.getString("authorizedAddresses",null);
+            if (authRequired == AUTH_DISABLED && authorizedAddresses == null) {
+                /* if SMTP AUTH is not requred then we will use
+                 * authorizedAddresses to determine whether or not to
+                 * relay e-mail.  Therefore if SMTP AUTH is not
+                 * required, we will not relay e-mail unless the
+                 * sending IP address is authorized.
+                 *
+                 * Since this is a change in behavior for James v2,
+                 * create a default authorizedAddresses network of
+                 * 0.0.0.0/0, which matches all possible addresses, thus
+                 * preserving the current behavior.
+                 *
+                 * James v3 should require the <authorizedAddresses>
+                 * element.
+                 */
+                authorizedAddresses = "0.0.0.0/0.0.0.0";
+            }
+
+            if (authorizedAddresses != null) {
+                java.util.StringTokenizer st = new java.util.StringTokenizer(authorizedAddresses, ", ", false);
+                java.util.Collection<String> networks = new java.util.ArrayList<String>();
+                while (st.hasMoreTokens()) {
+                    String addr = st.nextToken();
+                    networks.add(addr);
+                }
+                authorizedNetworks = new NetMatcher(networks, getDNSService());
+            }
+
+            if (authorizedNetworks != null) {
+                getLogger().info("Authorized addresses: " + authorizedNetworks.toString());
+            }
+
+            // get the message size limit from the conf file and multiply
+            // by 1024, to put it in bytes
+            maxMessageSize = handlerConfiguration.getLong( "maxmessagesize",maxMessageSize ) * 1024;
+            if (maxMessageSize > 0) {
+                getLogger().info("The maximum allowed message size is " + maxMessageSize + " bytes.");
+            } else {
+                getLogger().info("No maximum message size is enforced for this server.");
+            }
+            // How many bytes to read before updating the timer that data is being transfered
+            lengthReset = configuration.getInt("lengthReset", lengthReset);
+            if (lengthReset <= 0) {
+                throw new ConfigurationException("The configured value for the idle timeout reset, " + lengthReset + ", is not valid.");
+            }
+            if (getLogger().isInfoEnabled()) {
+                getLogger().info("The idle timeout will be reset every " + lengthReset + " bytes.");
+            }
+
+            heloEhloEnforcement = handlerConfiguration.getBoolean("heloEhloEnforcement",true);
+
+            if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
+
+            // get the smtpGreeting
+            smtpGreeting = handlerConfiguration.getString("smtpGreeting",null);
+
+            addressBracketsEnforcement = handlerConfiguration.getBoolean("addressBracketsEnforcement",true);
+        }
+    }
+
+    /**
+     * @see org.apache.james.socket.AbstractConfigurableAsyncServer.AbstractAsyncServer#getDefaultPort()
+     */
+    protected int getDefaultPort() {
+        return 25;
+    }
+
+    /**
+     * @see org.apache.james.core.AbstractProtocolServer#getServiceType()
+     */
+    public String getServiceType() {
+        return "SMTP Service";
+    }
+
+
+    /**
+     * A class to provide SMTP handler configuration to the handlers
+     */
+    private class SMTPHandlerConfigurationDataImpl implements SMTPConfiguration {
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getHelloName()
+         */
+        public String getHelloName() {
+            if (NioSMTPServer.this.getHelloName() == null) {
+                return NioSMTPServer.this.mailServer.getHelloName();
+            } else {
+                return NioSMTPServer.this.getHelloName();
+            }
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getResetLength()
+         */
+        public int getResetLength() {
+            return NioSMTPServer.this.lengthReset;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getMaxMessageSize()
+         */
+        public long getMaxMessageSize() {
+            return NioSMTPServer.this.maxMessageSize;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isAuthSupported(String)
+         */
+        public boolean isRelayingAllowed(String remoteIP) {
+            boolean relayingAllowed = false;
+            if (authorizedNetworks != null) {
+                relayingAllowed = NioSMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
+            }
+            return relayingAllowed;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#useHeloEhloEnforcement()
+         */
+        public boolean useHeloEhloEnforcement() {
+            return NioSMTPServer.this.heloEhloEnforcement;
+        }
+
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getSMTPGreeting()
+         */
+        public String getSMTPGreeting() {
+            return NioSMTPServer.this.smtpGreeting;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#useAddressBracketsEnforcement()
+         */
+        public boolean useAddressBracketsEnforcement() {
+            return NioSMTPServer.this.addressBracketsEnforcement;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isAuthRequired(java.lang.String)
+         */
+        public boolean isAuthRequired(String remoteIP) {
+            if (NioSMTPServer.this.authRequired == AUTH_ANNOUNCE) return true;
+            boolean authRequired = NioSMTPServer.this.authRequired != AUTH_DISABLED;
+            if (authorizedNetworks != null) {
+                authRequired = authRequired && !NioSMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
+            }
+            return authRequired;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isStartTLSSupported()
+         */
+        public boolean isStartTLSSupported() {
+            return NioSMTPServer.this.isStartTLSSupported();
+        }
+
+    }
+    
+    @Override
+    protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) {
+        return new SMTPChannelPipelineFactory(getTimeout(), connectionLimit, connPerIP, group);
+    }
+    
+    
+    private final class SMTPChannelPipelineFactory extends AbstractSSLAwareChannelPipelineFactory {
+
+        public SMTPChannelPipelineFactory(int timeout, int maxConnections,
+                int maxConnectsPerIp, ChannelGroup group) {
+            super(timeout, maxConnections, maxConnectsPerIp, group);
+        }
+
+        @Override
+        protected SSLContext getSSLContext() {
+            return NioSMTPServer.this.getSSLContext();
+        }
+
+        @Override
+        protected boolean isSSLSocket() {
+            return  NioSMTPServer.this.isSSLSocket();
+        }
+
+        @Override
+        protected OneToOneEncoder createEncoder() {
+            return new SMTPResponseEncoder();
+        }
+
+        @Override
+        protected ChannelUpstreamHandler createHandler() {
+            return new SMTPChannelUpstreamHandler(handlerChain, theConfigData, getLogger(), getSSLContext());
+        }
+        
+    }
+}

Modified: james/server/trunk/spoolmanager/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/pom.xml?rev=954538&r1=954537&r2=954538&view=diff
==============================================================================
--- james/server/trunk/spoolmanager/pom.xml (original)
+++ james/server/trunk/spoolmanager/pom.xml Mon Jun 14 16:17:44 2010
@@ -1,125 +1,123 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
-<!--
-  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.    
--->
-<project>
-  <parent>
-    <artifactId>james-server</artifactId>
-    <groupId>org.apache.james</groupId>
-    <version>3.0-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.james</groupId>
-  <artifactId>james-server-spoolmanager</artifactId>
-  <name>Apache JAMES Server SpoolManager</name>
-  <dependencies>
-    <dependency>
-      <groupId>${javax.mail.groupId}</groupId>
-      <artifactId>${javax.mail.artifactId}</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-mailet</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-user-library</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-core-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-user-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-domain-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-common-util</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-core-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-mailet-base</artifactId>
-    </dependency>
-
-    <dependency>
-       <groupId>org.apache.geronimo.specs</groupId>
-       <artifactId>geronimo-annotation_1.0_spec</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-james-imap-mailbox</artifactId>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-jsieve-mailet</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging-api</artifactId>
-    </dependency> 
-    <dependency>
-      <groupId>commons-configuration</groupId>
-      <artifactId>commons-configuration</artifactId>
-    </dependency>
-
-   <dependency>
-     <groupId>org.apache.camel</groupId>
-     <artifactId>camel-core</artifactId>
-   </dependency>
-    <dependency>
-      <groupId>oro</groupId>
-      <artifactId>oro</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-core-library</artifactId>
-      <type>test-jar</type>
-      <scope>runtime</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-mailet-base</artifactId>
-      <classifier>tests</classifier>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-user-library</artifactId>
-      <type>test-jar</type>
-      <scope>runtime</scope>
-    </dependency>
-  </dependencies>
-</project>
+<?xml version="1.0" encoding="ISO-8859-15"?>
+<!--
+  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.    
+-->
+<project>
+  <parent>
+    <artifactId>james-server</artifactId>
+    <groupId>org.apache.james</groupId>
+    <version>3.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.james</groupId>
+  <artifactId>james-server-spoolmanager</artifactId>
+  <name>Apache JAMES Server SpoolManager</name>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-user-library</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-core-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-user-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-domain-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-common-util</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-core-library</artifactId>
+    </dependency>
+     <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-mailet</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-mailet-base</artifactId>
+    </dependency>   
+     <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-jsieve-mailet</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-james-imap-mailbox</artifactId>
+    </dependency>
+  
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging-api</artifactId>
+    </dependency> 
+    <dependency>
+      <groupId>commons-configuration</groupId>
+      <artifactId>commons-configuration</artifactId>
+    </dependency>
+      
+    <dependency>
+      <groupId>${javax.mail.groupId}</groupId>
+      <artifactId>${javax.mail.artifactId}</artifactId>
+    </dependency>
+    <dependency>
+       <groupId>org.apache.geronimo.specs</groupId>
+       <artifactId>geronimo-annotation_1.0_spec</artifactId>
+    </dependency>
+   <dependency>
+     <groupId>org.apache.camel</groupId>
+     <artifactId>camel-core</artifactId>
+   </dependency>
+    <dependency>
+      <groupId>oro</groupId>
+      <artifactId>oro</artifactId>
+    </dependency>
+    
+    <!-- Test dependencies -->
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-core-library</artifactId>
+      <type>test-jar</type>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-mailet-base</artifactId>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-user-library</artifactId>
+      <type>test-jar</type>
+      <scope>runtime</scope>
+    </dependency>
+  </dependencies>
+</project>

Modified: james/server/trunk/user-function/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/user-function/pom.xml?rev=954538&r1=954537&r2=954538&view=diff
==============================================================================
--- james/server/trunk/user-function/pom.xml (original)
+++ james/server/trunk/user-function/pom.xml Mon Jun 14 16:17:44 2010
@@ -29,14 +29,6 @@
   <name>Apache JAMES Server User function</name>
   <dependencies>
     <dependency>
-      <groupId>${javax.mail.groupId}</groupId>
-      <artifactId>${javax.mail.artifactId}</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>apache-mailet</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-common-util</artifactId>
     </dependency>
@@ -55,12 +47,15 @@
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-user-library</artifactId>
-      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-core-function</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-mailet</artifactId>
+    </dependency>
      <dependency>
       <groupId>commons-configuration</groupId>
       <artifactId>commons-configuration</artifactId>
@@ -70,10 +65,16 @@
       <artifactId>commons-logging</artifactId>
     </dependency>
     <dependency>
+      <groupId>${javax.mail.groupId}</groupId>
+      <artifactId>${javax.mail.artifactId}</artifactId>
+    </dependency>
+    <dependency>
       <groupId>javax.annotation</groupId>
       <artifactId>jsr250-api</artifactId>
     </dependency>
         
+        
+    <!-- Test dependencies -->
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-user-library</artifactId>
@@ -86,7 +87,6 @@
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
-    
     <dependency>
       <groupId>commons-dbcp</groupId>
       <artifactId>commons-dbcp</artifactId>

Modified: james/server/trunk/user-library/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/user-library/pom.xml?rev=954538&r1=954537&r2=954538&view=diff
==============================================================================
--- james/server/trunk/user-library/pom.xml (original)
+++ james/server/trunk/user-library/pom.xml Mon Jun 14 16:17:44 2010
@@ -26,7 +26,6 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.james</groupId>
   <artifactId>james-server-user-library</artifactId>
-  <version>3.0-SNAPSHOT</version>
   <name>Apache JAMES Server User Library</name>
   <dependencies>
     <dependency>
@@ -35,10 +34,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>
-      <artifactId>apache-mailet</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
       <artifactId>james-server-common-util</artifactId>
     </dependency>
     <dependency>
@@ -50,13 +45,8 @@
       <artifactId>james-server-domain-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>${javax.mail.groupId}</groupId>
-      <artifactId>${javax.mail.artifactId}</artifactId>
-    </dependency>
-    
-    <dependency>
-      <groupId>oro</groupId>
-      <artifactId>oro</artifactId>
+      <groupId>org.apache.james</groupId>
+      <artifactId>apache-mailet</artifactId>
     </dependency>
     
     <dependency>
@@ -72,6 +62,16 @@
       <artifactId>jsr250-api</artifactId>
     </dependency>
     <dependency>
+      <groupId>${javax.mail.groupId}</groupId>
+      <artifactId>${javax.mail.artifactId}</artifactId>
+    </dependency>   
+    <dependency>
+      <groupId>oro</groupId>
+      <artifactId>oro</artifactId>
+    </dependency>
+    
+    <!--  Test dependencies -->
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org