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.
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.
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 )
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.
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).
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.