Как Java-программа должна обрабатывать отключение внешнего почтового сервера? - PullRequest
4 голосов
/ 10 ноября 2009

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

Каков наилучший способ доставки электронной почты при восстановлении почтового сервера?

Ответы [ 7 ]

9 голосов
/ 10 ноября 2009

Очередь запросов. Создайте отдельный поток, который просто ждет, пока что-то войдет в очередь, и пытается отправить это по электронной почте Если это не удается, он ждет несколько часов и пытается снова. После отправки сообщения он возвращается в очередь для получения следующего сообщения.

2 голосов
/ 10 ноября 2009

Если вы переходите от «переслать все к этому SMTP-серверу, который всегда есть», к ситуации, когда вам нужно обрабатывать все виды условий, обычно обрабатываемых полным SMTP-сервером, например повторять позже, повторять передачу, если соединение закрыто, используйте MX -хосты в указанном порядке и т. п., вы можете захотеть просто иметь SMTP-сервер внутри вашего клиента (но тот, который не принимает входящие соединения), так как это убирает всю грязную логику из ваших приложений .

Я считаю, что почтовый сервер Джеймса - http://james.apache.org/ - легко встраивается, но я на самом деле не пробовал.

2 голосов
/ 10 ноября 2009

Возможно, вы захотите сохранить электронное письмо в файле, возможно, в XML-файле, чтобы в случае сбоя приложения вы не потеряли эту информацию.

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

Но то, как вы справитесь с этим, будет зависеть от спецификации того, как обрабатывать ошибки.

2 голосов
/ 10 ноября 2009

Поместите объект электронной почты в стек или список, если он не может быть отправлен, когда сервер электронной почты возвращается, выскакивает каждое письмо, пока оно не станет пустым.

0 голосов
/ 17 ноября 2009

Apache James - http://james.apache.org/ позволит вам запустить свой собственный почтовый сервер в качестве прокси-сервера, не только это, но и написано на 100% Java, так что вы можете понять, что он делает, и в качестве дополнительного бонуса Джеймс использует базы данных для постановки почты в очередь, так что вы можете даже вводить почту непосредственно в очереди, вставляя в базу данных, а затем оставить весь бизнес по отправке почты Джеймсу.

0 голосов
/ 10 ноября 2009

Если вы находитесь в мире Unix / Linux, рассмотрите альтернативный вариант отправки ваших оповещений с использованием syslog и работы с генерацией электронных писем на этой стороне. Например, nsyslogd имеет модуль ommail для собственной генерации писем.

IIRC, есть адаптеры для log4j и тому подобное, которые могут соединять миры Java и syslog с минимальным (нулевым?) Кодированием.

0 голосов
/ 10 ноября 2009

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

Вы можете использовать что-то вроде Quartz, чтобы планировщик проверял сообщения, которые нужно отправить. Если сообщение не может быть отправлено (например, SMTP-сервер недоступен), то это сообщение перенесено на более поздний срок. У вас может быть задача для каждого сообщения или постоянная задача, которая проверяет сообщения, и доступный почтовый сервер затем отправляет сообщения. Постоянное задание даст вам пакет электронной почты.

...