como crear un servidor smtp

Hola soy nuevo programando tengo un trabajo en java que consiste en crear un servidor (sencillo) para comunicacion SMPT que permita enviar mail a cualquier cuenta de correo.

estube buscando sobre socket y he creado mi cliente y mi servidor de esta manera, pero no se como hacer para atender a mas de un cliente a la ves y mantener una comunicacion con los cliente y el servidor, luego ya quisiera pasar al la comunicacion del protocolo SMPT que por lo que he leido hay que enviar ciertos parametros pero no conozco cuales son exactamentes y en que orden.

cualquiera ayuda o sugerencia es mucha utilidad gracias...

public class Cliente {
    private Socket sk;
    private String ip;
    private int puerto;

    public Cliente(String ip, int puerto) {
        this.ip = ip;
        this.puerto = puerto;
    }
   
    public void conectar(){
        try {
            sk = new Socket(ip, puerto);
            InputStream ax = sk.getInputStream();
            DataInputStream dis = new DataInputStream(ax);
            System.out.println(""+dis.readUTF());
            sk.close();
        } catch (UnknownHostException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

public class Servidor {
    private int puerto;
    private ServerSocket skserver;
    public Servidor(int puerto) {
        this.puerto = puerto;
    }
   
    public void correr(){
        try {
            skserver = new ServerSocket(puerto);
            System.out.println("corriendo en el puerto: " +puerto);
            Socket skcliente = skserver.accept();
            OutputStream os = skcliente.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            //dos.writeUTF("Hola cliente");
            skcliente.close();
           
        } catch (IOException ex) {
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 
}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Por que quieres crear un

¿Por que quieres crear un servdor SMPT desde cero? Me parece interesante, si es para usarlo en el "mundo real" te recomendaría que buscaras alguno ya hecho y trabajaras más en configuralo correctamente.

Para atender a más de un cliente tienes que poner a cada cliente en un hilo de ejecución separado utilizando Threads

Para saber el "orden" tienes que saber como funciona el protocolo de SMPT, para ello, está la SMPT - Wikipedia ahí debe de haber un vínculo para el RFC que tiene la descripción.

Es solo para materia de programacion de la universidad

Los motivos son netamente academicos
la idea es que por Ejemplo oscaryz@abcdf.com (cualquier dominio creado por mi) pueda enviar un correo a cualquier cuenta de correo valida, incluso a pedro@abcdf.com
donde estoy teniendo problema es como crear el smtp para oscaryz@abcdf.com para que pueda enviar correo dese dicha cuenta.

Yeap. En tu código solo te

Yeap.

En tu código solo te estas conectando a un servidor y le estas escribiendo cosas, pero ni estás siguiendo el protocolo ni nada.

Lo que tienes que hacer es seguir el protocolo como está descrito en los links que te pasé ( ya los viste? ).

http://es.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#Ejemplo_de_un...

Basicamente tienes que hacer el servidor y el cliente. Tu servidor a su vez será el cliente de otro servidor SMPT, lee esto:

http://communication.howstuffworks.com/email3.htm

Ahí nos cuentas como te quedo.

clase de conexion smtp

ya hice una prueba para conexion smtp, funciona para servidores SMTP q no necesiten autentificacion, (no he podido implementar la autentication), la parte del servidor no se como implemntarla (SMPT) por ejemplo no si se podra hacer esto: que jarfc@xyz.com pueda enviar un mail a pedro@hotmail.com (o a cualquier otra cuenta de correo validad) al menos eso es lo que me pidieron.
esta es mi clase de conexion para el smtp

public class Smtp extends Thread {
   

   
    public static final String OK_220     = "220";
    public static final String OK_250      = "250";
    public static final String HOLA             = "HELO ";
    public static final String EOLN             = "\r\n";
    public static final String REMITENTE        = "MAIL From: ";
    public static final String DESTINO          = "RCPT To: ";
   

   
    private Socket sk;
    private BufferedReader bufferentrada;
    private PrintWriter salida;
    private String nombre_servidor;
    private Mensaje msg;
   
   
    public Smtp(String serv , Mensaje ms) throws Exception {
        this.msg = ms;
        this.nombre_servidor = serv;
        try {
            sk = new Socket( nombre_servidor , 25 );
            salida = new PrintWriter( sk.getOutputStream() , true );
            bufferentrada = new BufferedReader( new InputStreamReader( sk.getInputStream() ) );
           
            if( ! leer().contains( OK_220 ) ){
               
                stop();
            }
           
            enviar( HOLA  + nombre_servidor );
            if( ! leer().contains( OK_250 )){
               
                stop();
            }
        } catch (Exception e) {
            throw new Exception( "No se pudo establecer la conexion con " + nombre_servidor );
        }
    }
   
    private void enviar(String string) {
        System.out.println( string );
        salida.println( string );
    }
   
    private String leer() throws Exception {
        String in = null;
        try {
            in = bufferentrada.readLine();
        } catch (Exception ex) {
            throw new Exception( "No se pudo leer el flujo" );
        }
        System.out.println( in );
        return in;
    }
   
    private boolean setRemitente(String remit) throws Exception{
        enviar( REMITENTE + remit );
        if( leer().contains( OK_250 ) )
            return true;
        throw new Exception( "No se pudo asignar el remitente" + remit );
    }
   
    private boolean setDestino(String dest) throws Exception{
        enviar( DESTINO + dest );
        if( leer().contains( OK_250 ) )
            return true;
        throw new Exception( "No se pudo asignar la direccion destino " + dest );
    }
   
    private boolean setTema(String tema) throws Exception{
        enviar( "DATA" );
        if( leer().contains( "354" ) ){
            enviar( "Subject:" + tema );
            return true;
        }
        throw new Exception( "No se pudo asignar el tema " + tema );
    }
   
    private void setContenido(String msg) throws Exception{
        enviar( msg );
        //throw new Exception( "No se pudo asignar el contenido" );
    }
   
    private boolean enviar() throws Exception{
        enviar( "" );
        enviar( "." );
        enviar( "" );
        if( leer().contains( "250" ) )
            return true;
        throw new Exception( "No se pudo enviar el final del mensaje" );
    }
   
    public void setMensaje( Mensaje msg ){
        this.msg = msg;
    }
   
    public void enviarMensaje() {
       
        try {
            if (setRemitente( msg.getRemitente() ) ){
                if( setDestino( msg.getDestino() ) ){
                    setTema( msg.getTema() );
                    setContenido( msg.getContenido() );
                    if( enviar() ){
                     
                        return;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
       
       
    }
   
    public void run() {
        enviarMensaje();
    }
   
   
   
   
}

Imagen de neko069

Porqué no checas JavaMail?

Porqué no checas JavaMail? hay un librillo por ahí que se llama JavaMail en ejemplos, con ése libro haces lo que necesitas para crear servicios de envío de correos, con la dichosa autenticación.

Porque él necesita

Porque él necesita implementar una solución desde cero.

Para hacer la parte de la autenticación es igual, ver como va la especificación e implementarla, aunque no es tan simple.

Imagen de neko069

Por éso digo que es mala idea

Por éso digo que es mala idea lo del libro... ok, ok, me equivoqué.