【问题标题】:JavaMail stops sending mails after a whileJavaMail 在一段时间后停止发送邮件
【发布时间】:2011-04-08 15:52:09
【问题描述】:

我目前正在从事 Java 程序员的暑期工作。我们有一个应用程序,人们可以在其中输入他们的任务、议程等。该程序是一个客户端-服务器程序,因此所有数据都存储在服务器上。

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

我使用 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:这是我的send函数的代码

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

【问题讨论】:

  • 请注意,这是 SMTP 服务器抱怨您要发送的消息,而不是 JavaMail 本身(注意 553)。因此,您将精力花在错误的地方:(

标签: java exception smtp jakarta-mail


【解决方案1】:

我会从捕捉SMTPAddressFailedException 异常开始

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

这可能就像您的一个用户在他们的电子邮件配置中出现拼写错误一样简单,如果是这种情况,您可能应该做的是在相关帐户上设置一个标志,该标志将在用户下次登录您的应用程序时提示他们验证他们的电子邮件设置。

【讨论】:

  • 嗯,我也在考虑这个问题。如果我为每个电子邮件地址发送邮件也会有帮助吗?所以不是“message.setRecipients(javax.mail.Message.RecipientType.TO, mail.getRecipients());”我会做 "for(InternetAddress recipient: mail.getRecipients()) { ... message.setRecipient(javax.mail.Message.RecipientType.TO, recipient); ... }
  • 您应该将mail.smtp.sendpartial 设置为true,而不是发送多条消息,请参阅java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/…
  • 谢谢!这正是我需要的!
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 2019-04-03
  • 2016-11-28
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多