Author: bago
Date: Fri Apr 7 02:15:34 2006
New Revision: 392227
URL: http://svn.apache.org/viewcvs?rev=392227&view=rev
Log:
Make SMTP message queuing configurable (as an Handler) (JAMES-469)
Added:
james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java
Modified:
james/server/trunk/src/conf/james-config.xml
james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
james/server/trunk/src/test/org/apache/james/test/util/Util.java
Modified: james/server/trunk/src/conf/james-config.xml
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/conf/james-config.xml?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/conf/james-config.xml (original)
+++ james/server/trunk/src/conf/james-config.xml Fri Apr 7 02:15:34 2006
@@ -742,6 +742,12 @@
<headervalue>passed</headervalue>
</handler>
-->
+
+ <!-- The default message receiving handler -->
+ <!-- The default behaviour is to put the message in the root
processor of -->
+ <!-- the spooler -->
+ <handler class="org.apache.james.smtpserver.SendMailHandler">
+ </handler>
</handlerchain>
</handler>
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java
Fri Apr 7 02:15:34 2006
@@ -60,10 +60,6 @@
// Keys used to store/lookup data in the internal state hash map
- private final static String SENDER = "SENDER_ADDRESS"; // Sender's
email address
- private final static String MESG_FAILED = "MESG_FAILED"; // Message
failed flag
- private final static String RCPT_LIST = "RCPT_LIST"; // The message
recipients
-
/**
* The mail attribute holding the SMTP AUTH user name, if any.
*/
@@ -74,11 +70,11 @@
*/
private final static char[] SMTPTerminator = { '\r', '\n', '.', '\r', '\n'
};
- /*
+ /**
* process DATA command
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
- **/
+ */
public void onCommand(SMTPSession session) {
doDATA(session, session.getCommandArgument());
}
@@ -98,10 +94,10 @@
responseString = "500
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+"
Unexpected argument provided with DATA command";
session.writeResponse(responseString);
}
- if (!session.getState().containsKey(SENDER)) {
+ if (!session.getState().containsKey(SMTPSession.SENDER)) {
responseString = "503
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No sender
specified";
session.writeResponse(responseString);
- } else if (!session.getState().containsKey(RCPT_LIST)) {
+ } else if (!session.getState().containsKey(SMTPSession.RCPT_LIST)) {
responseString = "503
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No
recipients specified";
session.writeResponse(responseString);
} else {
@@ -144,7 +140,7 @@
// logging of extra lines of data
// that are sent after the size limit has
// been hit.
- session.getState().put(MESG_FAILED, Boolean.TRUE);
+ session.getState().put(SMTPSession.MESG_FAILED,
Boolean.TRUE);
// then let the client know that the size
// limit has been hit.
responseString = "552
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_MSG_TOO_BIG)+" Error
processing message: "
@@ -152,7 +148,7 @@
StringBuffer errorBuffer =
new StringBuffer(256)
.append("Rejected message from ")
- .append(session.getState().get(SENDER).toString())
+
.append(session.getState().get(SMTPSession.SENDER).toString())
.append(" from host ")
.append(session.getRemoteHost())
.append(" (")
@@ -193,8 +189,8 @@
if (!headers.isSet(RFC2822Headers.DATE)) {
headers.setHeader(RFC2822Headers.DATE, rfc822DateFormat.format(new
Date()));
}
- if (!headers.isSet(RFC2822Headers.FROM) &&
session.getState().get(SENDER) != null) {
- headers.setHeader(RFC2822Headers.FROM,
session.getState().get(SENDER).toString());
+ if (!headers.isSet(RFC2822Headers.FROM) &&
session.getState().get(SMTPSession.SENDER) != null) {
+ headers.setHeader(RFC2822Headers.FROM,
session.getState().get(SMTPSession.SENDER).toString());
}
// RFC 2821 says that we cannot examine the message to see if
// Return-Path headers are present. If there is one, our
@@ -222,14 +218,14 @@
.append(") with SMTP ID ")
.append(session.getSessionID());
- if (((Collection) session.getState().get(RCPT_LIST)).size() == 1) {
+ if (((Collection)
session.getState().get(SMTPSession.RCPT_LIST)).size() == 1) {
// Only indicate a recipient if they're the only recipient
// (prevents email address harvesting and large headers in
// bulk email)
newHeaders.addHeaderLine(headerLineBuffer.toString());
headerLineBuffer.delete(0, headerLineBuffer.length());
headerLineBuffer.append(" for <")
- .append(((List)
session.getState().get(RCPT_LIST)).get(0).toString())
+ .append(((List)
session.getState().get(SMTPSession.RCPT_LIST)).get(0).toString())
.append(">;");
newHeaders.addHeaderLine(headerLineBuffer.toString());
headerLineBuffer.delete(0, headerLineBuffer.length());
@@ -264,10 +260,10 @@
List recipientCollection = null;
try {
headersIn = new ByteArrayInputStream(headers.toByteArray());
- recipientCollection = (List) session.getState().get(RCPT_LIST);
+ recipientCollection = (List)
session.getState().get(SMTPSession.RCPT_LIST);
mail =
new
MailImpl(session.getConfigurationData().getMailServer().getId(),
- (MailAddress) session.getState().get(SENDER),
+ (MailAddress)
session.getState().get(SMTPSession.SENDER),
recipientCollection,
new SequenceInputStream(new
SequenceInputStream(headersIn, msgIn),
new ReaderInputStream(new
StringReader("\r\n"))));
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java
Fri Apr 7 02:15:34 2006
@@ -37,11 +37,6 @@
private final static String COMMAND_NAME = "EHLO";
/**
- * The helo mode set in state object
- */
- private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; //
HELO or EHLO
-
- /**
* set checkValidHelo to false as default value
*/
private boolean checkValidEhlo = false;
@@ -97,7 +92,7 @@
session.writeResponse(responseString);
} else if (badEhlo == false){
session.resetState();
- session.getState().put(CURRENT_HELO_MODE, COMMAND_NAME);
+ session.getState().put(SMTPSession.CURRENT_HELO_MODE,
COMMAND_NAME);
ArrayList esmtpextensions = new ArrayList();
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java
Fri Apr 7 02:15:34 2006
@@ -36,11 +36,6 @@
private final static String COMMAND_NAME = "HELO";
/**
- * The key used to store helo mode
- */
- private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; //
HELO or EHLO
-
- /**
* set checkValidHelo to false as default value
*/
private boolean checkValidHelo = false;
@@ -98,7 +93,7 @@
getLogger().info(responseString);
} else if (badHelo == false) {
session.resetState();
- session.getState().put(CURRENT_HELO_MODE, COMMAND_NAME);
+ session.getState().put(SMTPSession.CURRENT_HELO_MODE,
COMMAND_NAME);
session.getResponseBuffer().append("250 ")
.append(session.getConfigurationData().getHelloName())
.append(" Hello ")
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java
Fri Apr 7 02:15:34 2006
@@ -42,13 +42,6 @@
private final static String MESG_SIZE = "MESG_SIZE"; // The size of the
message
- private final static String SENDER = "SENDER_ADDRESS"; // Sender's
email address
-
- /**
- * The helo mode set in state object
- */
- private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; //
HELO or EHLO
-
private boolean checkValidSenderDomain = false;
/**
@@ -89,10 +82,10 @@
sender = argument.substring(colonIndex + 1);
argument = argument.substring(0, colonIndex);
}
- if (session.getState().containsKey(SENDER)) {
+ if (session.getState().containsKey(SMTPSession.SENDER)) {
responseString = "503
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Sender
already specified";
session.writeResponse(responseString);
- } else if (!session.getState().containsKey(CURRENT_HELO_MODE)) {
+ } else if
(!session.getState().containsKey(SMTPSession.CURRENT_HELO_MODE)) {
responseString = "503
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need HELO
or EHLO before MAIL";
session.writeResponse(responseString);
} else if (argument == null ||
!argument.toUpperCase(Locale.US).equals("FROM")
@@ -209,7 +202,7 @@
}
if (!badSenderDomain) {
- session.getState().put(SENDER, senderAddress);
+ session.getState().put(SMTPSession.SENDER, senderAddress);
responseBuffer.append("250
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_OTHER)+" Sender <")
.append(sender)
.append("> OK");
@@ -254,7 +247,7 @@
StringBuffer errorBuffer =
new StringBuffer(256)
.append("Rejected message from ")
- .append(tempSender != null ? tempSender.toString() : null)
+ .append(tempSender != null ? tempSender : null)
.append(" from host ")
.append(session.getRemoteHost())
.append(" (")
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
Fri Apr 7 02:15:34 2006
@@ -38,8 +38,6 @@
/**
* The keys used to store sender and recepients in the SMTPSession state
*/
- private final static String SENDER = "SENDER_ADDRESS"; // Sender's
email address
- private final static String RCPT_LIST = "RCPT_LIST"; // The message
recipients
private final static String RCPTCOUNT = "RCPT_COUNT";
private int maxRcpt = 0;
@@ -82,7 +80,7 @@
recipient = argument.substring(colonIndex + 1);
argument = argument.substring(0, colonIndex);
}
- if (!session.getState().containsKey(SENDER)) {
+ if (!session.getState().containsKey(SMTPSession.SENDER)) {
responseString = "503
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need MAIL
before RCPT";
session.writeResponse(responseString);
} else if (argument == null ||
!argument.toUpperCase(Locale.US).equals("TO")
@@ -90,7 +88,7 @@
responseString = "501
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_SYNTAX)+" Usage:
RCPT TO:<recipient>";
session.writeResponse(responseString);
} else {
- Collection rcptColl = (Collection)
session.getState().get(RCPT_LIST);
+ Collection rcptColl = (Collection)
session.getState().get(SMTPSession.RCPT_LIST);
if (rcptColl == null) {
rcptColl = new ArrayList();
}
@@ -174,7 +172,7 @@
// Identity verification checking
if (session.getConfigurationData().isVerifyIdentity()) {
String authUser =
(session.getUser()).toLowerCase(Locale.US);
- MailAddress senderAddress = (MailAddress)
session.getState().get(SENDER);
+ MailAddress senderAddress = (MailAddress)
session.getState().get(SMTPSession.SENDER);
if ((senderAddress == null) ||
(!authUser.equals(senderAddress.getUser())) ||
(!session.getConfigurationData().getMailServer().isLocalServer(senderAddress.getHost())))
{
@@ -262,7 +260,7 @@
if (maxRcptReached == false) {
rcptColl.add(recipientAddress);
- session.getState().put(RCPT_LIST, rcptColl);
+ session.getState().put(SMTPSession.RCPT_LIST, rcptColl);
responseBuffer.append("250
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_VALID)+" Recipient <")
.append(recipient)
.append("> OK");
@@ -280,8 +278,8 @@
} else if(null!=recipient) {
sb.append(" [to:" + recipient + "]");
}
- if (null!=session.getState().get(SENDER)) {
- sb.append(" [from:" +
((MailAddress)session.getState().get(SENDER)).toInternetAddress().getAddress()
+ "]");
+ if (null!=session.getState().get(SMTPSession.SENDER)) {
+ sb.append(" [from:" +
((MailAddress)session.getState().get(SMTPSession.SENDER)).toInternetAddress().getAddress()
+ "]");
}
return sb.toString();
}
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
Fri Apr 7 02:15:34 2006
@@ -25,14 +25,11 @@
import org.apache.james.Constants;
import org.apache.james.util.CRLFTerminatedReader;
import org.apache.james.util.InternetPrintWriter;
-import org.apache.james.util.mail.dsn.DSNStatus;
import org.apache.james.util.watchdog.Watchdog;
import org.apache.james.util.watchdog.WatchdogTarget;
import org.apache.mailet.Mail;
import org.apache.mailet.dates.RFC822DateFormat;
-import javax.mail.MessagingException;
-
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.IOException;
@@ -43,7 +40,6 @@
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -74,12 +70,6 @@
private final static String SOFTWARE_TYPE = "JAMES SMTP Server "
+ Constants.SOFTWARE_VERSION;
- // Keys used to store/lookup data in the internal state hash map
- private final static String SENDER = "SENDER_ADDRESS"; // Sender's
email address
- private final static String MESG_FAILED = "MESG_FAILED"; // Message
failed flag
- private final static String RCPT_LIST = "RCPT_LIST"; // The message
recipients
- private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; //
HELO or EHLO
-
/**
* Static Random instance used to generate SMTP ids
*/
@@ -416,12 +406,6 @@
}
}
- //if the message is not aborted, then send Mail
- if(mode == MESSAGE_RECEIVED_MODE) {
- getLogger().info("sending mail");
- sendMail(mail);
- }
-
//do the clean up
if(mail != null) {
if (mail instanceof Disposable) {
@@ -593,73 +577,6 @@
}
/**
- * delivers the mail to the spool.
- *
- * @param Mail the mail object
- */
- public void sendMail(Mail mail) {
- String responseString = null;
- try {
- setMail(mail);
- theConfigData.getMailServer().sendMail(mail);
- Collection theRecipients = mail.getRecipients();
- String recipientString = "";
- if (theRecipients != null) {
- recipientString = theRecipients.toString();
- }
- if (getLogger().isInfoEnabled()) {
- StringBuffer infoBuffer =
- new StringBuffer(256)
- .append("Successfully spooled mail ")
- .append(mail.getName())
- .append(" from ")
- .append(mail.getSender())
- .append(" on ")
- .append(remoteIP)
- .append(" for ")
- .append(recipientString);
- getLogger().info(infoBuffer.toString());
- }
- } catch (MessagingException me) {
- // Grab any exception attached to this one.
- Exception e = me.getNextException();
- // If there was an attached exception, and it's a
- // MessageSizeException
- if (e != null && e instanceof MessageSizeException) {
- // Add an item to the state to suppress
- // logging of extra lines of data
- // that are sent after the size limit has
- // been hit.
- state.put(MESG_FAILED, Boolean.TRUE);
- // then let the client know that the size
- // limit has been hit.
- responseString = "552
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_MSG_TOO_BIG)+" Error
processing message: "
- + e.getMessage();
- StringBuffer errorBuffer =
- new StringBuffer(256)
- .append("Rejected message from ")
- .append(state.get(SENDER).toString())
- .append(" from host ")
- .append(remoteHost)
- .append(" (")
- .append(remoteIP)
- .append(") exceeding system maximum message size of ")
- .append(theConfigData.getMaxMessageSize());
- getLogger().error(errorBuffer.toString());
- } else {
- responseString = "451
"+DSNStatus.getStatus(DSNStatus.TRANSIENT,DSNStatus.UNDEFINED_STATUS)+" Error
processing message: "
- + me.getMessage();
- getLogger().error("Unknown error occurred while processing
DATA.", me);
- }
- writeResponse(responseString);
- return;
- }
- responseString = "250
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.CONTENT_OTHER)+" Message
received";
- writeResponse(responseString);
- }
-
-
- /**
* @see org.apache.james.smtpserver.SMTPSession#writeResponse(String)
*/
public void writeResponse(String respString) {
@@ -854,5 +771,4 @@
mode = MESSAGE_ABORT_MODE;
}
-
-}
+}
\ No newline at end of file
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
---
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
(original)
+++
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
Fri Apr 7 02:15:34 2006
@@ -21,32 +21,42 @@
import java.util.List;
import java.util.HashMap;
import java.util.Locale;
+
+import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.container.ContainerUtil;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.logger.LogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
/**
* The SMTPHandlerChain is per service object providing access
* ConnectHandlers, Commandhandlers and message handlers
*/
-public class SMTPHandlerChain extends AbstractLogEnabled {
+public class SMTPHandlerChain extends AbstractLogEnabled implements
Configurable, Serviceable {
private HashMap commandHandlerMap = new HashMap();
private ArrayList messageHandlers = new ArrayList();
private ArrayList connectHandlers = new ArrayList();
private final CommandHandler unknownHandler = new UnknownCmdHandler();
+ private ServiceManager serviceManager;
private final static String[] mandatoryCommands = { "MAIL" , "RCPT",
"DATA"};
+ public void service(ServiceManager arg0) throws ServiceException {
+ serviceManager = arg0;
+ }
+
/**
* loads the various handlers from the configuration
* @param configuration configuration under handlerchain node
*/
- void load(Configuration configuration) throws ConfigurationException {
+ public void configure(Configuration configuration) throws
ConfigurationException {
addToMap(UnknownCmdHandler.UNKNOWN_COMMAND, unknownHandler);
if(configuration != null) {
Configuration[] children = configuration.getChildren("handler");
@@ -64,6 +74,9 @@
((LogEnabled)handler).enableLogging(getLogger());
}
+ //servicing the handler
+ ContainerUtil.service(handler,serviceManager);
+
//configure the handler
ContainerUtil.configure(handler,children[i]);
@@ -96,16 +109,20 @@
} catch (ClassNotFoundException ex) {
if (getLogger().isErrorEnabled()) {
- getLogger().error("Failed to add
Commandhandler: " + className);
+ getLogger().error("Failed to add
Commandhandler: " + className,ex);
}
} catch (IllegalAccessException ex) {
if (getLogger().isErrorEnabled()) {
- getLogger().error("Failed to add
Commandhandler: " + className);
+ getLogger().error("Failed to add
Commandhandler: " + className,ex);
}
} catch (InstantiationException ex) {
if (getLogger().isErrorEnabled()) {
- getLogger().error("Failed to add
Commandhandler: " + className);
+ getLogger().error("Failed to add
Commandhandler: " + className,ex);
}
+ } catch (ServiceException e) {
+ if (getLogger().isErrorEnabled()) {
+ getLogger().error("Failed to service
Commandhandler: " + className,e);
+ }
}
}
}
@@ -132,6 +149,13 @@
if(!found) {
throw new ConfigurationException("No commandhandlers
configured for mandatory commands");
+ }
+
+ if (messageHandlers.size() == 0) {
+ if (getLogger().isErrorEnabled()) {
+ getLogger().error("No messageHandler configured. Check
that SendMailHandler is configured in the SMTPHandlerChain");
+ }
+ throw new ConfigurationException("No messageHandler
configured");
}
}
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java Fri
Apr 7 02:15:34 2006
@@ -132,11 +132,14 @@
private SMTPHandlerConfigurationData theConfigData
= new SMTPHandlerConfigurationDataImpl();
+ private ServiceManager serviceManager;
+
/**
* @see
org.apache.avalon.framework.service.Serviceable#service(ServiceManager)
*/
public void service( final ServiceManager manager ) throws
ServiceException {
super.service( manager );
+ serviceManager = manager;
mailetcontext = (MailetContext)
manager.lookup("org.apache.mailet.MailetContext");
mailServer = (MailServer) manager.lookup(MailServer.ROLE);
users = (UsersRepository) manager.lookup(UsersRepository.ROLE);
@@ -218,8 +221,17 @@
//set the logger
ContainerUtil.enableLogging(handlerChain,getLogger());
+ try {
+ ContainerUtil.service(handlerChain,serviceManager);
+ } catch (ServiceException e) {
+ if (getLogger().isErrorEnabled()) {
+ getLogger().error("Failed to service handlerChain",e);
+ }
+ throw new ConfigurationException("Failed to service
handlerChain");
+ }
+
//read from the XML configuration and create and configure each of
the handlers
- handlerChain.load(handlerConfiguration.getChild("handlerchain"));
+
ContainerUtil.configure(handlerChain,handlerConfiguration.getChild("handlerchain"));
} else {
mailetcontext.setAttribute(Constants.HELLO_NAME, "localhost");
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
Fri Apr 7 02:15:34 2006
@@ -32,6 +32,12 @@
public interface SMTPSession {
+ // Keys used to store/lookup data in the internal state hash map
+ public final static String MESG_FAILED = "MESG_FAILED"; // Message
failed flag
+ public final static String SENDER = "SENDER_ADDRESS"; // Sender's
email address
+ public final static String RCPT_LIST = "RCPT_LIST"; // The message
recipients
+ public final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; //
HELO or EHLO
+
/**
* Writes response string to the client
*
Added:
james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java?rev=392227&view=auto
==============================================================================
---
james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java
(added)
+++
james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java
Fri Apr 7 02:15:34 2006
@@ -0,0 +1,119 @@
+/***********************************************************************
+ * Copyright (c) 1999-2006 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.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.james.services.MailServer;
+import org.apache.james.util.mail.dsn.DSNStatus;
+import org.apache.mailet.Mail;
+
+import javax.mail.MessagingException;
+
+import java.util.Collection;
+
+
+/**
+ * Adds the header to the message
+ */
+public class SendMailHandler
+ extends AbstractLogEnabled
+ implements MessageHandler, Serviceable {
+
+ private MailServer mailServer;
+
+ /**
+ * @see
org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
+ */
+ public void service(ServiceManager serviceManager) throws ServiceException
{
+ mailServer = (MailServer) serviceManager.lookup(MailServer.ROLE);
+ }
+
+ /**
+ * Adds header to the message
+ * @see org.apache.james.smtpserver#onMessage(SMTPSession)
+ */
+ public void onMessage(SMTPSession session) {
+ getLogger().info("sending mail");
+
+ Mail mail = session.getMail();
+
+ String responseString = null;
+ try {
+ mailServer.sendMail(mail);
+ Collection theRecipients = mail.getRecipients();
+ String recipientString = "";
+ if (theRecipients != null) {
+ recipientString = theRecipients.toString();
+ }
+ if (getLogger().isInfoEnabled()) {
+ StringBuffer infoBuffer =
+ new StringBuffer(256)
+ .append("Successfully spooled mail ")
+ .append(mail.getName())
+ .append(" from ")
+ .append(mail.getSender())
+ .append(" on ")
+ .append(session.getRemoteIPAddress())
+ .append(" for ")
+ .append(recipientString);
+ getLogger().info(infoBuffer.toString());
+ }
+ } catch (MessagingException me) {
+ // Grab any exception attached to this one.
+ Exception e = me.getNextException();
+ // If there was an attached exception, and it's a
+ // MessageSizeException
+ if (e != null && e instanceof MessageSizeException) {
+ // Add an item to the state to suppress
+ // logging of extra lines of data
+ // that are sent after the size limit has
+ // been hit.
+ session.getState().put(SMTPSession.MESG_FAILED,
Boolean.TRUE);
+ // then let the client know that the size
+ // limit has been hit.
+ responseString = "552
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_MSG_TOO_BIG)+" Error
processing message: "
+ + e.getMessage();
+ StringBuffer errorBuffer =
+ new StringBuffer(256)
+ .append("Rejected message from ")
+
.append(session.getState().get(SMTPSession.SENDER).toString())
+ .append(" from host ")
+ .append(session.getRemoteHost())
+ .append(" (")
+ .append(session.getRemoteIPAddress())
+ .append(") exceeding system maximum message size of ")
+
.append(session.getConfigurationData().getMaxMessageSize());
+ getLogger().error(errorBuffer.toString());
+ } else {
+ responseString = "451
"+DSNStatus.getStatus(DSNStatus.TRANSIENT,DSNStatus.UNDEFINED_STATUS)+" Error
processing message: "
+ + me.getMessage();
+ getLogger().error("Unknown error occurred while processing
DATA.", me);
+ }
+ session.writeResponse(responseString);
+ return;
+ }
+ responseString = "250
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.CONTENT_OTHER)+" Message
received";
+ session.writeResponse(responseString);
+
+
+ }
+
+}
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
---
james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java
(original)
+++
james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java
Fri Apr 7 02:15:34 2006
@@ -30,12 +30,6 @@
public static final String UNKNOWN_COMMAND = "UNKNOWN";
/**
- * Message failed flag to indicate if there is any failure
- */
- private final static String MESG_FAILED = "MESG_FAILED";
-
-
- /**
* Handler method called upon receipt of an unrecognized command.
* Returns an error response and logs the command.
*
@@ -44,7 +38,7 @@
public void onCommand(SMTPSession session) {
//If there was message failure, don't consider it as an unknown command
- if (session.getState().get(MESG_FAILED) != null) {
+ if (session.getState().get(SMTPSession.MESG_FAILED) != null) {
return;
}
Modified:
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
---
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
(original)
+++
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
Fri Apr 7 02:15:34 2006
@@ -109,23 +109,24 @@
handlerConfig.addChild(Util.getValuedConfiguration("authRequired",
m_authorizingMode));
if (m_verifyIdentity)
handlerConfig.addChild(Util.getValuedConfiguration("verifyIdentity", "" +
m_verifyIdentity));
-
handlerConfig.addChild(Util.createRemoteManagerHandlerChainConfiguration());
+ handlerConfig.addChild(Util.createSMTPHandlerChainConfiguration());
// Add Configuration for Helo checks and Ehlo checks
Configuration[] heloConfig =
handlerConfig.getChild("handlerchain").getChildren("handler");
for (int i = 0; i < heloConfig.length; i++) {
if (heloConfig[i] instanceof DefaultConfiguration) {
- String cmd = ((DefaultConfiguration)
heloConfig[i]).getAttribute("command");
- if ("HELO".equals(cmd)) {
- ((DefaultConfiguration)
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidHelo",m_heloResolv+""));
- } else if ("EHLO".equals(cmd)) {
- ((DefaultConfiguration)
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidEhlo",m_ehloResolv+""));
- } else if ("MAIL".equals(cmd)) {
- ((DefaultConfiguration)
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidSenderDomain",m_senderDomainResolv+""));
- } else if ("RCPT".equals(cmd)) {
- ((DefaultConfiguration)
heloConfig[i]).addChild(Util.getValuedConfiguration("maxRcpt",m_maxRcpt+""));
+ String cmd = ((DefaultConfiguration)
heloConfig[i]).getAttribute("command",null);
+ if (cmd != null) {
+ if ("HELO".equals(cmd)) {
+ ((DefaultConfiguration)
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidHelo",m_heloResolv+""));
+ } else if ("EHLO".equals(cmd)) {
+ ((DefaultConfiguration)
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidEhlo",m_ehloResolv+""));
+ } else if ("MAIL".equals(cmd)) {
+ ((DefaultConfiguration)
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidSenderDomain",m_senderDomainResolv+""));
+ } else if ("RCPT".equals(cmd)) {
+ ((DefaultConfiguration)
heloConfig[i]).addChild(Util.getValuedConfiguration("maxRcpt",m_maxRcpt+""));
+ }
}
-
}
}
Modified: james/server/trunk/src/test/org/apache/james/test/util/Util.java
URL:
http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/test/util/Util.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/test/util/Util.java (original)
+++ james/server/trunk/src/test/org/apache/james/test/util/Util.java Fri Apr 7
02:15:34 2006
@@ -33,6 +33,10 @@
}
public static DefaultConfiguration
createRemoteManagerHandlerChainConfiguration() {
+ DefaultConfiguration handlerChainConfig = new
DefaultConfiguration("test");
+ return handlerChainConfig;
+ }
+ public static DefaultConfiguration createSMTPHandlerChainConfiguration() {
DefaultConfiguration handlerChainConfig = new
DefaultConfiguration("handlerchain");
handlerChainConfig.addChild(createCommandHandlerConfiguration("HELO",
HeloCmdHandler.class));
handlerChainConfig.addChild(createCommandHandlerConfiguration("EHLO",
EhloCmdHandler.class));
@@ -45,14 +49,19 @@
handlerChainConfig.addChild(createCommandHandlerConfiguration("RSET",
RsetCmdHandler.class));
handlerChainConfig.addChild(createCommandHandlerConfiguration("HELP",
HelpCmdHandler.class));
handlerChainConfig.addChild(createCommandHandlerConfiguration("QUIT",
QuitCmdHandler.class));
+ // mail sender
+ handlerChainConfig.addChild(createCommandHandlerConfiguration(null,
SendMailHandler.class));
return handlerChainConfig;
}
private static DefaultConfiguration
createCommandHandlerConfiguration(String command, Class commandClass) {
DefaultConfiguration cmdHandlerConfig = new
DefaultConfiguration("handler");
- cmdHandlerConfig.setAttribute("command", command);
+ if (command != null) {
+ cmdHandlerConfig.setAttribute("command", command);
+ }
String classname = commandClass.getName();
cmdHandlerConfig.setAttribute("class", classname);
return cmdHandlerConfig;
}
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]