2010-09-06 12 views
3

Je suis en train de faire un job d'été en tant que programmeur Java. Nous avons une application où les gens peuvent entrer leurs tâches, agenda, etc. Le programme est un programme client-serveur, donc toutes les données sont stockées sur un serveur.JavaMail arrête d'envoyer des mails après un certain temps

Mon patron m'a demandé de créer un système de notification par courrier électronique. Par exemple, lorsqu'une échéance d'une tâche est proche, elle envoie un courrier électronique à la personne affectée à cette tâche.

J'ai implémenté ce système dans le serveur (qui fonctionne 24/24) en utilisant JavaMail et ça marche très bien. Mais après un certain temps (pas sûr combien de temps) JavaMail cesse d'envoyer des mails. Ceci est l'exception que je reçois:

... 
[Mailer] enqueuing mail 
[Mailer] enqueuing mail 
[Mailer] enqueuing mail 
[Mailer] enqueuing mail 
[Mailer] enqueuing mail 
[Mailer] enqueuing mail 
[Mailer] enqueuing mail 
... 
[Mailer] flushing mail queue (10 mails) 
[Mailer] exception 
javax.mail.SendFailedException: Invalid Addresses; 
    nested exception is: 
    com.sun.mail.smtp.SMTPAddressFailedException: 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1) 

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1446) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:736) 
    at javax.mail.Transport.send0(Transport.java:191) 
    at javax.mail.Transport.send(Transport.java:120) 
    at Server.Mailer.send(Mailer.java:119) 
    at Server.Mailer.flush(Mailer.java:84) 
    at Server.Mailer.run(Mailer.java:103) 
    at java.util.TimerThread.mainLoop(Unknown Source) 
    at java.util.TimerThread.run(Unknown Source) 
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1) 

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1297) 
    ... 8 more 

Lors de l'exécution de plus de X heures, il continue à donner ces exceptions. Donc je pensais que c'était parce que la connexion avec le serveur SMTP avait expiré. Alors j'ai changé ce code:

Session session = Session.getDefaultInstance(properties, authenticator); 

à:

Session session = Session.getInstance(properties, authenticator); 

il créerait une nouvelle session à chaque fois. Je pensais que cela obligerait JavaMail à se reconnecter au serveur SMTP et que le problème serait résolu. Mais cela ne l'a pas résolu, je reçois toujours ces exceptions ...

Est-ce que quelqu'un sait comment résoudre ce problème?

PS: Voici le code de mon envoyer la fonction

Session session = Session.getInstance(properties, authenticator); 
MimeMessage message = new MimeMessage(session); 

message.setSubject(mail.getSubject()); 
message.setContent(mail.getHTML().toString(), "text/html"); 
message.setFrom(mail.getSender()); 
message.setRecipients(javax.mail.Message.RecipientType.TO, mail.getRecipients()); 

Transport.send(message); 
+0

Notez que c'est le serveur SMTP qui se plaint du message que vous voulez envoyer, pas de JavaMail en lui-même (notez le 553). Par conséquent, vous dépensez vos efforts au mauvais endroit: ( –

Répondre

1

Je commence à attraper SMTPAddressFailedException exceptions

try { 
    Transport.send(message); 
} catch (SMTPAddressFailedException e) { 
    throw new SendFailedException("Unable to send to " + mail.getRecipients(), e); 
} 

Il pourrait être aussi simple que l'un de vos utilisateurs ayant une typo dans leur configuration de messagerie, si c'est le cas ce que vous devriez probablement faire est de mettre un drapeau sur le compte de relevent qui promettra à l'utilisateur la prochaine fois qu'ils se connectent à votre application pour vérifier leurs paramètres de messagerie.

+0

Eh bien, je pensais juste à cela aussi. Serait-il également utile si je voudrais envoyer le courrier pour chaque adresse e-mail? Ainsi, au lieu de "message.setRecipients (javax.mail. Message.RecipientType.TO, mail.getRecipients()); "Je le ferais" pour (destinataire InternetAddress: mail.getRecipients()) {... message.setRecipient (javax.mail.Message.RecipientType.TO, destinataire); ...} –

+1

Plutôt que d'envoyer plusieurs messages, vous devez définir 'mail.smtp.sendpartial' sur true, voir http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package- summary.html –

+0

Merci, c'est exactement ce dont j'ai besoin! –