Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 460

Раздел: Delphi » Прочее
/ вопрос решён /

Доброго времени суток уважаемые эксперты.
Необходимо написать программу для рассылки почты через 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);

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Classes, SysUtils, IdSMTP, IdMessage, IdCoderMIME;
  7.  
  8. type
  9. TNewThread = class(TThread)
  10. private
  11.  
  12. protected
  13. procedure Execute(); override;
  14. public
  15. constructor Create(ledHost,Username,Password,From,Subject,Recipients,Text: String);
  16. end;
  17. var
  18. MailMessage: TIdMessage;
  19. SMTP: TIdSMTP;
  20. implementation
  21.  
  22. constructor TNewThread.Create(ledHost,Username,Password,From,Subject,Recipients,Text: String);
  23. begin
  24. inherited Create(True);
  25. SMTP.Host:=ledHost;
  26. SMTP.Port:=25;
  27.  
  28. Smtp.AuthenticationType:=atLogin; // atNone
  29. Smtp.Username:=Username;
  30. Smtp.Password:=Password;
  31.  
  32.  
  33. MailMessage.ContentType:= 'text/html; charset=utf-8';
  34. MailMessage.From.Name:='=?Windows-1251?B?'+TIdEncoderMIME.EncodeString(From)+'<>?=';
  35. MailMessage.Subject:= '=?Windows-1251?B?'+TIdEncoderMIME.EncodeString(Subject)+'<>?=';
  36.  
  37. MailMessage.From.Address:=From;
  38. MailMessage.Recipients.EMailAddresses:=Recipients;
  39. MailMessage.Body.Text:=AnsiToUtf8(Text);
  40.  
  41. Resume;
  42. end;
  43.  
  44. procedure TNewThread.Execute();
  45. begin
  46. try
  47. try
  48. SMTP.Connect(1000);
  49. sleep(200);
  50. SMTP.Send(MailMessage);
  51. // ShowMessage('&#207;&#232;&#241;&#252;&#236;&#238; &#238;&#242;&#239;&#240;&#224;&#226;&#235;&#229;&#237;&#238;!');
  52. except on E:Exception do
  53. begin
  54. sleep(200);
  55. // Memo1.Lines.Insert(0,'&#209;&#242;&#224;&#242;&#243;&#241; &#238;&#242;&#239;&#240;&#224;&#226;&#234;&#232;: ERROR - '+E.Message);
  56. // ShowMessage('&#207;&#232;&#241;&#252;&#236;&#238; &#237;&#229; &#238;&#242;&#239;&#240;&#224;&#226;&#235;&#229;&#237;&#238;!');
  57. end;
  58. end;
  59. finally
  60. if SMTP.Connected then SMTP.Disconnect;
  61. end;
  62. end;
  63.  
  64. end.
  65.  


BloodVIRUS Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: BloodVIRUS (статус: Посетитель)
Вопрос отправлен: 27 июля 2013, 15:13
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 30 июля 2013, 12:36; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 27 июля 2013, 17:08 [#1]:

Цитата (BloodVIRUS):

Я при создании потока начал ловить Access Violation..

В таких случаях я сразу лезу в дебаггер, чего и тебе советую.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
BloodVIRUS

BloodVIRUS (статус: Посетитель), 28 июля 2013, 14:28 [#2]:

Что то идет не так.. В лоб указал параметры, не передавая ничего.. Все равно та же ошибка..
min@y™

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

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

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:32
Выполнено за 0.03 сек.