/*
* Copyright (C) 1996 - 2011 Alan Williamson
*
* This file is part of Mail25 Mailet Container.
*
* Mail25 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Free Software Foundation,version 3.
*
* Mail25 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Mail25. If not, see http://www.gnu.org/licenses/
*
* http://alan.blog-city.com/
*
* $Id: MailHandler.java 1720 2011-10-07 19:39:14Z alan $
*/
package org.alanwilliamson.mail25.server;
import java.io.IOException;
import java.net.SocketTimeoutException;
import org.alanwilliamson.mail25.mailet.CaughtMail;
import org.quickserver.net.server.ClientCommandHandler;
import org.quickserver.net.server.ClientEventHandler;
import org.quickserver.net.server.ClientHandler;
public class MailHandler implements ClientCommandHandler, ClientEventHandler {
public void handleCommand(ClientHandler clientHandler, String lineIn ) throws SocketTimeoutException, IOException {
MailData maildata = (MailData)clientHandler.getClientData();
if ( maildata.isDataMode() ){
maildata.dataRxd( lineIn );
} else if ( lineIn.toUpperCase().startsWith("MAIL FROM" ) ){
maildata.cmdMailFrom( lineIn );
} else if ( lineIn.toUpperCase().startsWith("RCPT TO" ) ){
if ( !maildata.hasFrom() ){
clientHandler.sendClientMsg( "500 No valid MAIL FROM" );
clientHandler.closeConnection();
return;
}else
maildata.cmdRcptTo( lineIn );
} else if ( lineIn.toUpperCase().startsWith("DATA" ) ){
if ( !maildata.hasRpct() ){
clientHandler.sendClientMsg( "500 No valid RCPT TO" );
clientHandler.closeConnection();
return;
}else
maildata.cmdData( lineIn );
} else if ( lineIn.toUpperCase().startsWith("HELO" ) || lineIn.toUpperCase().startsWith("EHLO" )){
maildata.cmdHelo( lineIn );
} else if ( lineIn.toUpperCase().startsWith("QUIT" ) ){
maildata.cmdQuit( lineIn );
clientHandler.sendClientMsg( maildata.getLastOutStatus() + " " + maildata.getLastStatusMsg() );
clientHandler.closeConnection();
} else {
clientHandler.sendClientMsg( "500 Unknown Message" );
return;
}
// Send out status to client
if ( maildata.getLastOutStatus() != 0 ){
clientHandler.sendClientMsg( maildata.getLastOutStatus() + " " + maildata.getLastStatusMsg() );
}
// If the mail has been received then pass it onto the Mailet container
if ( maildata.isMailRxd() ){
CaughtMail newMail = new CaughtMail(maildata);
maildata.getMail25().log( "In#" + maildata.getId() + "; size=" + maildata.getSize() + "; time=" + maildata.getMailRxdTime() + "ms; from=" + newMail.getSender() + "; to=" + newMail.getRecipients() );
maildata.getMail25().acceptMail( newMail );
maildata.setMailProcessed();
}
}
public void gotConnected(ClientHandler clientHandler) throws SocketTimeoutException, IOException {
MailData maildata = (MailData)clientHandler.getClientData();
maildata.setMail25( (Mail25)clientHandler.getServer().getStoreObjects()[0] );
String banner = (String)clientHandler.getServer().getStoreObjects()[1];
if ( banner != null)
clientHandler.sendClientMsg( "220 EMSTP " + banner );
else
clientHandler.sendClientMsg( "220 ESMTP Mail25 OpenBD http://openbd.org/" );
maildata.setClientAddress( clientHandler.getHostAddress() );
maildata.getMail25().statsClientConnected();
maildata.getMail25().log( "In#" + maildata.getId() + "; " + clientHandler.getHostAddress() + " connected" );
}
public void lostConnection(ClientHandler clientHandler) throws IOException {
MailData maildata = (MailData)clientHandler.getClientData();
maildata.close();
maildata.getMail25().statsLostConnection();
maildata.getMail25().log( "In#" + maildata.getId() + "; " + clientHandler.getHostAddress() + " lost connection" );
}
public void closingConnection(ClientHandler clientHandler) throws IOException {
MailData maildata = (MailData)clientHandler.getClientData();
maildata.close();
maildata.getMail25().statsLostConnection();
maildata.getMail25().log( "In#" + maildata.getId() + "; " + clientHandler.getHostAddress() + " closed; totalSize=" + maildata.getTotalSize() + "; totalMails=" + maildata.getTotalMails() );
}
}