J'utilise le système javax.mail et je rencontre des problèmes avec les exceptions "adresse invalide". Voici les bases du code:Obtenir une adresse invalide avec javax.mail lorsque les adresses sont correctes
// 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 (parce que je peux leur envoyer via un client de messagerie standard), le code ci-dessus jettera une exception "Invalid Address" lors de la tentative d'envoi.
Des indices ou des indices seraient grandement appréciés.
--Mise à jour: problème d'authentification.
Ok, voici ce que j'ai découvert qui se passait. Lors de la réception d'un courrier électronique, le code ci-dessus configure correctement l'authentification et le rappel Authenticator.getPasswordAuthentication() est appelé.
Ce n'est pas le cas lors de l'envoi d'un courrier électronique. Vous devez faire un peu plus. Ajoutez ceci:
// Setup mail server
props.put("mail.smtp.host", m_sending_host);
props.put("mail.smtp.auth", "true");
qui force l'API javax.mail à effectuer l'authentification de connexion. Et puis utilisez une instance réelle de transport au lieu de la méthode .send statique():
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 Fermez-moi. La différence entre les adresses qui "travaillaient" et les adresses qui ne fonctionnaient pas était que celles qui "travaillaient" é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 l'API javax.mail quand je pensais que cela aurait été le cas.
Merci pour les indices qui m'incitent à regarder aussi le côté serveur de courrier.
Il serait utile de connaître quelques exemples d'adresses électroniques signalées comme non valides. Ou au moins leur format. –
matt b - ce qu'il a dit! –
Veuillez donner une liste d'emails invalides. – johnstok