Servidor smtp

Buenas amigos, soy un poco nuevo en java y necesito algo de orientacion, actualmente llevo un curso en Java y me piden desarrollar un Servidor de Correos smtp/pop3, y conectarlo con clientes tipo Eudora, pr no tengo idea de como comenzar, si alguien sabe de algun ejemplo o tutorial seria de gran ayuda, ya que es para dentro de 15 dias, y llevo 2 dias buscando info y nada.

Gracias de antemano

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.

Tienes que usar Sockets y ...

Tienes que usar Sockets y ... y ya http://download.oracle.com/javase/tutorial/networking/sockets/

El SMTP es un protocolo, lo que significa que hay una serie de pasos a seguir. Lo que tienes que hacer es escribir un programa que siga el protocolo y listo.

Un ejemplo de una sesión lo puedes encontrar en la wikipedia:

http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#SMTP_transpor...

Haz un buen intento, postea lo que lleves y pregunta cuando te atores ( y explica cual es tu problema ) y no te esperes hasta el último día.

Primero ENTIENDE lo que tienes que hacer, muchas personas empiezan sin saber ni siquiera que es lo que tienen que lograr.

Si lo haces así, veras que sale más fácil.

Por cierto, SMPT y POP3 son protocolos diferentes.

Si también tienes que responder a POP3 aquí te va el ejemplo de una sesion:

http://en.wikipedia.org/wiki/Post_Office_Protocol#Dialog_example

Re: Tienes q usar sockets

gracias Oscar Ryz voy a comenzar a leer, ya que tengo algo de conocimiento en sockets pues acabo de presentar un proyec en ellos, y si me pego en algo o logre hacer algo lo estare indicando.

grac x la ayuda para comenzar

Re: tienes q usar...

Tienes razon, pues lo q necesito hacer es un pequeño servidor, q me permita el envio y lectura de mens entre clientes, segun lo q he leido, necesito guardar los mens, probablemente en XML, y la creacion de un domino (ejemplo@dominio), corrigeme si me equivoco

El dominio no es necesario.

El dominio no es necesario. Tu servidor puede ser una dirección de la red local ( por ejemplo 192.168.0.35 ) o la que te asigne tu red automáticamente. Por ese lado no te tienes que preocupar ( mucho )

Puedes guardar tus mensajes en cualquier formato, yo los guardaría en texto plano ( en la primero versión ) y en un archivo no hace falta más ni hay razón para complicarse.

Y lo primero que dices si, tienes que hacer un servidor aceptar peticiones de tu cliente ( como Thuderbird ) y responderle conforme al protocolo.

re: el domnio

es decir me estaba complicando mas de la cuenta, yo pense q tenia q usar un dominio, voy a seguir leyendo los links a ver como me va, para empezar a desarrollar, grac me a servido tu ayuda, cualquier duda vuelvo a consultar

Imagen de ezamudio

Spec

Por si no la tienes, aquí está la spec de SMTP. Es un protocolo bastante complejo de implementar, especialmente para hacer un servidor... supongo que solamente necesitas implementar un subconjunto de todo el protocolo.

Y aquí está el de POP3. SMTP es para enviar un mensaje a alguien, POP3 para que un cliente obtenga sus correos.

Re:Spec

Pues en si simplemente necesito un servidor q me acepte un mensaje de un cliente Eudora, y se lo mande a otro cliente a escoger (Outlook o cualquiera), ya he leido los links y aun no me queda muy claro como comenzar

Ok, haz lo siguiente: 1. -

Ok, haz lo siguiente:

1. - Crea un servidor
2.- Acepta una conexión
3.- Inicia el protocolo ( EHLO )
4.- Respondele al cliente y luego cierrale el server al cliente en la cara.

Eso debería de ser suficiente para empezar. Cuando lo tengas ( fijate como se debe de iniciar y como le debes de cerrar al cliente una sesion y todo eso ) configura tu cliente de correo para que se conecte a tu servidor.

Cuando funcione sigue agregando más partes, itera, prueba, refactoriza, itera.

Pero, primero. YA ENTENDISTE que es lo que tienes que hacer?

Imagen de ezamudio

enviar? no

El server no envía nada, en el esquema que mencionas. Lo que necesitas hacer realmente es por una parte implementar SMTP para que un cliente se pueda conectar y enviar un mensaje a otro usuario; tu server debe guardar ese mensaje. Y luego cuando el otro usuario se conecte (usando POP3) y pida sus mensajes pendientes, le tienes que dar la lista incluyendo el mensaje que le acaban de enviar, y puede decidir bajarlo y borrarlo del server, o bajarlo y solamente marcarlo como leído pero dejarlo en el server, etc.

Son dos cosas separadas, porque un protocolo no tiene nada que ver con el otro. Así que puedes comenzar por cualquiera de los dos, pero pues si eres tú solo haciendo todo... lo que deberías hacer es implementar primero el servidor con puro código Java, como si fuera un API Java nada más. Es decir tener tu objeto Servidor que tenga un API más o menos así:

//El Resultado depende un poco del protocolo SMTP, lo que se supone que hay que regresar
public Resultado enviarCorreo(Mensaje m);
//Tanto POP3 como SMTP necesitan autenticar al usuario
public boolean autenticar(String usuario, String password);
public List<Mensaje> correosPendientes(String usuario);
public void marcarLeido(Mensaje m);
public void borrar(Mensaje m);

Algo así. Las operaciones que tienes que implementar tanto de SMTP como de POP3, simplemente como métodos, y pues... las implementas, en una clase que haga el trabajo interno del servidor de correo: llevar una lista de usuarios con acceso al mismo, y guardarle a cada quien los correos que le envien los demas usuarios. El manejo de usuarios no está contemplado en ninguno de los dos protocolos así que puedes tener una lista fija o leerlos de una tabla en base de datos o hacer lo que quieras.

Y luego implementas por una parte el protocolo SMTP como quieras, orientado a que solamente tienes que traducir entre comandos de SMTP que te mandan por el socket, para construir un Mensaje, invocar un método del Servidor, obtener el Resultado y luego traducir ese Resultado a como tengas que informar al usuario por SMTP de lo que pasó con su petición.

Y luego implementas por otra parte el protocolo POP3 como quieras, orientado a que solamente tienes que traducir entre los comandos de POP3 que te mandan por el socket, para mandar las peticiones correspondientes al Servidor y devolver los resultados al usuario usando POP3.

RE: Ok...

Pues no la verdad, como dije antes soy nuevo, lo del servidor me imagino q es servidor coriente con sockets, y lo de iniciar el protocolo
EHLO no lo ent iguañ sigo leyendo, ns si es q esta dificil o si soy mas bruto q los demas

Imagen de ezamudio

nuevo

La verdad es que para un novato, eso de implementar SMTP y POP3 no está nada sencillo. No entendí si es encargo escolar o laboral pero de cualquier manera no es apto para un novato. Si es escolar, creo que sería justo decirle al prof que no se manche porque seguramente no eres el único novato en la clase. Y si es laboral, hay que ser honestos y admitir que uno es novato y que se le están pidiendo cosas que rebasan su capacidad, y que hay dos opciones: o pedirle eso a alguien más, o darle al novato el tiempo suficiente para que pueda hacer esta tarea porque al final la va a entregar medio mal hecha o tal vez bien hecha y va a tardar muchísimo más tiempo en hacerlo que alguien con experiencia, pero pues al final de la misión ese novato habrá ganado mucho conocimiento...

Muy cierto, yo asumí que era

Muy cierto, yo asumí que era para la escuela porque a esta altura del web2.0 casi web3 quién va a hacer un servidor SMPT/POP3 desde cero.

Si es para la escuela se puede hacer algo tan sencillo como un servidor común y corriente con sockets y lo de iniciar el protocolo pues .. es nomás leer lo que el ciente te dice.

Vuelve sobre los links y ve el ejemplo de la sesion. Es mucho más fácil empezar por ahí y luego buscar los detalles en el RFC que te pasó Enrique.

Si es para el trabajo... ¬¬ ... me gustaría mucho saber en que termina!! jeje

p.d.

Puedes hacer un servidor para el protocolo Hola mundo? donde le pases tu nombre y te responda Hola + nombre?

Si lo puede hacer postea el código y te digo que cambiar para que empieces.

re: nuevo

Si esamudio y oscarRyz, de hechos soy estudiante de programacion de sistemas (ing. en Sotfware), y mi prof primero nos hizo hacer los clientes (no tan dificiles), y ahora como proyecto nos pide desarrollar un servidor de correos completo y en una semana¡¡¡¡¡¡¡ xq ademas nos ejo un juego de colores con sockets y hilos, y otro lenguajes (java-servidor, python-flash-silverlighy-clientes), lo que llevo programando en java son alrededor de 6 meses, o menos debido a que trab de dia y estudio de noche, pr aun asi me he propuesto presentar el proyecto, y si c puede en parejas o trios, pr desgraciadamente estoy solo, x lo que me oca programar mas.

Agradezco la ayuda q me brindan, y si deseo aprender, actua desarrollo con la ayuda de Nerbeans 6.9.1, y me quiero especializar en java, y probarme a
mi y al pro q puedo, pr si esta complicado lo del server smtp y pop3

Pues empieza con el

Pues empieza con el HelloWorld server y ahi te vamos ( voy ) diciendo como hacer para que sustituyas "Hello" por "EHLO"

:)

re : pues

grac x tu ayuda OscarRyz y ezamudio de verad, y y refieres a un simple cliente-servidor de sockets??????? corrigeme oara comenzar

Oscar

te refieres a un cliente q le envie "Hola" a un servidor, por medio de sokets???? o por de medio de la javamail???

Imagen de Sr. Negativo

SMS desde Java

Yo tengo en mente (nada de código todavia) realizar algo parecido,se trata de una aplicación que envie y reciba SMS desde PC a teléfono y viceversa (algo parecido a lo de Telcel). El usuario debe tener una opción en la pueda guardar sus SMS como si fuera correo.

Coincido con @ezamudio en que para un novato si es bastante dificil , pero ya que a sufrir un poco (los jefes mandan y uno obedece, upps).

Ya consulté con el Sr. Google y encontré la librería SMSLib y también en http://opensms.logica.com

¿Alguien las ha manejado?

Cuando tenga un avance voy a postearlo.

?:)

Si si luis, Sockets..

Si si luis, Sockets.. javamail no pinta aquí para nada, jejeje ... SIIII SOOOOOCKEEEEETS!!!!

Los que dices que ya usaste alguna vez...

jajaja ( me río para no tirarme al suelo de cabeza )

En realidad hacer un servidor sencillo, con capacidad y funcionalidad limitada no es tan dificil. Hacer algo robusto que soporte muchísimos clientes simultáneos y que sea rápido y eficiente, eso sí está muy difícil.

Imagen de ezamudio

SMS

El envio de SMS es una de esas cosas que muchos piensan que se puede resolver nomas con software, usando alguna biblioteca o echando codigo. No es asi.

Si lo que quieres hacer es una interfaz entre la compu y un telefono, para que los SMS recibidos en el telefono sean enviados (por socket, bluetooth, cable USB o lo que sea) a la computadora, y viceversa poder teclear texto y enviarlo de algun modo al celular para que de ahi salga como SMS, entonces realmente lo que quieres hacer es dos aplicaciones: una en el telefono y una en la compu, y se comunican entre ellas, y la que esta en el fon maneja los SMS usando el software del telefono (ahi si es posible enviar y recibir SMS porque a fin de cuentas el software corre en un celular con capacidad de SMS).

Pero si quieres que magicamente desde tu computadora teclees texto y eso de alguna manera le llegue como SMS a un celular, no es posible con puro codigo. Necesitas el servicio de algun proveedor, ya sea directamente con el proveedor celular o a traves de un tercero que tenga conexion con la central de mensajes de un proveedor celular. Y eso cuesta, porque los SMS cuestan.

Imagen de ezamudio

Sockets

Revisa mi blog, tengo uno o dos articulos por ahi con codigo de ejemplo de comunicacion muy simple cliente-servidor, uno de ellos orientado a seguridad en aplicaciones java, para evitar ataques de negacion de servicio, y otro para mostrar la diferencia entre java.io y java.nio (java.nio surgio en java 1.4 para evitar manejar tantos hilos en la comunicacion de streams pero ahora resulta que da mejor performance usar java.io con streams que bloquean y usar varios hilos, esto debido a los procesadores modernos multicore).

re: sockets

grac ezamuio voy a mirarlo, y aca tengo el ejmplo com el q comence a utilizar sockets

//Creo el socket server
s = new ServerSocket(9999);

//Invoco el metodo accept del socket servidor, me devuelve una referencia al socket cliente
sc = s.accept();

//Obtengo una referencia a los canales de escritura y lectura del socket cliente
b = new BufferedReader( new InputStreamReader ( sc.getInputStream() ) );
p = new PrintStream ( sc.getOutputStream() );

while ( true ) {
//Leo lo que escribio el socket cliente en el canal de lectura
mensaje = b.readLine();
System.out.println(mensaje);

//Escribo en canal de escritura el mismo mensaje recibido
p.println(mensaje);

if ( mensaje.equals("by")) {
break;
}
}

p.close();
b.close();

sc.close();
s.close();
} catch (IOException e) {
System.out.println("No puedo crear el socket");
}

asi fue mi primer servidor, y un poco de paciencia

Imagen de ezamudio

un solo cliente

Ese código te sirve para aceptar un solo cliente, porque el método accept() bloquea el hilo donde se llama hasta que alguien se conecte, y a partir de ahí continúa la ejecución, pero tu ServerSocket ya no está aceptando más conexiones.

Te recomiendo implementar las distintas partes usando Runnables y luego ya ves cómo echas a andar cada Runnable en un hilo separado. Así además podrás implementar tus pruebas unitarias de manera más sencilla.

Es MUY recomendable que hagas pruebas unitarias para esto; aprovecha que son protocolos basados en texto y entonces puedes crear archivos de texto con los comandos que un cliente enviaría, tanto comandos válidos como inválidos, y las pruebas consistirán en crear streams de esos archivos y pasarlos a tus componentes, de ese modo puedes automatizar las pruebas sin tener que echar a andar un cliente de manera manual.

Ejemplo con lo del protocolo holamundo (me salto por ahorita toda la declaración e intercepción de excepciones):

//Esta clase es para atender a un cliente.
public class HolaProtocol implements Runnable {
  private final BufferedReader input;
  private final PrintStream output;

  public HolaProcess(InputStream entrada, OutputStream salida) {
    input = new BufferedReader(new InputStreamReader(entrada));
    output = new PrintStream(salida);
  }

  public void run() {
    String nombre = input.readLine();
    output.printf("Hola, %s!%n", nombre);
    output.flush();
  }

}

//Esta puede ser el envoltorio real
public class HolaSocket implements Runnable {
  private final Socket sock;
  public HolaSocket(Socket socket) {
    sock = socket;
  }

  public void run() {
    new HolaProtocol(sock.getInputStream(), sock.getOutputStream()).run();
    sock.close();
  }
}

//Y el servidor multi-cliente lo implementas así:
public class HolaServer implements Runnable {

  private boolean sigue = true;

  public void run() {
    ServerSocket server = new ServerSocket(9999); //puerto configurable
    while (sigue) {
      Socket conn = server.accept();
      HolaSocket proc = new HolaSocket(conn);
      //Aqui hay dos maneras de echarlo a andar, la otra te queda de tarea
      new Thread(proc).start();
    }
  }

  public void stop() {
    sigue = false;
  }
}

Después de todo ese relajo, podrías implementar pruebas unitarias, por ejemplo para probar tu protocolo puedes hacer esto:

public class TestProtocol {
  @Test
  public void testSaludo() {
    ByteArrayInputStream bin = new ByteArrayInputStream(String.format("Enrique%n").getBytes());
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    HolaProcess proc = new HolaProcess(bin, bout);
    proc.run();
    assert bout.toString().trim().equals(String.format("Hola, Enrique!"));
  }
}

Ves? Puedes correr la prueba unitaria cuantas veces quieras, sin necesidad de usar un socket. Para pruebas de integración sería más complicado, pero en este caso, dado que es un protocolo muy simple, bastaría con echar a andar la aplicación y hacer un telnet al puerto 9999, teclear algo y dar ENTER, y verificar que nos devuelve el saludo y cierra la conexión. Y para tu app real pues deberás tener dos cuentas y dos clientes, uno para enviar un correo de usuario1 a usuario2 usando SMTP y el otro para bajar el mensaje conectándose como usuario2 por medio de POP3.

En ese caso JavaMail te puede servir porque podrías hacer un cliente de correo en Java que implemente la prueba: primero se conecta por SMTP como usuario1, envia el correo, cierra la conexión, luego se conecta como usuario2 para bajar el correo con POP3 y si no llega el correo que acaba de enviar el mismo programa, pues truena la prueba.

Sucumbiste a la tentación de

@ezamudio : Sucumbiste a la tentación de hacer el hola mundo +1 jejeje yo resistí hasta el último momento ... :)

Imagen de ezamudio

sí caray

No me pude resistir. Ah pero eso sí: que conste que lo escribí directo aquí en la página, nada de IDE ni compilar, eso es de nenas jajajajaja, a ver si corre. Si alguna vez ha aplicado ese disclaimer de THIS SOFTWARE IS PROVIDED "AS IS" es aquí.

grac

gracias por la informacion y explicacion muchachos, ::( disp mi ignrancia soy un poco nuevo y estoy aprendiendo, sin embargo lei en el BLOG de @ezamudio q no es implementar los hilos de la clase thread, ya q en este momento utilizo este otro

public void AceptaC(){

        while(true){

            String recibido="";
                        try {
                                //Acepta las conexiones de los clientes
                                SocketCliente = Servidor.accept();
                                cont++;
                                System.out.println("Nueva conexion aceptada: " + SocketCliente);
                                new GestorPeticion(SocketCliente).start();
                                //entrada = new DataInputStream(SocketCliente.getInputStream());
                                //recibido = entrada.readLine();
                                //System.out.println("************************************");
                                // System.out.println(recibido);}
                                SocketCliente = null;

                               
                        }
                        catch (IOException e) {
                                e.printStackTrace();
                                System.exit(-1);
                        }
                }
    }

   class GestorPeticion extends Thread {
        BufferedReader entrada = null;
        PrintWriter salida = null;
        Socket s;

        clscolors cadena = new clscolors();
        public GestorPeticion(Socket s){
                this.s = s;
        }

        public void run(){

            switch(cont){
                case 1:
                try{
                        entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        salida = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
                        while (true){
                                String str = entrada.readLine();
                                System.out.println("Recibo cliente1: "+ str);
                                cadena.verificar(str);
                                //salida.println(str);
                                salida.println("Correctos"+this.cadena.correctos+","+"Incorrectos"+this.cadena.incorrectos+","+"mal colocados"+this.cadena.malcol);
                                //salida.println("lleg msm cliente1");
                                //if(this.cadena.correctos==4)
                                if(str.equals("bye")) break;

                        }

                        salida.close();
                        entrada.close();
                }
                catch(Exception e){
                        e.printStackTrace();
                        System.exit(-1);
                }

                case 2:
                    try{
                        entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        salida = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
                        while (true){
                                String str = entrada.readLine();
                                System.out.println("Recibo cliente2: "+ str);
                                //salida.println(str);
                                cadena.verificar(str);
                                salida.println("Correctos"+this.cadena.correctos+","+"Incorrectos"+this.cadena.incorrectos+","+"mal colocados"+this.cadena.malcol);
                                if(str.equals("bye")) break;
                        }

                        salida.close();
                        entrada.close();
                }
                catch(Exception e){
                        e.printStackTrace();
                        System.exit(-1);
                }
            }//fin switch
        }
}

   public void cerrar (){
   try {

      // Cerramos Conexion

                SocketCliente.close();
                Servidor.close();

       }catch (IOException e) {}

es parte de mi examen de un juego q revisa si los colores estan bien colocados, sin embargo me pidieron un ejemplo de un HOLO SERVER, no obstante les agradezco la explicacion, y todo ha sido ganancia, conforme avance lo hire posteando y pidiendo ayuda, claro esta si desen colaborarme

Imagen de ArenasMx

tan largamente esperado

eso me recordo a un juego llamado duke nuken forever no se porque pero bueno

Imagen de ezamudio

Thread

Si implementas Runnable en vez de heredar de Thread, entonces puedes crear un Thread con tu Runnable en el constructor y darle start para que se ejecute en un hilo aparte. Si heredas Thread puedes caer en el error de sobreescribir start en vez de run.

Y además si implementas Runnable, puedes crear cuantas instancias necesites y echarlas a correr en un ThreadPool.

@luisAle Offtopic incluye <code> y </code>

@luisAle Por favor edita tus post y agrega a tu código los tags: <code> y </code> Ejemplo <code>java.lang.String </code>

re: @oscarRyz

grac y aun toy leyendo para ent

Imagen de Sr. Negativo

Re: SMS


El envio de SMS es una de esas cosas que muchos piensan que se puede resolver nomas con software, usando alguna biblioteca o echando codigo. No es asi.
Si lo que quieres hacer es una interfaz entre la compu y un telefono, para que los SMS recibidos en el telefono sean enviados (por socket, bluetooth, cable USB o lo que sea) a la computadora, y viceversa poder teclear texto y enviarlo de algun modo al celular para que de ahi salga como SMS, entonces realmente lo que quieres hacer es dos aplicaciones: una en el telefono y una en la compu, y se comunican entre ellas, y la que esta en el fon maneja los SMS usando el software del telefono (ahi si es posible enviar y recibir SMS porque a fin de cuentas el software corre en un celular con capacidad de SMS).

Pero si quieres que magicamente desde tu computadora teclees texto y eso de alguna manera le llegue como SMS a un celular, no es posible con puro codigo. Necesitas el servicio de algun proveedor, ya sea directamente con el proveedor celular o a traves de un tercero que tenga conexion con la central de mensajes de un proveedor celular. Y eso cuesta, porque los SMS cuestan.

Bueno, gracias por tu respuesta @ezamudio.

Creo que pensaré por la primera opción.

Para más comentarios sobre el

Para más comentarios sobre el SMS mejor creen otro post, para dejar este sobre el server de smpt

Imagen de ezamudio

HolaMundo socket

Me pareció buen ejercicio hacer eso del protocolo HolaMundo, pero en Scala, para aprender (es mi "hola mundo" porque pues ya en estos lenguajes un puro "hola mundo" no tiene ningún chiste porque es de una línea).

Medio rara la sintaxis, pero a fin de cuentas sale código bastante conciso, aunque fue casi la misma cantidad de código, lo que me ahorré fueron constructores y algunas variables de instancia. Me deja muchas dudas, que luego que tenga tiempo investigaré...

Aun sigo leyendo

Grac por los comentarios, igual sigo leyendo y buscando info, pr si es bastante tedioso este servidor, pues me pueden corregir (xfavor je je) pr tengo que programar cada protocolo, ejemplo el pop3-programar USER-PASS-STAT-LIST etc, y en el caso de smtp programar HELO-MAIL FROM-RCPT TO etc, y despues conectarlo con los clientes (Eudora y Outlook), es decir programar desde cero cada orden utilizando sockets??????

Estoy bien o estoy demasiado perdido??????? xfavor ayuda ya me quedan pocos dias ;(

Imagen de ezamudio

son dos protocolos separados

un protocolo no tiene nada que ver con el otro. Lo mejor es que los implementes completamente por separado.

es decir programar desde cero

es decir programar desde cero cada orden utilizando sockets??????

Si exacto ya lo entendiste ahora... corre!!!

La parte de "conectarlo" con los clientes es la parte fácil y deberías de estarlo haciendo todo el tiempo para probar, no va a funcionar desde el principio, pero te serviriía que primero entendieras el HELO y le respondieras algo y tomaras un flujo.

Apurate que el tiempo sigue pasando.

Imagen de ezamudio

pruebas

Si quieres acelerar tu proceso de desarrollo, te recomiendo ampliamente que hagas un programa para automatizar tus pruebas. Puedes usar JavaMail para ello. Lo que necesita hacer tu programa es algo así:

- Leer un archivo de configuración donde se indican datos del servidor SMTP (host, port, user, pass) y del servidor POP3 (host, port, user, pass), te puede servir Spring para esto o lo haces a mano.
- Conectarse al servidor SMTP con los datos de la config y enviar un correo a un usuario también definido en la config.
- Desconectarse de SMTP
- Conectarse al servidor POP3 y pedir los correos pendientes, verificar que el mensaje recién enviado está en esa lista, pedirlo, borrarlo.

En tu caso, el hecho de que estás reinventando el hilo negro es una ventaja para las pruebas, porque puedes hacer este cliente antes de empezar a desarrollar tus servidores de correo, y probarlo contra algún servicio existente como gmail o hotmail o lo que sea. El cliente es estándar (JavaMail), por lo que si haces que funcione con gmail por ejemplo, entonces para que funcione con tu cliente solamente tendrás que cambiar ligeramente la configuración (deshabilitar TLS que necesitas usar con gmail por ejemplo).

Por qué insisto tanto en esto? Pues porque una vez que tengas ese programa hecho, puedes hacer lo que dice Oscar, de manera muy rápida: Implementas algo nuevo, corres tu server y corres ese cliente de prueba, que ejecuta tooooda la prueba; obvio se va a atorar en algun punto, pero ya irás viendo dónde te quedaste, si pasó bien la parte que realmente estás probando, etc.

Esto que te digo del cliente es para pruebas de integración, no unitarias, pero bueno, por el tipo de aplicación que vas a hacer, te sirve estar corriendo esas pruebas de integración MUY seguido.

Ok grac x lo comentarios y

Ok grac x lo comentarios y la ayuda, apenas tenga al hecho lo posteare,