|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Автомтатическая отправка сообщений в фоновом режиме
Код:
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
|
||||
|
||||
Для начала, данные надо брать не из DBGrida а непосредственно из источника. Далее, данные источника надо формировать с учетом ваших требований. И наконец, что-бы это все работало автоматом, самый простой способ бросить на форму компонент TTimer и выставить интервал скажем 10000 = 10 минут. В событие таймера переносите ваш код и делаете сначала выборку данных по определенному критерию, а уже потом по полученному результату выполняете свой код отправки сообщений.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
||||
|
||||
Ага...спасибо, что подтвердил мои догадки.
Я представлял примерно так: запрос на выборку по условию, где дата_окончания- NOW<=30 и статус "Готово в отправке"; далее код отправки сообщения, далее процедуру обновления записи в таблице с этим ИД (меняем статус с "готово к отправке" на "отправлено"). далее тянем следующую запись. Вопрос теперь в следующем: 1. как это все замутить в фоне? 2. будет ли SQL ,блокировать транзакции на добавление новой записи в тот момент, когда будет выполняться описанный выше код? 3. и еще: как заставить делфи брать время с какого-нибудь более надежного ресурса, не с компа. А то вдруг кривые руки поменяют сис.время на компе и прога начнет рассылать сообщения "из будущего" |
#4
|
||||
|
||||
Цитата:
Цитата:
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
||||
|
||||
Я думаю написать отдельный модуль, который будет запускаться с виндой в виде процесса и висеть в трее. Делать будет следующее: время от времени обновлять записи в БД, вычисляя сколько дней осталось до истечения серта, отправлять уведомления, и производить апдейт статуса с "готово к отправке" на "отправлено". делать это будет по таймауту в полностью автоматическом режиме. по сути дела это будет второе приложение, работающее с этой же базой. Думаю должно прокатить.
|
#6
|
|||
|
|||
Лучше сервис напиши.
|
#7
|
|||
|
|||
Цитата:
OnTimer выполняется в основном потоке. |
#8
|
||||
|
||||
Цитата:
|
#9
|
||||
|
||||
С работой приложения в фоне разобрался. Теперь проблема в другом:
вытягивать запись из базы, проверять на условие. Если условие выполняется, отправлять сообщение на мэйл, взятый из этой записи с данными из этой же записи, обновлять запись. Только после этого переходить к другой и так далее. Если условие не выполняется, то переходить к другой записи, пока не дойдем до нужной или до конца таблицы. Например ФИО Возраст Статус сообщения. Если возраст=30 и статус сообщения "готово к отправке", то отправляем " <ФИО>, вам сегодня <возраст>", далее обновляем запись статус сообщения:=<отправлено> иначе тянем другую запись. зы: надеюсь,понятно описал проблему. |
#10
|
||||
|
||||
Проблема решена. Всем спасибо.
Кому интересно, как решил, могу скинуть код. |