2012-11-22 5 views
17

Sto inviando email tramite Java utilizzando com.sun.mail.smtp.SMTPTransport.Come controllare l'indirizzo di posta elettronica esiste o no?

Sono riuscito a inviare l'e-mail, ma SMTPTransport non ha dato alcun errore se invio la posta a un indirizzo e-mail non valido.

C'è un modo per verificare se esiste un determinato indirizzo di posta elettronica oppure no?

Non voglio dire per controllare l'indirizzo di posta elettronica come parte cliente, ho bisogno di controllare come lato server di .

Ho trovato molte domande come questa in molti forum ma non ho trovato soluzioni adeguate.

il mio codice è -

String email = "[email protected]"; 

Properties props = new Properties(); 
props.put("mail.smtps.host", "mail.myDomain.com"); 
props.put("mail.smtps.auth", "true"); 
Session session = Session.getInstance(props, null); 

MimeMessage msg = new MimeMessage(session); 
msg.setFrom(new InternetAddress("Mail Demo <[email protected]>")); 
msg.setRecipients(Message.RecipientType.TO, email); 
msg.setSubject("Mail Example"); 
msg.setSentDate(new Date(System.currentTimeMillis())); 

String txt = "Message Body"; 

msg.setText(txt); 
SMTPTransport st = (SMTPTransport)session.getTransport("smtps"); 
st.connect("mail.myDomain.com","[email protected]","password"); 
st.sendMessage(msg, msg.getAllRecipients()); 

System.out.println("ServerResponse : " + st.getLastServerResponse()); 

Si dà in uscita sia per email_address validi e non validi: - 250 OK id = 1TbWgN-0007oY-8r

Ti prego, aiutami a risolvere il problema. Grazie in anticipo.

+0

Cosa hai provato? Non vedo nulla nel tuo codice per verificare la validità/correttezza di un indirizzo email. Lo farei con un'espressione regolare. – jlordo

+0

define valid: intendi controllare se un'e-mail corrisponde effettivamente a una vera casella di posta o che l'e-mail ha una sintassi valida? – Peter

+0

@jlordo grazie per la risposta. L'espressione regolare controlla solo che l'indirizzo di posta elettronica sia in formato valido. Voglio verificare che l'indirizzo di posta elettronica esista o meno – Deepu

risposta

18

Grazie a tutti per le vostre risposte.

Sono in grado di risolvere il mio problema tramite MX Record di controllo.

Ho utilizzato questo Link per risolvere il problema. Possa anche questo essere utile per qualcuno.

Hashtable env = new Hashtable(); 
env.put("java.naming.factory.initial", 
      "com.sun.jndi.dns.DnsContextFactory"); 
DirContext ictx = new InitialDirContext(env); 
Attributes attrs = ictx.getAttributes 
         (hostName, new String[] { "MX" }); 
Attribute attr = attrs.get("MX"); 
if ((attr == null) || (attr.size() == 0)) { 
    attrs = ictx.getAttributes(hostName, new String[] { "A" }); 
    attr = attrs.get("A"); 
    if(attr == null) 
     throw new NamingException 
        ("No match for name '" + hostName + "'"); 
} 

Grazie.

+0

Grazie per il link! Ho usato quell'esempio dal tuo link, ma ho ricevuto l'errore: Impossibile trovare la classe javax.naming.directory.InitialDirContext. Hai avuto lo stesso problema? – XXX

+1

Ho provato in Java 6 e OpenJDK ha funzionato bene per me, non ho avuto questo problema. La classe è nelle librerie Core di Java. – Deepu

+0

Funziona per tutti i domini? È un metodo infallibile? –

6

L'unico modo per confermare un indirizzo di posta elettronica è di inviare una e-mail e richiedere all'utente di seguire un link (unico) nella e-mail al tuo sito web.

+2

+1, ma non aiuterà a identificare gli indirizzi temporanei di junkmail. – jlordo

+0

@Quentin, grazie per la risposta. Voglio farlo per la registrazione, quindi lo voglio in Java. – Deepu

+1

Deepu - Penso che ciò che @Quentin sta cercando di dire è l'approccio e non ha nulla a che fare con il linguaggio (Java, C#, ecc.). Ad esempio, quando crei un nuovo account, diciamo, su Twitter, il sito invia un'email che hai menzionato nella pagina di registrazione. Ovviamente, apri la tua casella di posta e fai clic sul link per verificare che tu sia un vero utente. Lo stesso approccio di Quentin e non ha nulla a che fare con la lingua. – Steven