Obtenir une adresse invalide avec javax.courrier quand les adresses sont bonnes


J'utilise le javax.système de messagerie, et ayant des problèmes avec les exceptions" Adresse non valide". Voici les bases du code:

    // Get system properties
    Properties props = System.getProperties();

    // Setup mail server
    props.put("mail.smtp.host", m_sending_host);

    // Get session
    Session session = Session.getDefaultInstance(props, new Authenticator(){
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(m_sending_user, m_sending_pass);
        }
    });


    // Define message
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(m_sending_from));
    message.addRecipient(Message.RecipientType.TO, 
        new InternetAddress(vcea.get(i).emailaddr));
    message.setSubject( replaceEnvVars(subject) );
    message.setText(replaceEnvVars(body));

    // Send message
    try {
        Transport.send(message);
    } catch (Exception e){
        Log.Error("Error sending e-mail to addr (%s): %s",
                vcea.get(i).emailaddr, e.getLocalizedMessage() );

    }

Le problème est que Le code ci-dessus fonctionne, parfois. Mais pour certaines adresses e-mail que je sais être valides (car je peux leur envoyer via un client e-mail standard), le code ci-dessus lèvera une exception "Adresse invalide" lors de la tentative d'envoi.

Tout indice ou indice serait grandement apprécié.

Update Update: problème avec Authentication.

Ok, voici ce que j'ai découvert se passait. Lors de la réception d'un e-mail, le code ci-dessus configure correctement l'authentification et l'authentificateur.Le rappel getPasswordAuthentication () est réellement appelé.

Pas lors de l'envoi d'e-mail. Vous avez à faire un peu plus. Ajouter ceci:

    // Setup mail server
    props.put("mail.smtp.host", m_sending_host);
    props.put("mail.smtp.auth", "true");

Qui forcera le javax.API mail pour faire l'authentification de connexion. Et puis utilisez une instance de transport réelle au lieu de la statique .envoyer() méthode:

    Transport t = session.getTransport(m_sending_protocol);
    t.connect(m_sending_user, m_sending_pass);

...

        // Send message
        try {
            t.sendMessage(message, message.getAllRecipients());
        } catch (Exception e){

Sans forcer l'authentification, le serveur de messagerie m'a vu comme un relais non autorisé et m'a simplement arrêté. La différence entre les adresses qui "fonctionnaient" et les adresses qui ne le faisaient pas était que celles qui "fonctionnaient" étaient toutes locales au serveur de messagerie. Par conséquent, il les a simplement acceptés. Mais pour toutes les adresses "relais" non locales, il rejetterait le message car mes informations d'authentification n'avaient pas été présentées par javax.API de messagerie quand J'ai pensé qu'il serait.

Merci pour les indices qui m'incitent à regarder le côté serveur de messagerie des choses aussi bien.

Author: Steven M. Cherry, 2008-10-27

5 answers

Update Update: problème avec l'authentification.

Ok, voici ce que j'ai découvert se passait. Lors de la réception d'un e-mail, le code ci-dessus configure correctement l'authentification et l'authentificateur.Le rappel getPasswordAuthentication () est réellement appelé.

Pas lors de l'envoi d'e-mail. Vous avez à faire un peu plus. Ajouter ceci:

// Setup mail server
props.put("mail.smtp.host", m_sending_host);
props.put("mail.smtp.auth", "true");

Qui forcera le javax.API mail pour faire l'authentification de connexion. Et puis utilisez une instance de transport réelle au lieu de la statique .envoyer() méthode:

Transport t = session.getTransport(m_sending_protocol);
t.connect(m_sending_user, m_sending_pass);

...

    // Send message
    try {
        t.sendMessage(message, message.getAllRecipients());
    } catch (Exception e){

Sans forcer l'authentification, le serveur de messagerie m'a vu comme un relais non autorisé et m'a simplement arrêté. La différence entre les adresses qui "fonctionnaient" et les adresses qui ne le faisaient pas était que celles qui "fonctionnaient" étaient toutes locales au serveur de messagerie. Par conséquent, il les a simplement acceptés. Mais pour toutes les adresses "relais" non locales, il rejetterait le message car mes informations d'authentification n'avaient pas été présentées par javax.API de messagerie quand je pensé qu'il aurait.

Merci pour les indices qui m'incitent à regarder le côté serveur de messagerie des choses aussi bien.

 6
Author: Steven M. Cherry, 2008-10-27 16:16:19

Je changerais l'appel en InternetAddress pour utiliser l'interprétation "stricte" et voir si vous obtenez d'autres erreurs sur les adresses avec lesquelles vous rencontrez des problèmes.

message.addRecipient(Message.RecipientType.TO, 
        new InternetAddress(vcea.get(i).emailaddr, true ));
//                                                 ^^^^ turns on strict interpretation

Je n'ai pas de problème avec ce que j'ai fait.]}

Si cela échoue, il lancera un AddressException qui a une méthode appelée getPos() qui renvoie la position de l'échec (Javadoc )

 2
Author: Alex B, 2008-10-27 15:26:17

Un bon indice pour ceux qui utilisent le cryptage ssl dans la configuration smtp, vous devez l'activer en spécifiant la propriété mail.smtp.ssl.enable, comme indiqué ci-dessous:

props.put("mail.smtp.ssl.enable", "true");

Sinon, cela peut entraîner des problèmes similaires à ceux décrits ci-dessus.

 1
Author: Alex Cheptsov, 2012-07-06 08:41:49

Cela me semble être un problème qui s'est produit à mon travail. Si le code que vous affichez est simultané, utilisez directement le système.getProperties cela pourrait être un problème, car la valeur d'hôte que vous leur mettez peut être écrasée par la requête suivante, tout en conservant l'utilisateur et le mot de passe de l'hôte écrasé.

Dans notre cas, nous avons résolu cela en utilisant un clone du système.getProperties() table de hachage.

J'espère que cela aide (ce problème était vraiment difficile à suivre).

 0
Author: , 2008-10-27 21:29:22

Essayez ceci:

String to="[email protected]";
String cc="[email protected],[email protected]"; //The separator ',' works good

message.setRecipients(Message.RecipientType.TO,new InternetAddress[] { 
new InternetAddress(to) }); // This is only one mail

InternetAddress[] addr = parseAddressList(cc); //Here add all the rest of the mails
message.setRecipients(Message.RecipientType.CC,addr);

Désolé pour mon anglais. Il n'est pas bon.

 0
Author: Agusti-N, 2013-08-01 09:11:05