JavaMail перестает отправлять письма через некоторое время - PullRequest
3 голосов
/ 06 сентября 2010

Я сейчас работаю летом программистом на Java.У нас есть приложение, в которое люди могут вводить свои задачи, повестку дня и т. Д. Программа представляет собой программу клиент-сервер, поэтому все данные хранятся на сервере.

Мой начальник попросил меня создать систему почтовых уведомлений.Например, когда крайний срок выполнения задачи близок, он отправляет электронное письмо лицу, назначенному для этой задачи.

Я внедрил эту систему на сервере (который работает 24/24) с использованием JavaMail, и он работает оченьЧто ж.Но через некоторое время (не знаю, как долго) 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: Это код моей отправки функция

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

1 Ответ

1 голос
/ 06 сентября 2010

Я бы начал с ловли SMTPAddressFailedException исключений

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

Это может быть так же просто, как если бы у одного из ваших пользователей была опечатка в конфигурации электронной почты, в этом случае вам, вероятно, следует установить флаг соответствующей учетной записи, который будет запрашивать пользователя при следующем входе в ваше приложение проверить свои настройки электронной почты.

...