2010-05-07 3 views
0

Nous avons un programme de threads qui envoie du courrier en bloc. Les informations commeAuthentification Échec de l'exception - Au milieu de l'envoi de courrier en masse code

1. To 
2. Subject 
Etc. 

sont extraites de la base de données, le courrier est composé et poussé vers le serveur SMTP. Un de nos clients a envoyé un courrier en nombre avec 2390 email. Après avoir envoyé 40 e-mails, tout à coup l'exception suivante est survenue

EXCEPTION 
javax.mail.AuthenticationFailedException 

STACKTRACE 
javax.mail.Service.connect(Service.java:306) 
javax.mail.Service.connect(Service.java:156) 
javax.mail.Service.connect(Service.java:105) 
............... 
java.lang.Thread.run(Thread.java:619) 

et les e-mails 2350 reste a échoué.

Pourquoi cela se produit-il?

Merci pour les suggestions et une aide

Ezhil

=============================== ===============

Mon code:

Session session = Session.getInstance(properties, new SMTPAuthenticator(smtpAuthenticationBean.getUserName(), smtpAuthenticationBean.getPassword()))) : (Session.getInstance(properties, null)) 
for each email id 
{ 

    InternetAddress iAddress = new InternetAddress(getFromHeader(jobListBean.getFromDisplayName(), jobListBean.getFromEmail())); 
    Multipart multipart   = new MimeMultipart(); // By default, Content Type is "mixed" 


    msg.setSubject(jobListBean.getSubject()); 
    msg.setSentDate(new Date()); 

    // Set Internet Headers 
    msg.setHeader("Importance", priorityType); 

    msg.setHeader("Disposition-Notification-To", jobListBean.getFromEmail()); 

    FileDataSource fds = new FileDataSource(tempAbsoluteFileName); 
    MimeBodyPart htmlBodyPart = new MimeBodyPart(); 

    String fileContent = org.objectstyle.woproject.util.FileStringScanner.stringFromFile(new File(tempAbsoluteFileName)); 
    htmlBodyPart.setText(fileContent); 
    multipart.addBodyPart(htmlBodyPart); 

    msg.setContent(multipart); 

    InternetAddress address[] = InternetAddress.parse(emailList.toString(), true); 

    Transport smtpTransport = session.getTransport(); 
    smtpTransport.addTransportListener(this); 

    smtpTransport.connect(); 

    smtpTransport.sendMessage(msg, address); 

    smtpTransport.close(); 

    File file = new File(tempAbsoluteFileName); 
    file.delete(); 
} 

===================== ================

Oui, il y a une chance pour que le serveur smtp obtienne déconnecté ou ne pas répondre depuis son programme de thread, je peux dire au cas max plus de 1000 mails peut être poussé dans le serveur smtp en même temps.

A tout casting, va lancer le serveur smtp

EXCEPTION 
javax.mail.AuthenticationFailedException 

STACKTRACE 
javax.mail.Service.connect(Service.java:306) 
javax.mail.Service.connect(Service.java:156) 
javax.mail.Service.connect(Service.java:105) 
............... 
java.lang.Thread.run(Thread.java:619) 

si elle ne peut pas servir notre demande

=============

encore J'ai besoin de regarder dans le journal du serveur SMTP.

Ezhil

+0

Pouvez-vous poster le code pour l'envoi? Le serveur SMTP peut-il vous déconnecter après un certain nombre de messages? – JoseK

+0

Vérifiez vos journaux de serveur SMTP, cela peut vous conduire à la raison réelle du problème. – mindas

+0

J'ai mis à jour ma question – Ezhil

Répondre

1

Un AuthenticationFailedException n'a rien à voir avec votre code, il est élevé lorsque le serveur SMTP retourne un échec d'authentification.

De l'javadoc:

Cette exception est levée lorsque la méthode de connexion sur un magasin ou d'un objet de transport échoue en raison d'une défaillance d'authentification (par exemple, le mauvais nom d'utilisateur ou mot de passe).

Vous devrez donc vérifier votre serveur de messagerie pour savoir pourquoi il accepte certains messages, mais pas d'autres. Une chose que je peux penser serait une sorte de mécanisme de limitation des taux.

+0

J'ai peu de connaissances sur limitante, même est là une situation « Échec de l'authentification Exception » se produit en raison du facteur limitant – Ezhil

+0

Le serveur de messagerie n'est pas lancer une exception, il est juste retournant une erreur (pour autant que vous sachiez, l'erreur interne pourrait être quelque chose comme "nous sommes inquiets que vous envoyiez trop de messages et ayez un virus, parlez à votre administrateur système" mais JavaMail interprète cela comme une erreur d'authentification, qui est pourquoi vous obtenez cette exception) –

+0

Merci Adam, nous avons parlé avec les fournisseurs de serveurs smtp. Ils ont dit: «Il y a une limitation, même dans un environnement de serveur dédié, dans ce cas, pour éviter que le serveur ne soit surchargé». nous avons demandé pour le journal du serveur smtp auprès des fournisseurs, pour le confirmer. – Ezhil

1

Est-ce le même message qui est envoyé encore et encore au serveur de messagerie? Au lieu de faire la boucle for pour chaque adresse e-mail, vous devez envoyer tous les e-mails en un seul appel à l'aide de sendMessage.(que votre code semble faire)

smtpTransport.sendMessage(msg, address); 

Le serveur de messagerie prendra alors une copie du message et l'enverra à plusieurs adresses.

Peut-être que cela empêchera le seuil de taux.

+0

Dans ce type de courrier en vrac. Le client demandera une identification individuelle. Comme dans le champ "À", un seul courriel devrait être disponible. Ce qui signifie qu'il est adressé personnellement. Leads nous devons composer le courrier pour chacun séparément. Il existe une différenciation de contenu pour chaque courrier. Par exemple. On peut dire ... Cher Alka dans un mail et Cher Raju dans un autre mail. Alors seulement nous avons fait comme ça. – Ezhil

+0

Ensuite, vous pourriez avoir divisé en plusieurs threads plafonnés à 1000 mails par thread – JoseK

+0

Merci josek, Oui, nous devrions restreindre dans une certaine mesure le nombre de threads atteignant le serveur smtp en même temps pour éviter cela. Puisque le serveur de smtp devrait équilibrer notre demande. – Ezhil

Questions connexes