import java.net.*; import java.util.*; import java.io.*; public class POP3Server { static String SERVER_NAME = "localhost"; static int POP_PORT = 110; POP3Server () { try { ServerSocket ss = new ServerSocket( POP3Server.POP_PORT ); System.out.println("Mail server is up and running on port " + POP3Server.POP_PORT); while ( true ) { Socket theSocket = ss.accept(); System.out.println("Connection accepted"); (new POP3connection()).handleConnection(theSocket); } } catch ( java.io.IOException ex ) { System.out.println("a - Exception: " + ex); } } public static void main ( String[] args ) { POP3Server mailServer = new POP3Server(); } class POP3connection { List messageList = null; POP3connection () { createFakeMessage(); } void createFakeMessage () { String message = new String ( "From: nobody@limbo.com\r\n" + "Date: Wed, 18 Jul 2001 11:35:34 ED\r\n" + "Subject: Test Message\r\n" + "To: nobody@limbo.com\r\n" + "\r\n" + "Test\r\n" + "\r\n"); messageList = new Vector(); for (int i=0; i<5; i++) { messageList.add(message); } } void handleConnection ( Socket theSocket ) { boolean closeConnection = false; boolean userAuthorised = true; String params = ""; String request = ""; String user = ""; String password = ""; String data = "STAT\r\n"; System.out.println("Connected to client"); try { OutputStream out = theSocket.getOutputStream(); DataOutputStream dataSocketOut = new DataOutputStream(out); InputStream in = theSocket.getInputStream(); BufferedReader dataSocketIn = new BufferedReader(new InputStreamReader(in)); dataSocketOut.writeBytes("+OK POP3 server ready\r\n"); while ( !closeConnection ) { String result = ""; data = dataSocketIn.readLine(); data = data.trim(); if ( data.length() == 0 ) continue; int spaceIdx = data.indexOf(" "); if ( spaceIdx > -1 ) { request = data.substring(0,spaceIdx); params = data.substring(spaceIdx); } else { request = data; params = ""; } System.out.println("REQUEST .... " + request); System.out.println("PARAMS ..... " + params); if ( request.equals("QUIT") ) { result = "+OK " + SERVER_NAME + " POP3 server signing off"; closeConnection = true; } else if ( request.equals("APOP") ) { int lSpaceIdx = params.indexOf(" "); user = params.substring(0,lSpaceIdx); password = params.substring(lSpaceIdx); result = "+OK " + user + "'s maildrop has " + messageList.size() + "messages\r\n"; } else if ( request.equals("USER") ) { user = params; result = "+OK\r\n"; } else if ( request.equals("PASS") ) { password = params; // <-- Should do a password check here userAuthorised = true; result = "+OK\r\n"; } else if ( request.equals("STAT") ) { if ( userAuthorised ) { List messagesSizes = new Vector(); int totalMessagesSize = 0; result = ""; for ( int i=0; i < messageList.size(); i++ ) { int messageSize = ((String) messageList.get(i)).length(); totalMessagesSize = totalMessagesSize + messageSize; } result = "+OK " + messageList.size() + " " + totalMessagesSize + "\r\n"; } else { result = "-ERR must first login\r\n"; } } else if ( request.equals("LIST") ) { if ( userAuthorised ) { List messagesSizes = new Vector(); int totalMessagesSize = 0; result = ""; for ( int i=0; i < messageList.size(); i++ ) { int messageSize = ((String) messageList.get(i)).length(); totalMessagesSize = totalMessagesSize + messageSize; result = result + i + " " + totalMessagesSize + "\r\n"; } result += ".\r\n"; result = "+OK " + messageList.size() + " messages (" + totalMessagesSize + ")\r\n" + result; } else { result = "-ERR must first login\r\n"; } } else if ( request.equals("RETR") ) { if ( userAuthorised ) { int messageIdx = Integer.parseInt(params.trim()); result = "+OK " + ((String) messageList.get(messageIdx)).length() +" bytes\r\n"; result += (String) messageList.get(messageIdx) + "\r\n.\r\n"; } else { result = "-ERR must first login\r\n"; } } else if ( request.equals("DELE") ) { if ( userAuthorised ) result = "+OK ignored command\r\n"; else result = "-ERR must first login\r\n"; } else { result = "-ERR unrecognised command\r\n"; } dataSocketOut.writeBytes(result); System.out.println("RESULT ..... " + result); } theSocket.close(); } catch ( IOException ex ) { System.out.println("b - Exception : " + ex); } } } }