Предложения по отправке уведомлений по электронной почте из двухуровневого приложения с клиентом, потенциально не подключенным к Интернету - PullRequest
1 голос
/ 24 июня 2010

Я должен добавить уведомления по электронной почте в приложение клиент-сервер.

Уведомления происходят, когда пользователь выполняет определенные действия с пользовательским интерфейсом клиента.

Если у меня средний уровень илислужба, работающая на сервере, я могу представить, как это сделать:

1) я просто создаю таблицы БД с «ожидающими уведомлениями»

2), когда пользователь выполняет действие, генерирующее уведомлениеЯ добавляю запись в таблицу

3) на стороне сервера. Я бы постоянно пытался отправлять эти письма и удалять их из таблицы после успешной отправки.

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

Так что я как-то думал о том, чтобы реализовать что-то вроде этого:

1) какНа клиенте происходит событие notify-worth, тот же клиент (мой exe) пытается отправить уведомление, при неудаче он регистрирует уведомление в таблице «ожидающие уведомления» (сбой может быть из-за отсутствия интернета connection или любая другая проблема)

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

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

Дополнительные примечания (чтобы лучше понять сценарий):

a) Примечание: все уведомления отправляются ста же учетная запись электронной почты.

b) Мне не нужно отслеживать, кто отправил электронное письмо.

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

d)Я буду отправлять электронные письма, используя компоненты Indy и SMTP-сервер.

Ответы [ 5 ]

2 голосов
/ 24 июня 2010

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

Вы можете добавить утилиту командной строки (или параметр командной строки, как предложено bepe4711), которая будет толькопроверьте наличие ожидающих сообщений и попробуйте отправить их.

Добавьте эту утилиту командной строки в папку «Автозагрузка» или ключ «Выполнить» в реестре.Таким образом, сообщения будут по крайней мере отправляться при перезагрузке компьютера, даже если пользователь не запускает ваше приложение.

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

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

1 голос
/ 24 июня 2010

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

Когда мое приложение вызывает исключение, я собираю различную информацию, включая комментарии пользователей и снимки экрана. Затем я пытаюсь отправить это на наш веб-сервис. Если случайно веб-сервис недоступен. (т.е. не подключен к Интернету или веб-служба не работает) Я записываю результаты в файл XML на диске в каталоге профиля пользователя (App_Data).

Единственное существенное отличие - я не опрашиваю, чтобы проверить, работает ли сервер. Я пытаюсь отправить их снова при запуске приложения.

1 голос
/ 24 июня 2010

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

Затем вы устанавливаете клиент на сервер и запускаете его каждые x минут.

0 голосов
/ 24 июня 2010

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

0 голосов
/ 24 июня 2010

Если обе системы работают в Windows, взгляните на MS Message Queue.Он предназначен для отправки уведомлений в системы, которые не всегда онлайн.Я сделал это в .Net, там уже реализованы простые в использовании классы.Не уверен насчет Дельфи.

...