Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.06.2011, 20:39
Аватар для cheburator
cheburator cheburator вне форума
Прохожий
 
Регистрация: 09.05.2008
Сообщения: 15
Репутация: 10
По умолчанию Автомтатическая отправка сообщений в фоновом режиме

Код:
procedure TMessage.BitBtn1Click(Sender: TObject);
begin


Memo1.Lines.Clear;
      LOG('                                                    Уважаемый абонент!!!');
      LOG('');
      LOG(' Специализированный оператор связи  уведомляет Вас о том,');
      LOG(' что сертификат с данными:');
      LOG('');
      LOG(FormatDateTime(' Действителен с: dd.mm.yyyy г.', StrToDateTime(date_s.Caption)));
      LOG(FormatDateTime(' Действителен до: dd.mm.yyyy г.', StrToDateTime(label4.Caption)));
      LOG('');
      LOG(' ФИО владельца: '+Fio_vlad.Caption);
      LOG(' Должность: '+Dolzh.Caption);
      LOG(' Организация: '+Organiz.Caption);
      LOG(' Адрес электронной почты: '+Form9.DBGrid1.Fields[9].AsString);
      LOG(' Серийный номер: '+Ser_nom.Caption);
      LOG('');
      LOG(' истекает через'+IntToStr(NOW-Form9.DBGrid1.Fields[1].Value)+' дн.');
      LOG('');
      LOG(FormatDateTime('по стостоянию на: dd.mm.yyyy г.', NOW));
      LOG('');
      LOG('');
      LOG(' Рекомендуем Вам связаться с вашим менеджером для уточнения информации по тел: ');
      LOG(' номера телефонов ');
      LOG('');
      LOG(' либо по адресу электронной почты :');
      LOG(' какой-то адрес');
      LOG(' 2-ой какой-то адрес');
      LOG('');
      LOG(' С Уважением, оператор связи"');
      LOG(' доп.инфа об операторе: сайты и разная хрень');

IdSMTP1.Port:=25; //порт
IdSMTP1.Host := 'smtp.mail.ru'; //хост
IdSMTP1.AuthenticationType:=atLogin;
IdSMTP1.Username:='логин на почтовике'; //user
IdSMTP1.Password:='пароль на ящик';  //password
IdMessage1.AddHeader('Content-Type: text/html; charset= "windows-1251"');
IdMessage1.Subject:='=?UTF-8?B?0KPQstC10LTQvtC80LvQtdC90LjQtSDQvtCxINC40YHRgtC10YfQtdC90LjQuCDRgdC10YDRgtC40YTQuNC60LDRgtCwLg?='; {заголовок}
IdMessage1.Recipients.EMailAddresses:=Edit1.Text; //адрес получателя
IdMessage1.From.Address:='parabellum_87@mail.ru'; //?адрес отправителя
IdMessage1.Body.Assign(Memo1.Lines);
try
try
IdSMTP1.Connect(1000);
IdSMTP1.Send(IdMessage1);
except on E:Exception do
Memo1.Lines.Insert(0, 'ERROR: ' + E.Message);
end;
finally
if IdSMTP1.Connected then
IdSMTP1.Disconnect;
end;

Try
            DM.ADOConnection1.BeginTrans;
              with DM.UPDATE_pis do
                begin
                  Parameters.ParamByName('@ID_Pisma').Value:=Ser_nom.Caption;
                  Parameters.ParamByName('@Data_otprav').Value:=NOW;
                  Parameters.ParamByName('@Poluch').Value:=Edit1.Text;//на какой адрес отправили
                  Parameters.ParamByName('@ID_Sotrud').Value:=Form9.DBGrid1.Fields[6].AsString;
                  Parameters.ParamByName('@Status').Value:='Отправлено';//притваиваем статус отпрвлено, согласно ид записи из формы
                end;
              DM.UPDATE_pis.ExecProc;
              DM.ADOConnection1.CommitTrans;
        except
          DM.ADOConnection1.RollbackTrans;
          ShowMessage('Невозможно выполнить. Повторите!');
        end;
        
  Message.Close;
  DM.Zapros_ist_sert.Active:=False;
  DM.Zapros_ist_sert.Active:=True;
end;
end.

в общем есть такой код отправки уведомления абону от том что у него истекает серт через столько-то дней по состоянию на дату отправки. Недостаток: нужно сделать запрос на выборку таких сертификатов. вывести это все в ДБГрид, и поочередно открывать каждую такую строку и отправлять уведомление кнопкой отправить. Подскажите пожалуйста как можно научить делать программу эту функцию автоматически. Что бы два раза в день, например, она прогоняла запрос на поиск сертификатов срок которых истекает менее чем через 30 дней и отправляла подобное сообщение автоматически, без участия пользователя, том случает если статус сообщения на момент отправки "Готово к отправке".В идеале, делать она это должна в фоновом режиме. Что бы сотруднику осталось только заходить время от времени и проверять все ли нормально отправляется.
Ответить с цитированием
  #2  
Старый 15.06.2011, 20:52
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Для начала, данные надо брать не из DBGrida а непосредственно из источника. Далее, данные источника надо формировать с учетом ваших требований. И наконец, что-бы это все работало автоматом, самый простой способ бросить на форму компонент TTimer и выставить интервал скажем 10000 = 10 минут. В событие таймера переносите ваш код и делаете сначала выборку данных по определенному критерию, а уже потом по полученному результату выполняете свой код отправки сообщений.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 15.06.2011, 21:18
Аватар для cheburator
cheburator cheburator вне форума
Прохожий
 
Регистрация: 09.05.2008
Сообщения: 15
Репутация: 10
По умолчанию

Ага...спасибо, что подтвердил мои догадки.
Я представлял примерно так:
запрос на выборку по условию, где дата_окончания- NOW<=30 и статус "Готово в отправке";
далее код отправки сообщения, далее процедуру обновления записи в таблице с этим ИД (меняем статус с "готово к отправке" на "отправлено").
далее тянем следующую запись.

Вопрос теперь в следующем:
1. как это все замутить в фоне?
2. будет ли SQL ,блокировать транзакции на добавление новой записи в тот момент, когда будет выполняться описанный выше код?
3. и еще: как заставить делфи брать время с какого-нибудь более надежного ресурса, не с компа. А то вдруг кривые руки поменяют сис.время на компе и прога начнет рассылать сообщения "из будущего"
Ответить с цитированием
  #4  
Старый 15.06.2011, 22:03
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
3. и еще: как заставить делфи брать время с какого-нибудь более надежного ресурса, не с компа. А то вдруг кривые руки поменяют сис.время на компе и прога начнет рассылать сообщения "из будущего"
Ну стопроцентной защиты вам никто не даст, а вот если есть выход в инет, то никто не мешает настроить комп на синхронизацию с одним из серверов времени каковые для этого и придуманы.
Цитата:
2. будет ли SQL ,блокировать транзакции на добавление новой записи в тот момент, когда будет выполняться описанный выше код?
Нет, не будет. Одно другому не помеха. К тому-же запись в БД занимает столь мало времени, что особо заморачиваться этим не стоит.
Цитата:
1. как это все замутить в фоне?
TTimer тем и хорош, что позволяет выполнять некие действия в отдельной нити программы не мешая основному процессу.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 15.06.2011, 23:07
Аватар для cheburator
cheburator cheburator вне форума
Прохожий
 
Регистрация: 09.05.2008
Сообщения: 15
Репутация: 10
По умолчанию

Я думаю написать отдельный модуль, который будет запускаться с виндой в виде процесса и висеть в трее. Делать будет следующее: время от времени обновлять записи в БД, вычисляя сколько дней осталось до истечения серта, отправлять уведомления, и производить апдейт статуса с "готово к отправке" на "отправлено". делать это будет по таймауту в полностью автоматическом режиме. по сути дела это будет второе приложение, работающее с этой же базой. Думаю должно прокатить.
Ответить с цитированием
  #6  
Старый 16.06.2011, 06:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Лучше сервис напиши.
Ответить с цитированием
  #7  
Старый 16.06.2011, 09:20
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
TTimer тем и хорош, что позволяет выполнять некие действия в отдельной нити программы не мешая основному процессу.
Неправда ваша.
OnTimer выполняется в основном потоке.
Ответить с цитированием
  #8  
Старый 16.06.2011, 11:02
Аватар для cheburator
cheburator cheburator вне форума
Прохожий
 
Регистрация: 09.05.2008
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Лучше сервис напиши.
Как? Есть ссылки? А то у меня времени в обрез, до выходных прогу всю надо переделать. Отдельное приложение написать, работающее в фоновом режиме-это для меня полбеды, а вот с сервисом...я чего-то не догоняю краями как его писать
Ответить с цитированием
  #9  
Старый 18.06.2011, 00:10
Аватар для cheburator
cheburator cheburator вне форума
Прохожий
 
Регистрация: 09.05.2008
Сообщения: 15
Репутация: 10
По умолчанию

С работой приложения в фоне разобрался. Теперь проблема в другом:

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

Например

ФИО Возраст Статус сообщения.

Если возраст=30 и статус сообщения "готово к отправке", то отправляем " <ФИО>, вам сегодня <возраст>", далее обновляем запись статус сообщения:=<отправлено> иначе тянем другую запись.

зы: надеюсь,понятно описал проблему.
Ответить с цитированием
  #10  
Старый 19.06.2011, 03:20
Аватар для cheburator
cheburator cheburator вне форума
Прохожий
 
Регистрация: 09.05.2008
Сообщения: 15
Репутация: 10
По умолчанию

Проблема решена. Всем спасибо.
Кому интересно, как решил, могу скинуть код.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter