sendmail() ограничить по времени!

 

Всем привет! В последнее время некоторые известные почтовые сервисы и мобильные операторы объединились, чтобы создать услугу информирования пользователей через SMS о новом письме, которое пришло в почтовый ящик.

Терминал MT4 может отсылать письма на специально заготовленный почтовый ящик по сигналу какого-либо индикатора. За отсыл почты отвечает функция sendmail().

Проблема в том, что на всех бесплатных SMTP почтовых сервисах стоит ограничение на количество входящих писем в течение определенного интервала времени (защита от спама). 

Мой индикатор же может отправить кучу писем за короткий промежуток времени. И в результате почтовый сервер перестает их принимать, и вся система накрывается медным тазом, пока почтовый сервер не оклимается.

Подскажите, как можно ограничить срабатывание функции sendmail() ? То есть, чтобы после предыдущего срабатывания он сработал не ранее времени t ?

Код выглядит примерно так:

Если индикатор покавывает то-то, то:

    {

     вывести на экран то-то;

     sendmail("сигнал", "сигнал");

     }

 
STill_ace:


Подскажите, как можно ограничить срабатывание функции sendmail() ? То есть, чтобы после предыдущего срабатывания он сработал не ранее времени t ?

В индюке не советую такого делать, а в советнике запросто можно поставить задержку через Sleep(msec);

 
   int SleepMinutes=3; // Отсылать не чаще, чем раз в 3 минуты

   static int LastTime=0;
      if(TimeCurrent()>LastTime+SleepMinutes*60){
         LastTime=TimeCurrent();
         SendMail(...........
      }
 
Все довольно просто, чтобы не вешать индикатор sleep - ом, после успешной отправки снять время сервера, а потом при отправке постоянно спрашивать если текущее время больше записанного на t то можно отправлять. А потом конечно перезаписать новое время сервера (отправки). Это первое что пришло в голову можно поток создать отдельный конечно.
 

Спасибо, теперь все ОК. Код integer'a решил проблему. 

 
extern int MailSleepMinutes=3;

int start(){
   if("что-то"=="произошло"){
      // ставим письмо в очередь
      MailSend("Тема","Текст Письма");
   }
   
   // на каждом тике
   MailSend(); 
   
}

void MailSend(string aSubject="",string aText=""){
   static string tMailBuffer[][2];
      if(aSubject!="" || aText!=""){ // постановка в очередь
         ArrayResize(tMailBuffer,ArraySize(tMailBuffer)/2+1);
         tMailBuffer[ArraySize(tMailBuffer)/2-1][0]=aSubject;
         tMailBuffer[ArraySize(tMailBuffer)/2-1][1]=aText;      
      }
   static int tLastTime=0;
      if(ArraySize(tMailBuffer)>0){ // есть в очереди письма
         if(TimeCurrent()>tLastTime+MailSleepMinutes*60){ // подошло время
            tLastTime=TimeCurrent();
            SendMail(tMailBuffer[0][0],tMailBuffer[0][1]);
               // убираем отправленное из очереди
               for(int ti=0;ti<ArraySize(tMailBuffer)/2-1;ti++){
                  tMailBuffer[ti][0]=tMailBuffer[ti+1][0];
                  tMailBuffer[ti][1]=tMailBuffer[ti+1][1];                  
               }
            ArrayResize(tMailBuffer,ArraySize(tMailBuffer)/2-1);
         }
      }   
}

Еще один вариант c очередью, по идее Мike. Только не тестировал, могут быть ошибки. Аналогично можно сделать не по отдельному письму на каждое сообщение, а добавлять текст к одному письму, а потом отправлять длинное письмо.

Причина обращения: