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 hb...@apache.org on 2001/04/02 09:51:40 UTC
cvs commit: jakarta-james/src/org/apache/james/smtpserver SMTPHandler.java
hbedi 01/04/02 00:51:40
Modified: src/org/apache/james/smtpserver SMTPHandler.java
Log:
The code for handling different protocol messages looks like this
-------------------------------
if method == 'foo':
doFoo(..)
else if method == 'bar':
doBar(..)
else if method == 'shoo':
doShoo(..)
else if method == 'boo':
doBoo(..)
------------------------------
Revision Changes Path
1.32 +172 -168 jakarta-james/src/org/apache/james/smtpserver/SMTPHandler.java
Index: SMTPHandler.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/org/apache/james/smtpserver/SMTPHandler.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- SMTPHandler.java 2001/03/13 06:00:41 1.31
+++ SMTPHandler.java 2001/04/02 07:51:38 1.32
@@ -85,7 +85,7 @@
}
public void compose( final ComponentManager componentManager )
- throws ComponentManagerException {
+ throws ComponentManagerException {
mailServer = (MailServer)componentManager.lookup("org.apache.james.services.MailServer");
scheduler = (TimeScheduler)componentManager.
lookup("org.apache.cornerstone.services.scheduler.TimeScheduler");
@@ -164,6 +164,15 @@
}
}
+ private void resetState() {
+ state.clear();
+ state.put(SERVER_NAME, this.servername );
+ state.put(SERVER_TYPE, this.softwaretype );
+ state.put(REMOTE_NAME, remoteHost);
+ state.put(REMOTE_IP, remoteIP);
+ state.put(SMTP_ID, smtpID);
+ }
+
private boolean parseCommand(String command)
throws Exception {
@@ -183,184 +192,179 @@
String argument1 = (String) null;
if(arguments > 2) {
argument1 = commandLine.nextToken();
+ }
+
+ if (command.equalsIgnoreCase("HELO"))
+ doHELO(command,argument,argument1);
+ else if (command.equalsIgnoreCase("EHLO"))
+ doEHLO(command,argument,argument1);
+ else if (command.equalsIgnoreCase("MAIL"))
+ doMAIL(command,argument,argument1);
+ else if (command.equalsIgnoreCase("RCPT"))
+ doRCPT(command,argument,argument1);
+ else if (command.equalsIgnoreCase("NOOP"))
+ doNOOP(command,argument,argument1);
+ else if (command.equalsIgnoreCase("RSET"))
+ doRSET(command,argument,argument1);
+ else if (command.equalsIgnoreCase("DATA"))
+ doDATA(command,argument,argument1);
+ else if (command.equalsIgnoreCase("QUIT"))
+ doQUIT(command,argument,argument1);
+ else
+ doUnknownCmd(command,argument,argument1);
+ return (command.equalsIgnoreCase("QUIT") == false);
+ }
+
+ private void doHELO(String command,String argument,String argument1) {
+ if (state.containsKey(CURRENT_HELO_MODE)) {
+ out.println("250 " + state.get(SERVER_NAME) + " Duplicate HELO/EHLO");
+ } else if (argument == null) {
+ out.println("501 domain address required: " + command);
+ } else {
+ state.put(CURRENT_HELO_MODE, command);
+ state.put(NAME_GIVEN, argument);
+ out.println("250 " + state.get(SERVER_NAME) + " Hello " + argument +
+ " (" + state.get(REMOTE_NAME) +
+ " [" + state.get(REMOTE_IP) + "])");
}
- // HELO Command
- if (command.equalsIgnoreCase("HELO")) {
- if (state.containsKey(CURRENT_HELO_MODE)) {
- out.println("250 " + state.get(SERVER_NAME) + " Duplicate HELO/EHLO");
- return true;
- } else if (argument == null) {
- out.println("501 domain address required: " + commandLine);
- return true;
- } else {
- state.put(CURRENT_HELO_MODE, command);
- state.put(NAME_GIVEN, argument);
- out.println("250 " + state.get(SERVER_NAME) + " Hello " + argument + " (" + state.get(REMOTE_NAME) + " [" + state.get(REMOTE_IP) + "])");
- return true;
+ }
+ private void doEHLO(String command,String argument,String argument1) {
+ doHELO(command,argument,argument1);
+ }
+ private void doMAIL(String command,String argument,String argument1) {
+ if (state.containsKey(SENDER)) {
+ out.println("503 Sender already specified");
+ } else if (argument == null || !argument.equalsIgnoreCase("FROM")
+ || argument1 == null) {
+ out.println("501 Usage: MAIL FROM:<sender>");
+ } else {
+ String sender = argument1.trim();
+ if (!sender.startsWith("<") || !sender.endsWith(">")) {
+ out.println("501 Syntax error in parameters or arguments");
+ getLogger().error("Error parsing sender address: " + sender
+ + ": did not start and end with < >");
+ return;
}
- // EHLO Command
- } else if (command.equalsIgnoreCase("EHLO")) {
- if (state.containsKey(CURRENT_HELO_MODE)) {
- out.println("250 " + state.get(SERVER_NAME) + " Duplicate HELO/EHLO");
- return true;
- } else if (argument == null) {
- out.println("501 domain address required: " + commandLine);
- return true;
- } else {
- state.put(CURRENT_HELO_MODE, command);
- state.put(NAME_GIVEN, argument);
- out.println("250 " + state.get(SERVER_NAME) + " Hello " + argument + " (" + state.get(REMOTE_NAME) + " [" + state.get(REMOTE_IP) + "])");
- return true;
+ MailAddress senderAddress = null;
+ //Remove < and >
+ sender = sender.substring(1, sender.length() - 1);
+ try {
+ senderAddress = new MailAddress(sender);
+ } catch (Exception pe) {
+ out.println("501 Syntax error in parameters or arguments");
+ getLogger().error("Error parsing sender address: " + sender
+ + ": " + pe.getMessage());
+ return;
}
- // MAIL Command
- } else if (command.equalsIgnoreCase("MAIL")) {
- if (state.containsKey(SENDER)) {
- out.println("503 Sender already specified");
- return true;
- } else if (argument == null || !argument.equalsIgnoreCase("FROM") || argument1 == null) {
- out.println("501 Usage: MAIL FROM:<sender>");
- return true;
- } else {
- String sender = argument1.trim();
- if (!sender.startsWith("<") || !sender.endsWith(">")) {
- out.println("501 Syntax error in parameters or arguments");
- getLogger().error("Error parsing sender address: " + sender
- + ": did not start and end with < >");
- return true;
- }
- MailAddress senderAddress = null;
- //Remove < and >
- sender = sender.substring(1, sender.length() - 1);
- try {
- senderAddress = new MailAddress(sender);
- } catch (Exception pe) {
- out.println("501 Syntax error in parameters or arguments");
- getLogger().error("Error parsing sender address: " + sender
- + ": " + pe.getMessage());
- return true;
- }
- state.put(SENDER, senderAddress);
- out.println("250 Sender <" + sender + "> OK");
- return true;
+ state.put(SENDER, senderAddress);
+ out.println("250 Sender <" + sender + "> OK");
+ }
+ }
+
+ private void doRCPT(String command,String argument,String argument1) {
+ if (!state.containsKey(SENDER)) {
+ out.println("503 Need MAIL before RCPT");
+ } else if (argument == null || !argument.equalsIgnoreCase("TO") || argument1 == null) {
+ out.println("501 Usage: RCPT TO:<recipient>");
+ } else {
+ Collection rcptColl = (Collection) state.get(RCPT_VECTOR);
+ if (rcptColl == null) {
+ rcptColl = new Vector();
}
- // RCPT Command
- } else if (command.equalsIgnoreCase("RCPT")) {
- if (!state.containsKey(SENDER)) {
- out.println("503 Need MAIL before RCPT");
- return true;
- } else if (argument == null || !argument.equalsIgnoreCase("TO") || argument1 == null) {
- out.println("501 Usage: RCPT TO:<recipient>");
- return true;
- } else {
- Collection rcptColl = (Collection) state.get(RCPT_VECTOR);
- if (rcptColl == null) {
- rcptColl = new Vector();
+ String recipient = argument1.trim();
+ if (!recipient.startsWith("<") || !recipient.endsWith(">")) {
+ out.println("Syntax error in parameters or arguments");
+ getLogger().error("Error parsing recipient address: "
+ + recipient
+ + ": did not start and end with < >");
+ return;
+ }
+ MailAddress recipientAddress = null;
+ //Remove < and >
+ recipient = recipient.substring(1, recipient.length() - 1);
+ try {
+ recipientAddress = new MailAddress(recipient);
+ } catch (Exception pe) {
+ out.println("501 Syntax error in parameters or arguments");
+ getLogger().error("Error parsing recipient address: "
+ + recipient + ": " + pe.getMessage());
+ return;
+ }
+ rcptColl.add(recipientAddress);
+ state.put(RCPT_VECTOR, rcptColl);
+ out.println("250 Recipient <" + recipient + "> OK");
+ }
+ }
+ private void doNOOP(String command,String argument,String argument1) {
+ out.println("250 OK");
+ }
+ private void doRSET(String command,String argument,String argument1) {
+ resetState();
+ out.println("250 OK");
+ }
+
+ private void doDATA(String command,String argument,String argument1) {
+ if (!state.containsKey(SENDER)) {
+ out.println("503 No sender specified");
+ } else if (!state.containsKey(RCPT_VECTOR)) {
+ out.println("503 No recipients specified");
+ } else {
+ out.println("354 Ok Send data ending with <CRLF>.<CRLF>");
+ try {
+ // parse headers
+ InputStream msgIn = new CharTerminatedInputStream(in, SMTPTerminator);
+ MailHeaders headers = new MailHeaders(msgIn);
+ // if headers do not contains minimum REQUIRED headers fields add them
+ if (!headers.isSet("Date")) {
+ headers.setHeader("Date", RFC822DateFormat.toString (new Date ()));
}
- String recipient = argument1.trim();
- if (!recipient.startsWith("<") || !recipient.endsWith(">")) {
- out.println("Syntax error in parameters or arguments");
- getLogger().error("Error parsing recipient address: "
- + recipient
- + ": did not start and end with < >");
- return true;
+ /*
+ We no longer add To as this in practice is not set (from what I've seen)
+ if (!headers.isSet("To")) {
+ headers.setHeader("To", );
+ }
+ */
+ if (!headers.isSet("From")) {
+ headers.setHeader("From", state.get(SENDER).toString());
}
- MailAddress recipientAddress = null;
- //Remove < and >
- recipient = recipient.substring(1, recipient.length() - 1);
- try {
- recipientAddress = new MailAddress(recipient);
- } catch (Exception pe) {
- out.println("501 Syntax error in parameters or arguments");
- getLogger().error("Error parsing recipient address: "
- + recipient + ": " + pe.getMessage());
- return true;
+
+ String received = "from " + state.get(REMOTE_NAME) + " ([" + state.get(REMOTE_IP)
+ + "])\r\n by " + this.servername + " ("
+ + softwaretype + ") with SMTP ID " + state.get(SMTP_ID);
+ if (((Collection)state.get(RCPT_VECTOR)).size () == 1) {
+ //Only indicate a recipient if they're the only recipient
+ //(prevents email address harvesting and large headers in bulk email)
+ received += "\r\n for <"
+ + ((Vector)state.get(RCPT_VECTOR)).elementAt(0).toString() + ">";
}
- rcptColl.add(recipientAddress);
- state.put(RCPT_VECTOR, rcptColl);
- out.println("250 Recipient <" + recipient + "> OK");
- return true;
+ received += ";\r\n " + RFC822DateFormat.toString (new Date ());
+ headers.addHeader ("Received", received);
+
+ // headers.setReceivedStamp("Unknown", (String) serverNames.elementAt(0));
+ ByteArrayInputStream headersIn = new ByteArrayInputStream(headers.toByteArray());
+ MailImpl mail = new MailImpl(mailServer.getId(), (MailAddress)state.get(SENDER),
+ (Vector)state.get(RCPT_VECTOR),
+ new SequenceInputStream(headersIn, msgIn));
+ mail.setRemoteHost((String)state.get(REMOTE_NAME));
+ mail.setRemoteAddr((String)state.get(REMOTE_IP));
+ mailServer.sendMail(mail);
+ } catch (MessagingException me) {
+ out.println("451 Error processing message: " + me.getMessage());
+ getLogger().error("Error processing message: "
+ + me.getMessage());
+ return;
}
- // NOOP Command
- } else if (command.equalsIgnoreCase("NOOP")) {
- out.println("250 OK");
- return true;
- // DATA Command
- } else if (command.equalsIgnoreCase("RSET")) {
+ getLogger().info("Mail sent to Mail Server");
resetState();
- out.println("250 OK");
- return true;
- // DATA Command
- } else if (command.equalsIgnoreCase("DATA")) {
- if (!state.containsKey(SENDER)) {
- out.println("503 No sender specified");
- return true;
- } else if (!state.containsKey(RCPT_VECTOR)) {
- out.println("503 No recipients specified");
- return true;
- } else {
- out.println("354 Ok Send data ending with <CRLF>.<CRLF>");
- try {
- // parse headers
- InputStream msgIn = new CharTerminatedInputStream(in, SMTPTerminator);
- MailHeaders headers = new MailHeaders(msgIn);
- // if headers do not contains minimum REQUIRED headers fields add them
- if (!headers.isSet("Date")) {
- headers.setHeader("Date", RFC822DateFormat.toString (new Date ()));
- }
- /*
- We no longer add To as this in practice is not set (from what I've seen)
- if (!headers.isSet("To")) {
- headers.setHeader("To", );
- }
- */
- if (!headers.isSet("From")) {
- headers.setHeader("From", state.get(SENDER).toString());
- }
-
- String received = "from " + state.get(REMOTE_NAME) + " ([" + state.get(REMOTE_IP)
- + "])\r\n by " + this.servername + " ("
- + softwaretype + ") with SMTP ID " + state.get(SMTP_ID);
- if (((Collection)state.get(RCPT_VECTOR)).size () == 1) {
- //Only indicate a recipient if they're the only recipient
- //(prevents email address harvesting and large headers in bulk email)
- received += "\r\n for <"
- + ((Vector)state.get(RCPT_VECTOR)).elementAt(0).toString() + ">";
- }
- received += ";\r\n " + RFC822DateFormat.toString (new Date ());
- headers.addHeader ("Received", received);
-
- // headers.setReceivedStamp("Unknown", (String) serverNames.elementAt(0));
- ByteArrayInputStream headersIn = new ByteArrayInputStream(headers.toByteArray());
- MailImpl mail = new MailImpl(mailServer.getId(), (MailAddress)state.get(SENDER), (Vector)state.get(RCPT_VECTOR), new SequenceInputStream(headersIn, msgIn));
- mail.setRemoteHost((String)state.get(REMOTE_NAME));
- mail.setRemoteAddr((String)state.get(REMOTE_IP));
- mailServer.sendMail(mail);
- } catch (MessagingException me) {
- out.println("451 Error processing message: " + me.getMessage());
- getLogger().error("Error processing message: "
- + me.getMessage());
- return true;
- }
- getLogger().info("Mail sent to Mail Server");
- resetState();
- out.println("250 Message received");
- return true;
- }
- } else if (command.equalsIgnoreCase("QUIT")) {
- out.println("221 " + state.get(SERVER_NAME) + " Service closing transmission channel");
- return false;
- } else {
- out.println("500 " + state.get(SERVER_NAME) + " Syntax error, command unrecognized: " + command);
- return true;
+ out.println("250 Message received");
}
}
+ private void doQUIT(String command,String argument,String argument1) {
+ out.println("221 " + state.get(SERVER_NAME) + " Service closing transmission channel");
+ }
- private void resetState() {
- state.clear();
- state.put(SERVER_NAME, this.servername );
- state.put(SERVER_TYPE, this.softwaretype );
- state.put(REMOTE_NAME, remoteHost);
- state.put(REMOTE_IP, remoteIP);
- state.put(SMTP_ID, smtpID);
+ private void doUnknownCmd(String command,String argument,String argument1) {
+ out.println("500 " + state.get(SERVER_NAME) + " Syntax error, command unrecognized: " +
+ command);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: james-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: james-dev-help@jakarta.apache.org