|
Вопрос # 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: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Вроде советы дельные.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|