2010-04-21 3 views
3

Existe-t-il un moyen de vérifier les informations d'identification du serveur SMTP de l'utilisateur sans envoyer d'e-mail ou se connecter à POP/IMAP. Un code que j'ai essayé d'écrire échoue. Pouvez-vous trouver ce qui manque là.Vérification des informations d'identification SMTP JavaMail, sans envoyer d'e-mail

Ne vous inquiétez pas pour les courriels/mots de passe. Je sais que c'est là.

REMARQUE: Si vous essayez le code. Le cas 1 devrait passer lors de la fourniture des informations d'identification correctes. En cas d'échec, quelqu'un a changé le mot de passe. Vous devriez utiliser une autre adresse e-mail.



import java.util.Properties; 

import javax.mail.Authenticator; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 

public class EmailTest { 

public static void main(String[] args) { 
    EmailHelper eh = new EmailHelper(); 

    /* GMail Setting for SMTP using STARTTLS */ 
    String name = "AAA"; 
    String email = "[email protected]"; 
    String smtpHost = "smtp.gmail.com"; 
    String serverPort = "587"; 
    String requireAuth = "true"; 
    String dontuseAuth = "false"; 
    String userName = email; // same as username for GMAIL 
    String password = "zaq12wsx"; 
    String incorrectPassword = "someRandomPassword"; 
    String enableSTARTTLS = "true"; 
    String dontenableSTARTTLS = "false"; 

    try { 
    /* only valid case */ 
    eh.sendMail(name, email, smtpHost, serverPort, requireAuth, 
    userName, password, enableSTARTTLS); 
    System.out.println("Case 1 Passed"); 

    /* should fail since starttls is required for GMAIL. */ 
    eh.sendMail(name, email, smtpHost, serverPort, requireAuth, 
    userName, password, dontenableSTARTTLS); 
    System.out.println("Case 2 Passed"); 

    /* should fail since GMAIL requires authentication */ 
    eh.sendMail(name, email, smtpHost, serverPort, dontuseAuth, "", "", 
    dontenableSTARTTLS); 
    System.out.println("Case 3 Passed"); 

    /* should fail. password is incorrect and starttls is not enabled */ 
    eh.sendMail(name, email, smtpHost, serverPort, requireAuth, 
    userName, incorrectPassword, dontenableSTARTTLS); 
    System.out.println("Case 4 Passed"); 
    } catch (MessagingException e) { 
    e.printStackTrace(); 
    } 
} 

} 

class EmailHelper { 

private Properties properties = null; 
private Authenticator authenticator = null; 
private Session session = null; 

public void sendMail(String name, String email, String smtpHost, 
    String serverPort, String requireAuth, String userName, 
    String password, String enableSTARTTLS) throws MessagingException { 
    properties = System.getProperties(); 
    properties.put("mail.smtp.host", smtpHost); 
    properties.put("mail.smtp.port", serverPort); 
    properties.put("mail.smtp.starttls.enable", enableSTARTTLS); 
    properties.put("mail.smtp.auth", requireAuth); 
    properties.put("mail.smtp.timeout", 20000); 

    authenticator = new SMTPAuthenticator(userName, password); 

    session = Session.getInstance(properties, authenticator); 

    // session.setDebug(true); 

    Transport tr = session.getTransport("smtp"); 
    tr.connect(); 
    /* 
    * do I need more than just connect? Since when i try to send email with 
    * incorrect credentials it fails to do so. But I want to check 
    * credentials without sending an email. Assume that POP3/IMAP username 
    * is not same as the SMTP username, since that might be one of the 
    * cases 
    */ 
} 
} 

class SMTPAuthenticator extends Authenticator { 

private String userName = null; 
private String password = null; 

public SMTPAuthenticator(String userName, String password) { 
    this.userName = userName; 
    this.password = password; 

} 

@Override 
public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(userName, password); 
} 
}
+0

Cela fonctionne très bien. Quelle est ta question? –

+0

Ça ne marche pas très bien. Comme je l'ai mentionné les cas 2/3/4 devraient signaler une sorte d'erreur puisque les réglages effectués ne sont pas ceux que GMail Accepte. Alors j'ai probablement besoin de quelque chose de plus que juste .connect() Quoi exactement? C'est ce que j'essaie de comprendre. – DarK

Répondre

2

Vous avez ce problème en raison du protocole SMTP lui-même. L'authentification n'est pas obligatoire dans le protocole. Lorsque vous appelez la méthode "connect", vous faites au moins une commande "EHLO" qui renvoie les extensions supportées. L'authentification est une extension définie dans une RFC. JavaMail va essayer de faire une commande "AUTH" seulement si le serveur dit qu'il supporte ainsi et si vous avez fourni les informations d'identification. Les choses sont les informations d'extension d'authentification peuvent être envoyées seulement après avoir fait un "STARTTLS" (qui est aussi une extension), car il n'est pas sûr d'utiliser par exemple l'authentification PLAIN sur un canal clair. C'est pourquoi JavaMail fait un second "EHLO" après un "STARTTLS" pour mettre à jour l'extension supportée.

Donc une solution simple pour vous problème est de toujours mettre "mail.smtp.starttls.enable" à true. Dans JavaMail (1.4.5 au moins), cela signifie que la commande "STARTTLS" sera envoyée si le serveur dit qu'elle le supporte (sinon) alors vous obtiendrez l'extension mise à jour et JavaMail peut faire un "AUTH" si nécessaire.

Questions connexes