C # регулирует количество отправленных электронных писем

#c# #asp.net

#c# #asp.net

Вопрос:

Мне было интересно, знает ли кто-нибудь хороший способ регулировать, сколько электронных писем отправляется через C #?

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

Моей первой мыслью было: при отправке первого электронного письма создайте текстовый файл и используйте счетчик для его нумерации. Делайте это, пока счетчик <6, чтобы я получал максимум 5 электронных писем. Я думаю, что это сработает, но это кажется глупым.

У кого-нибудь есть альтернатива этому, или я должен просто пойти с моей первой мыслью и выполнить очистку файлов?

Спасибо

РЕДАКТИРОВАТЬ: причина, по которой я пытался ограничить количество отправляемых электронных писем, заключается в том, что люди, которые получают эти электронные письма, реагируют не очень быстро. В то же время те, кто обрабатывает Exchange, не хотят, чтобы сервис рассылал людям спам. Я чувствовал, что 5 будет достаточно, чтобы успокоить обе стороны.

Комментарии:

1. Просто проверьте, когда было отправлено последнее электронное письмо. Если это произошло более 5 минут назад, отправьте электронное письмо, в противном случае подождите еще 60 секунд.

2. мой первый вопрос: зачем вам для этого нужен сервис? В Windows достаточно инструментов для обработки такого рода задач управления — даже в свойствах службы (службы в администрировании) вы можете перезапустить службу, если остановить и, наконец, запустить другую программу — так что сделайте это и напишите простую программу для отправки одного электронного письма, если служба окончательно остановлена — нетнужно пометить ваших ИТ-специалистов, нервируя их до реакции, таким образом, вы только игнорируете свою спам-почту 😉

3. Я что-то здесь упускаю.. почему текстовый файл? разве вы не можете сохранить это число внутри процесса???

4. @Carsten — Я также провожу перекрестную проверку других служб, работающих на разных серверах, и записываю в SQL, если несколько служб на нескольких серверах не работают.

5. @gbianchi — Ты знаешь…. Я понятия не имею, почему я не подумал сохранить там номер вместо текстового файла.

Ответ №1:

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

Таким образом, каждые 60 секунд вы проверяете, не работает ли служба, сохраняете дату и время, когда служба не работает. На следующем 60-секундном интервале вы можете проверить, была ли служба уже отключена. т. Е. Вы можете определить, отключилась ли служба только что или какое-то время. Вы также можете добавить другой флаг, чтобы определить, была ли последняя проверка ВВЕРХ или ВНИЗ.

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

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

Надеюсь, это даст вам несколько идей

РЕДАКТИРОВАТЬ: некоторый образец…

 bool ServiceWasDown = false;
DateTime ServiceDownTime = DateTime.Now;
DateTime LastEmailTime = DateTime.Now;

void OnTimerElapsed()
{
   if(IsServiceDown())
      ServiceDown();
   else
      ServiceUp();
}

void ServiceDown()
{
   if(ServiceWasDown)//already know about service
   {
      //if LastEmailTime more than 10 minutes ago send another email and update LastEmailTime
   }
   else//service just went down
   {
      //send new email
      LastEmailTime = DateTime.Now;
      ServiceWasDown = true;
      ServiceDownTime = DateTime.Now;
   }   
}

void ServiceUp()
{
   ServiceWasDown = false;   
}
  

Ответ №2:

Если вы используете систему.Таймеры.Таймер затем вы можете добавить переменную int для подсчета прошедших событий.