2010-09-06 152 views
3

我目前正在做Java程序员的暑期工作。我们有一个应用程序,人们可以输入他们的任务,议程等。该程序是一个客户端服务器程序,所有数据都存储在服务器上。JavaMail在一段时间后停止发送邮件

我的老板让我做一个邮件通知系统。例如,当任务的截止日期接近时,它会向分配给该任务的人员发送电子邮件。

我使用JavaMail在服务器(运行24/24)中实现了这个系统,它工作得很好。但过了一段时间(不知道多久),JavaMail停止发送邮件。这是例外,我得到:

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

当运行超过X小时时间越长,它一直给这些异常。所以我认为这是因为与SMTP服务器的连接超时。所以我改变了这种代码:

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

到:

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

所以它每次都创建一个新的会话。我认为这会迫使JavaMail重新连接到SMTP服务器,然后问题就解决了。但这并没有解决它,我仍然得到这些例外...

有谁知道如何解决这个问题?

PS:这是我用醒目SMTPAddressFailedException例外

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

这可能是因为你的用户有一个简单的开始我的发送功能

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

请注意,这是SMTP服务器抱怨您要发送的消息,而不是JavaMail本身(请注意553)。因此,你正在将自己的努力花在错误的地方:( – 2010-09-06 08:47:35

回答

1

代码在他们的电子邮件配置中输入错别字,如果这样的话你应该做的就是在相关帐户上设置一个标志,这将在用户下次登录你的应用程序时提示用户验证他们的电子邮件设置。

+0

呃,我只是在想这个问题。如果我为每个电子邮件地址发送邮件,它也会有所帮助吗?因此,而不是“message.setRecipients(javax.mail。 Message.RecipientType.TO,mail.getRecipients());“我会这样做”(InternetAddress收件人:mail.getRecipients()){... message.setRecipient(javax.mail.Message.RecipientType.TO,recipient); ...} – 2010-09-06 07:41:32

+1

您应该将'mail.smtp.sendpartial'设置为true,而不是发送多条消息,请参阅http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package- summary.html – 2010-09-06 07:51:12

+0

谢谢!这正是我需要的! – 2010-09-06 08:40:51