Blog de Maki

Un blog de conocimiento libre.

31 ago 2013

Verificar que una dirección de correo de Gmail existe o no en Java.

He de decir que este programa tiene una complejidad media-alta ya que hay que tener en cuenta muchos factores, por ello voy a ir explicando los más importantes paso a paso. También hay que saber que para usar este método hay que disponer previamente de una cuenta propia de Gmail para poder realizar la consulta de la cuenta ajena en cuestión, por tanto si no tienes una cuenta de Gmail debes crearla. Empezemos con la explicación:

Algunos servidores de correo son tan amables que proporcionan cierta información a todo aquel que se lo pida así que nos vamos a aprovechar de eso:
  1. En primer lugar tenemos que crear un cliente Telnet para Java. Para ello necesitamos descargar estas librerías externas y agregarlas al ClassPatch de nuestro proyecto:
  2. jakarta-oro-2.0.8.jar
    Telnet.jar
    commons-io-2.4-bin.tar.gz

  3. Después importamos las siguientes librerías a nuestro proyecto:
  4. import javax.swing.JTextField;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import javax.swing.JLabel;
    import java.awt.Font;
    import org.apache.commons.net.telnet.TelnetClient;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    
    import java.awt.EventQueue;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    
    Si el paso anterior se ha hecho correctamente no debería de dar ningún error.

  5. Ahora añadimos el método para realizar la conexión al servidor de Gmail y ejecutar los comandos necesarios para nuestro cliente Telnet:
  6. private void connect(String correo) 
    {
        try 
        {
            //El parametro correo es el correo
            //que queremos comprobar
            serverName = "aspmx.l.google.com";
            Pattern p;
            Matcher m;
           
            //Abro la conexión al Telnet por el puerto 25
            telnet.connect(serverName, 25);
    
    
            //Ahora necesito una forma de leer las respuestas que
            //me envía el telnet, para esto obtenemos un InputStream
            //del objeto telnet
            in = telnet.getInputStream();
    
            //Ahora necesito una forma de enviarle los comandos al telnet
            //para esto obtengo un OutputStream desde el objeto telnet
            out = new PrintStream(telnet.getOutputStream());
    
    
            //Ahora envuelvo el InputStream dentro de un BufferedReader
            //para que la lectura de las respuestas del telnet sean mucho
            //mas sencillas y mejor gestionadas
            reader = new BufferedReader(new InputStreamReader(in));
           
            //procedemos a ingresar el primer comando
            //a través del método write, el cual escribe en la consola
            write("HELO hola");
            
            //Leemos por consola hasta la que encuentra la palabra service
            readUntil("service");
    
            
            //Aquí debéis poner vuestro correo personal(correo_Personal), por tanto
            //borráis correo_Personal y ponéis por ejemplo pepito@gmail.com
    
            write("mail from:<correo_Personal>");//IMPORTANTE: Es necesario poner una
            readUntil("gsmtp");                //cuenta de correo que exista para que funcione
    
            write("RCPT TO:<"+correo+">");//La variable correo es el correo a consultar
            readUntil("gsmtp");                
            
            //Aquí esta el "truco" para saber
            //si existe el correo, con esto comprobamos
            //si la consola nos ha devuelto un 250 o no.
            //Si es un 250 existe sino no
            p = Pattern.compile("250");
            
            //La variable cadena debe de ser un atributo
            //de la clase y es de tipo String.
            m = p.matcher(cadena);
            if (!m.find())
             JOptionPane.showMessageDialog(contentPane, "No existe este correo.");
            else
             JOptionPane.showMessageDialog(contentPane, "Existe este correo.");
            tfComprobar.setText(null);
            
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        } finally 
        {
            try
            {
             //Liberamos recursos
             out.close();
             reader.close();
             in.close();
             telnet.disconnect();
            } catch (IOException ex) 
            {
                Logger.getLogger(TelnetClientJava.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
  7. Añadimos el método write:
  8.     public void write(String value) 
        {
         try {
             out.println(value);
             out.flush();
             //System.out.println(value);
         } catch (Exception e) {
             e.printStackTrace();
         }
        }
    
  9. Por último el método readUntil:
  10.    public String readUntil(String pattern) 
        {
            StringBuffer sb = new StringBuffer();
    
            try {
                char lastChar = pattern.charAt(pattern.length() - 1);
    
                boolean found = false;
    
                int check = in.read();
                char ch = (char) check;
                while (check != -1) {
                    //System.out.print(ch);
                    sb.append(ch);
                    if (ch == lastChar) {
                        if (sb.toString().endsWith(pattern)) 
                        {
                            //Hay que declarar la variable cadena
                            //como un atributo de la clase y de 
                            //tipo String
                            cadena=sb.toString();
                         return sb.toString();
                        }
                    }
                    check = in.read();
                    ch = (char) check;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return sb.toString();
        }
    
Con esto tendríamos todo lo necesario para poder consultar si un correo de Gmail existe o no pero como reconozco que es complejo y para muchos, sobre todo principiantes en Java, puede ser un infierno voy a pasar el programa completo para que sólo se tenga que importar y probar:

Aplicación comprobación correo

*Nota: En el proyecto saldrán dos tipos de errores. El primero se debe a que debéis de añadir las librerías externas (jar) que tiene ya que ahora mismo están con mi ruta, es decir C:\MiUser\.. Para arreglarlo debéis de agregarlas de nuevo vosotros. El segundo error es un error intencionado que he añadido para que no se os olvide que tenéis que poner en el código vuestra dirección de correo personal de GMail.

3 comentarios:

  1. buenas tardes, muy buen tutorial, tengo una pregunta... será posible que en vez de realizar esto por consola se realice en un jtextarea? no sabria como hacerlo? para que me de una idea por favor

    ResponderEliminar
    Respuestas
    1. Hola, pero ¿Qué quieres hacer en el JTextArear, te refieres a crearte una consola cmd de Windows en Java que ejecute comandos mediante el JTextArea o que te muestre si el correo es válido o no?

      Eliminar
  2. una pregunta las variables son de que tipo, por que en eclipse no las reconoce

    ResponderEliminar