| 
| 
 | Вопрос # 6 460/ вопрос решён / | 
 |  Доброго времени суток уважаемые эксперты. Необходимо написать программу для рассылки почты через SMTP.
 Саму программу я написал, письма идут, все ок. Но тут встала проблема с ограничениями почтовых серверов в 100 \ 200 \ 500 писем в час, а моя база содержит в себе более 4 000 адресов. По этому было решено использовать потоки, и в них при достижении определенной отправки просто делать sleep. Начал я модифицировать то что у меня получилось, переносить в поток.. И что то пошло не так. Я при создании потока начал ловить Access Violation..
 Помогите пожалуйста понять, что я делаю не так. Код прикрепляю ниже.
 ps создание потока выглядит так:
 
 procedure TForm3.btnSendMailClick(Sender: TObject);
var
  NewThread: TNewThread;
begin
 NewThread:=TNewThread.Create(ledHost.text,LabeledEdit1.text,LabeledEdit2.text,ledFrom.text,ledSubject.text,ledTo.text,Memo2.text); Приложение:Переключить в обычный режим unit Unit1; interface uses  Classes, SysUtils, IdSMTP, IdMessage, IdCoderMIME; type  TNewThread = class(TThread)  private   protected    procedure Execute(); override;  public   constructor Create(ledHost,Username,Password,From,Subject,Recipients,Text: String);  end; var    MailMessage: TIdMessage;    SMTP: TIdSMTP;implementation constructor TNewThread.Create(ledHost,Username,Password,From,Subject,Recipients,Text: String);begin  inherited Create(True); SMTP.Host:=ledHost; SMTP.Port:=25;  Smtp.AuthenticationType:=atLogin; // atNone Smtp.Username:=Username; Smtp.Password:=Password;   MailMessage.ContentType:= 'text/html; charset=utf-8'; MailMessage.From.Name:='=?Windows-1251?B?'+TIdEncoderMIME.EncodeString(From)+'<>?='; MailMessage.Subject:= '=?Windows-1251?B?'+TIdEncoderMIME.EncodeString(Subject)+'<>?=';  MailMessage.From.Address:=From; MailMessage.Recipients.EMailAddresses:=Recipients; MailMessage.Body.Text:=AnsiToUtf8(Text);   Resume;end; procedure TNewThread.Execute();begin    try  try   SMTP.Connect(1000);   sleep(200);   SMTP.Send(MailMessage);  // ShowMessage('Ïèñüìî
îòïðàâëåíî!');  except on E:Exception do   begin    sleep(200);  //  Memo1.Lines.Insert(0,'Ñòàòóñ
îòïðàâêè: ERROR -
'+E.Message);  //  ShowMessage('Ïèñüìî íå
îòïðàâëåíî!');   end;  end; finally  if SMTP.Connected then SMTP.Disconnect; end;end; end. 
|  |   Вопрос задал: BloodVIRUS (статус: Посетитель)Вопрос отправлен: 27 июля 2013, 15:13
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 30 июля 2013, 12:36; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 27 июля 2013, 17:08 [#1]: Цитата (BloodVIRUS): Я при создании потока начал ловить Access Violation.. В таких случаях я сразу лезу в дебаггер, чего и тебе советую.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BloodVIRUS (статус: Посетитель), 28 июля 2013, 14:28 [#2]:Что то идет не так.. В лоб указал параметры, не передавая ничего.. Все равно та же ошибка.. |  
|   | min@y™ (статус: Доктор наук), 28 июля 2013, 15:02 [#3]: var
    MailMessage: TIdMessage; // <--- Какого ж хрена ты используешь
    SMTP: TIdSMTP; // глобальные (!!!) объекты внутри потоков?Не говоря уже о том, что я не вижу, где они у тебя создаются/освобождаются! Ты чо творишь ваще?
 
 
 constructor TNewThread.Create(ledHost,Username,Password,From,Subject,Recipients,Text: String);
begin
  inherited Create(True);
 SMTP.Host:=ledHost; // <--- Access violation at address ...
 SMTP.Port:=25;
 
 // ........
 
end; В отладчике это выясняется за 5 секунд. Видать, тебе им пользоваться кто-то запретил, да?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | DNK (статус: Студент), 30 июля 2013, 12:36 [#4]:Добавлю ещё подзатыльников.  Убери Resume из конструктора потока. Лучше разделять создание потока и его запуск: 
 
 NewThread:=TNewThread.Create(ledHost.text,LabeledEdit1.text,LabeledEdit2.text,ledFrom.text,ledSubject.text,ledTo.text,Memo2.text);
NewThread.Resume; И min@y™ дело говорит! Учи мат часть!
 "Digital Networked Knight" |  18 сентября 2013, 09:46: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Вроде советы дельные. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |