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:
- 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: jakarta-oro-2.0.8.jar
- Después importamos las siguientes librerías a nuestro proyecto:
- Ahora añadimos el método para realizar la conexión al servidor de Gmail y ejecutar los comandos necesarios para nuestro cliente Telnet:
- Añadimos el método write:
- Por último el método readUntil:
Telnet.jar
commons-io-2.4-bin.tar.gz
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.
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); } } }
public void write(String value) { try { out.println(value); out.flush(); //System.out.println(value); } catch (Exception e) { e.printStackTrace(); } }
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.
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
ResponderEliminarHola, 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?
Eliminaruna pregunta las variables son de que tipo, por que en eclipse no las reconoce
ResponderEliminar