📄 smtpserver.java
字号:
/*********************************************************************** * Copyright (c) 2000-2004 The Apache Software Foundation. * * All rights reserved. * * ------------------------------------------------------------------- * * Licensed 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;import org.apache.avalon.cornerstone.services.connection.ConnectionHandler;import org.apache.avalon.excalibur.pool.DefaultPool;import org.apache.avalon.excalibur.pool.HardResourceLimitingPool;import org.apache.avalon.excalibur.pool.ObjectFactory;import org.apache.avalon.excalibur.pool.Pool;import org.apache.avalon.excalibur.pool.Poolable;import org.apache.avalon.framework.activity.Disposable;import org.apache.avalon.framework.activity.Initializable;import org.apache.avalon.framework.component.ComponentException;import org.apache.avalon.framework.component.ComponentManager;import org.apache.avalon.framework.configuration.Configuration;import org.apache.avalon.framework.configuration.ConfigurationException;import org.apache.avalon.framework.component.Component;import org.apache.avalon.framework.activity.Disposable;import org.apache.avalon.framework.logger.LogEnabled;import org.apache.james.Constants;import org.apache.james.core.AbstractJamesService;import org.apache.james.services.MailServer;import org.apache.james.services.UsersRepository;import org.apache.james.services.UsersStore;import org.apache.james.util.NetMatcher;import org.apache.james.util.watchdog.Watchdog;import org.apache.james.util.watchdog.WatchdogFactory;import org.apache.mailet.MailetContext;/** * <p>Accepts SMTP connections on a server socket and dispatches them to SMTPHandlers.</p> * * <p>Also responsible for loading and parsing SMTP specific configuration.</p> * * @version 1.1.0, 06/02/2001 *//* * IMPORTANT: SMTPServer extends AbstractJamesService. If you implement ANY * lifecycle methods, you MUST call super.<method> as well. */public class SMTPServer extends AbstractJamesService implements Component, SMTPServerMBean { /** * The mailet context - we access it here to set the hello name for the Mailet API */ MailetContext mailetcontext; /** * The user repository for this server - used to authenticate * users. */ private UsersRepository users; /** * The internal mail server service. */ private MailServer mailServer; /** * Whether authentication is required to use * this SMTP server. */ private boolean authRequired = false; /** * Whether the server verifies that the user * actually sending an email matches the * authentication credentials attached to the * SMTP interaction. */ private boolean verifyIdentity = false; /** * 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 pool used to provide SMTP Handler objects */ private Pool theHandlerPool = null; /** * The pool used to provide SMTP Handler objects */ private ObjectFactory theHandlerFactory = new SMTPHandlerFactory(); /** * The factory used to generate Watchdog objects */ private WatchdogFactory theWatchdogFactory; /** * The configuration data to be passed to the handler */ private SMTPHandlerConfigurationData theConfigData = new SMTPHandlerConfigurationDataImpl(); /** * @see org.apache.avalon.framework.component.Composable#compose(ComponentManager) */ public void compose(final ComponentManager componentManager) throws ComponentException { super.compose(componentManager); mailetcontext = (MailetContext) componentManager.lookup("org.apache.mailet.MailetContext"); mailServer = (MailServer) componentManager.lookup("org.apache.james.services.MailServer"); UsersStore usersStore = (UsersStore) componentManager.lookup("org.apache.james.services.UsersStore"); users = usersStore.getRepository("LocalUsers"); if (users == null) { throw new ComponentException("The user repository could not be found."); } } /** * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) */ public void configure(final Configuration configuration) throws ConfigurationException { super.configure(configuration); if (isEnabled()) { mailetcontext.setAttribute(Constants.HELLO_NAME, helloName); Configuration handlerConfiguration = configuration.getChild("handler"); authRequired = handlerConfiguration.getChild("authRequired").getValueAsBoolean(false); verifyIdentity = handlerConfiguration.getChild("verifyIdentity").getValueAsBoolean(false); if (authRequired) { if (verifyIdentity) { getLogger().info("This SMTP server requires authentication and verifies that the authentication credentials match the sender address."); } else { getLogger().info("This SMTP server requires authentication, but doesn't verify that the authentication credentials match the sender address."); } } else { getLogger().info("This SMTP server does not require authentication."); } String authorizedAddresses = handlerConfiguration.getChild("authorizedAddresses").getValue(null); if (!authRequired && 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 networks = new java.util.ArrayList(); while (st.hasMoreTokens()) { String addr = st.nextToken(); networks.add(addr); } authorizedNetworks = new NetMatcher(networks); } 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.getChild( "maxmessagesize" ).getValueAsLong( maxMessageSize ) * 1024; if (maxMessageSize > 0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -