2012-03-24 104 views
5

Nuestra aplicación web envía un correo electrónico a cada usuario que ingresa su ID de correo electrónico. Pero ¿cómo puedo asegurarme de que el ID de correo electrónico ingresado por el usuario sea válido? En realidad, lo que hacemos cuando un usuario ingresa un ID de correo electrónico le enviamos un enlace a su ID de correo electrónico para activar la cuenta. Tengo un código para enviar correos electrónicos. Pero no me da ningún error, incluso si la identificación del correo no existe. ¿Podrías decirme cómo resolver el problema? Si la identificación del correo electrónico no existe realmente, debería dar un error.Cómo verificar que realmente exista una dirección de correo electrónico enviando un correo electrónico a java

estoy aquí adjunto mi código

package csv; 
    import javax.mail.PasswordAuthentication; 
    import java.util.Properties; 
    import javax.activation.DataHandler; 
    import javax.activation.DataSource; 
    import javax.activation.FileDataSource; 
    import javax.mail.BodyPart; 
    import javax.mail.Message; 
    import javax.mail.MessagingException; 
    import javax.mail.Multipart; 
    import javax.mail.Session; 
    import javax.mail.Transport; 
    import javax.mail.internet.AddressException; 
    import javax.mail.internet.InternetAddress; 
    import javax.mail.internet.MimeBodyPart; 
    import javax.mail.internet.MimeMessage; 
    import javax.mail.internet.MimeMultipart; 

    public class email { 

public void send(String recipeintEmail, 
     String subject, 
     String messageText,String[] attachments) 
     throws MessagingException, AddressException { 
    /* 
     It is a good practice to put this in a java.util.Properties 
     file and encrypt password. Scroll down 
     to comments below to see 
     how to use java.util.Properties in JSF context. 
    */ 
    String senderEmail = "our email address"; 
    String senderMailPassword = "password"; 
    String gmail = "smtp.gmail.com"; 

    Properties props = System.getProperties(); 

    props.put("mail.smtp.user", senderEmail); 
    props.put("mail.smtp.host", "smtp.gmail.com"); 
    props.put("mail.smtp.port", "465"); 
    props.put("mail.smtp.starttls.enable", "true"); 
    props.put("mail.smtp.debug", "true"); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.socketFactory.port", "465"); 
    props.put("mail.smtp.socketFactory.class", 
      "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 

    // Required to avoid security exception. 
    email.MyAuthenticator authentication = 
      new email.MyAuthenticator(senderEmail,senderMailPassword); 
    Session session = 
      Session.getDefaultInstance(props,authentication); 
    session.setDebug(true); 

    MimeMessage message = new MimeMessage(session); 

    BodyPart messageBodyPart = new MimeBodyPart();  
    messageBodyPart.setText(messageText); 

    // Add message text 
    Multipart multipart = new MimeMultipart(); 
    multipart.addBodyPart(messageBodyPart); 

    // Attachments should reside in your server. 
    // Example "c:\file.txt" or "/home/user/photo.jpg" 

    for (int i=0; i < attachments.length; i++) {   

     messageBodyPart = new MimeBodyPart();  
     DataSource source = new FileDataSource(attachments[i]); 
     messageBodyPart.setDataHandler(new DataHandler(source)); 
     messageBodyPart.setFileName(attachments [i]);   
     multipart.addBodyPart(messageBodyPart) ; 
    } 



    message.setContent(multipart);     
    message.setSubject(subject); 
    message.setFrom(new InternetAddress(senderEmail)); 
    message.addRecipient(Message.RecipientType.TO, 
     new InternetAddress(recipeintEmail)); 

    Transport transport = session.getTransport("smtps"); 
    transport.connect(gmail,465, senderEmail, senderMailPassword); 
    transport.sendMessage(message, message.getAllRecipients()); 

    transport.close(); 

} 

private class MyAuthenticator extends javax.mail.Authenticator { 
    String User; 
    String Password; 
    public MyAuthenticator (String user, String password) { 
     User = user; 
     Password = password; 
    } 

    @Override 
    public PasswordAuthentication getPasswordAuthentication() { 
     return new javax.mail.PasswordAuthentication(User, Password); 
    } 
} 


public static void main(String args[]) throws MessagingException 
{ 
    // email e=new email(); 
    // String at[]={"c:/COPYRIGHT.txt"}; 
    // e.send("[email protected]", "hello","test" )"); 
} 

} 

Respuesta

3

Usted puede en alto usar regex para comprobar si la dirección es sintácticamente válida y/o buscar el MX records si el dominio es válida, pero esto todavía no garantiza que la dirección de correo electrónico es legítimo y pertenece al solicitante de registro de que se trate . Realmente no hay una manera más confiable que enviar un correo electrónico de verificación y esperar la confirmación en un corto período de tiempo.

+0

bien. Tengo tu respuesta. en nuestra aplicación también enviamos notificaciones a los teléfonos móviles de los usuarios. Entonces, ¿puedo ir a segmentar spliting para validar tanto el número de teléfono móvil como la dirección de correo electrónico? Generaré una cadena aleatoria, se dividirá en 2 partes, una se enviará al móvil y otra se enviará a la dirección de correo electrónico. Luego, al activar al usuario, debe ingresar ambos combinándolos. ¿Será una buena forma de validar la identificación del móvil y del correo electrónico en el momento? – kanchan

+0

sí. también puede generar una identificación única y almacenarla en la tabla de la base de datos contra el número de teléfono móvil del usuario. y enviar al usuario también. Cuando el usuario ingresa su identificación única, cámbiela con su id. Almacenada de la base de datos. – kandarp

4

no hay ningún método infalible para hacer esto. Puede intentar los pasos explicados en this blog post, pero no se garantiza que funcione con todo tipo de configuración de servidor de correo/retransmisión.

Envíe al usuario una clave de activación junto con la URL y que hará necesario proporcionar una identificación de correo electrónico válida si el usuario desea iniciar sesión/usar lo que está proporcionando.

+0

¿No hay forma de manejar identificadores de correo falso como [email protected] El código anterior me indica que el correo se envió correctamente a [email protected] aunque no sea válido. – kanchan

+0

La única validación rápida que puede hacer es verificar el formato del correo electrónico, es decir, si el texto corresponde a la gramática del id del correo electrónico. De lo contrario, tendrá que confiar en el mecanismo mencionado en la publicación del blog, que puede funcionar en ciertos casos. –

2

Si va a seguir enviando correos electrónicos para validar, le recomiendo que lo haga muy claro, enviará un enlace de validación de correo electrónico antes de permitir que el usuario acceda a lo que están registrando para reducir el número de direcciones de correo falsas Hemos realizado pruebas y algunos pequeños cambios en las etiquetas del formulario de registro han reducido significativamente nuestra tarifa de correo electrónico no válido.

Una palabra de advertencia. Si está utilizando el envío de correos electrónicos para verificar si un correo electrónico es válido y está enviando una gran cantidad de correos electrónicos a direcciones no válidas, especialmente en dominios orientados al consumidor (por ejemplo, Yahoo, GMail, AOL, etc.), corre el riesgo de ser un spammer desde los rebotes duros (enviar a una dirección no válida) afectarán su puntaje de reputación. Hace unos meses, escribí blog entry on the different ways to validate emails sobre formas gratuitas y comerciales de verificar si sus registrantes pueden ser útiles.

0

Puede usar java mail API para validar el correo electrónico.

try { 
     // 
     // Create InternetAddress object and validated the supplied 
     // address which is this case is an email address. 
     InternetAddress internetAddress = new InternetAddress(email); 
     internetAddress.validate(); 
     isValid = true; 
    } 

captura (AddressException e) {System.out.println ("Usted está en bloque catch - Excepción para:" + e-mail); }

Puede descargar API Java de correo http://www.oracle.com/technetwork/java/index-138643.html

0

Una forma de resolver esto podría ser para rastrear mensaje devuelto. Pero este enfoque tiene varias dificultades debido a estándares desiguales.

Sin embargo, valdría la pena hacer algo por nada. A veces es importante saber si el usuario ha recibido un correo electrónico y no responde o la dirección de correo electrónico es incorrecta.

Es posible que desee comprobar este enlace: http://www.oracle.com/technetwork/java/faq-135477.html#bounce

Ver este extracto de enlace:

Q: Cuando un mensaje no se puede entregar, se devuelve un mensaje de fallo. ¿Cómo puedo detectar estos mensajes "reboteados"?

A: Si bien existe un estándar de Internet para informar tales errores (el tipo MIME multiparte/informe, consulte RFC1892), aún no se ha implementado ampliamente. RFC1211 analiza este problema en profundidad, incluidos numerosos ejemplos.

En el correo electrónico de Internet, la existencia de un buzón o nombre de usuario en particular solo puede ser determinada por el último servidor que entregará el mensaje. El mensaje puede pasar por varios servidores de retransmisión (que no pueden detectar el error) antes de llegar al servidor final.

Normalmente, cuando el servidor final detecta un error de este tipo, devuelve un mensaje que indica el motivo del error al remitente del mensaje original. Existen muchos estándares de Internet que cubren tales notificaciones de estado de entrega, pero una gran cantidad de servidores no admiten estos nuevos estándares, en su lugar utilizan técnicas ad hoc para devolver dichos mensajes de falla.

Esto hace que sea muy difícil correlacionar un mensaje "rebotado" con el mensaje original que causó el problema. (Tenga en cuenta que este problema es completamente independiente de JavaMail). JavaMail ahora incluye soporte para analizar notificaciones de estado de entrega; vea el archivo NOTES.txt en el paquete JavaMail para más detalles.

Existen varias técnicas y heurísticas para resolver este problema, ninguna de ellas perfecta. Una técnica es las Vías de Devolución de Envoltura Variable, descritas en http://cr.yp.to/proto/verp.txt.

Cuestiones relacionadas