안녕하세여~
델파이를 사랑하는 한국의 젊은이 입니다.
지금 winshoes 컴포런트를 다운받아 db에 있는 email주소로 단체메일을 보내는 프로그램을 구현 중입니다.
문제는 winshoes 데모 소스를 보니깐 쓰레드를 이용했더군여
한사람한테 하나씩 물론 받는 사람들을 여려명으로 할수 있지만
그렇게 한다면.. 받는사람의 모든 주소가 수신측에서 보게 땜에 이를 막고자
하는데 문제가 많이 발생합니다.
while not query1.eof do begin
memoto.lines.add(query1.fieldbyname('email')asstrng);
query1.next;
end;
이런 씩으로 했을 경우 (xxxx@yahoo.co.kr, xxxx@hanmail.net,...... 이런씩으로
받는 사람이 나옴)
제가 원하는 것은 (to : xxxx@yahoo.co.kr) 요렇게
데모 소스는 대충 이렇게 한개의 function과 하나의 procedure 쯤
분석해 보면, function 에서는 메일서버와 보내는 사람의 이메일 주소를 ini 파일에서 읽어와서 검색한뒤 조건에 만족하면 procedure에서 msg컴퍼런의 값을 주고 이를 쓰래드에서 보내는 걸루 분석됩니다.
procedure TFormMain.ButtonSendClick(Sender: TObject);
function EmailAndHostAreValid : Boolean;
begin
ReadIniFile;
if (( Length(HostAddress) > 0 ) and
( Length(EmailAddress) > 0 ))
then
Result := True
else
Result := False;
end;
procedure PopulateSMTPValues;
begin
SMTP.Host := HostAddress;
with Msg do begin
Attachments.Clear;
CCList := MemoCC.Lines;
BCCList := MemoBCC.Lines;
Too := AMemoTo.Lines;
From := EmailAddress;
Subject := EditSubject.Text;
Text := MemoBody.Lines;
if FileExists(EditAttachment.Text) then
Attachments.AddAttachment(EditAttachment.Text);
end;
end;
begin
if EmailAndHostAreValid then begin
PopulateSMTPValues;
with TSenderThread.Create(True) do begin
FreeOnTerminate := True;
SMTP := Self.SMTP;
Msg := Self.Msg;
Resume;
end;
end else
ShowMessage('Use File : Setup to set your server parameters first.');
end;
// 쓰래드 부분
procedure TSenderThread.Execute;
begin
OldStatusEvent := SMTP.OnStatus; try
SMTP.OnStatus := StatusEvent;
SMTP.Send(Msg);
Terminate;
finally SMTP.OnStatus := OldStatusEvent; end
end;
*********************************************************************88
전 이 데모소스에서 procedure의 msg 의 값을 주는 부분을 없애고
while 문으로 돌리기 위해
begin
if EmailAndHostAreValid then begin
while not query1.eof do begin
memoto.lines.text := query1.fieldbyname('email').asstring;
SMTP.Host := HostAddress;
with Msg do begin
Attachments.Clear;
CCList := MemoCC.Lines;
BCCList := MemoBCC.Lines;
Too := MemoTo.Lines;
From := EmailAddress;
Subject := EditSubject.Text;
Text := MemoBody.Lines;
if FileExists(EditAttachment.Text) then
Attachments.AddAttachment(EditAttachment.Text);
end;
with TSenderThread.Create(True) do begin
FreeOnTerminate := True;
SMTP := Self.SMTP;
Msg := Self.Msg;
Resume;
end;
memoto.lines.text := '';
query1.next;
end;
end else
ShowMessage('Use File : Setup to set your server parameters first.');
end;
이렇게 바꾸었습니다. 위를 실행시키면..
당연히 에러 ^^;
쓰래드 부분에서 계속 연결 하더군여, 그리고 프로그램 다운
에러 분석은 아마 연결된 상태에서 계속 연결하는거 같아여, 후미~
어떻게 해결해야 할까여, 고수님들의 조언 및 힌트를 부탁 드리겠습니다.
저두열심히 공부해보구여, 전 델파이4.0을 쓰고 아쉽게도 fastnet이 없기땜에 쩝,
nmsmtp도 content-type : html/text; euc-kor가 지원안돼서, -.-; (5.0이상은 모르겠지만 전 설정하는 것이 없음)
* 암튼 정리가 잘 안된것 같네여..
고수님 저 좀 살려주세여..
일단, 가장 큰 문제는 쓰레드 부분입니다.
쓰레드를 쓰실때는 정말 조심해서 쓰셔야 합니다.
님의 의도는 아마도, 여러 사람에게 보내기 위해서 한 사람마다 이메일을
보내는 쓰레드를 만들어서 각각을 보내도록 구현을 하려고 한 것 같습니다만?
제가 제대로 이해했나요?
그럼, 일단 중요한 점을 하나 집고 가야합니다.
만약, 보내는 사람이 10000명이라면? while 루프를 돌면서 순식간에 10000개의
쓰레드가 동시게 생기겠죠? 그럼, 당근으루다가 컴퓨터가 무지 좋지 않은 이상에야
뻑이 나겠지요...
생성된 쓰레드의 개수를 제한하던가 해야겠지요...
음... 이부분은 코딩 하기가 쉽지 않을것 같군요...
그리고, 또한가지...
쓰레드를 쓰실때, 정말 주의하셔야될 점이 있는데, 쓰레드에서 메인 폼에 있는 컴포넌트를
직접 참조를 하면 안됩니다.
뭐, 예제 소스에서는 단 하나의 쓰레드가 생성되어, 바로 보내기 때문에 크게 문제될것
같지는 않지만, 만약 님의 의도대로 멀티쓰레드로 돌릴때는 윈도우 메시지가 제대로 처리되지
않아서, 프로그램이 죽은것처럼 됩니다.
님의 의도대로 코딩을 하시기 위해서는 차라리 쓰레드를 쓰시지 마시고,
데이터베이스에서 한명씩 읽어서 차례로 메일을 보내는 방법이 제일 수월하리라 생각됩니다.
그게 정신 건강에도 좋고, 힘도 덜 들듯싶군요...
(저도 멀티쓰레드로 몇번 구현해 봤는데, 머리 빠개집니다. ㅠ.ㅠ)
모름이 wrote:
> 안녕하세여~
> 델파이를 사랑하는 한국의 젊은이 입니다.
> 지금 winshoes 컴포런트를 다운받아 db에 있는 email주소로 단체메일을 보내는 프로그램을 구현 중입니다.
>
> 문제는 winshoes 데모 소스를 보니깐 쓰레드를 이용했더군여
> 한사람한테 하나씩 물론 받는 사람들을 여려명으로 할수 있지만
> 그렇게 한다면.. 받는사람의 모든 주소가 수신측에서 보게 땜에 이를 막고자
> 하는데 문제가 많이 발생합니다.
>
> while not query1.eof do begin
> memoto.lines.add(query1.fieldbyname('email')asstrng);
> query1.next;
> end;
> 이런 씩으로 했을 경우 (xxxx@yahoo.co.kr, xxxx@hanmail.net,...... 이런씩으로
> 받는 사람이 나옴)
> 제가 원하는 것은 (to : xxxx@yahoo.co.kr) 요렇게
>
> 데모 소스는 대충 이렇게 한개의 function과 하나의 procedure 쯤
> 분석해 보면, function 에서는 메일서버와 보내는 사람의 이메일 주소를 ini 파일에서 읽어와서 검색한뒤 조건에 만족하면 procedure에서 msg컴퍼런의 값을 주고 이를 쓰래드에서 보내는 걸루 분석됩니다.
>
> procedure TFormMain.ButtonSendClick(Sender: TObject);
>
> function EmailAndHostAreValid : Boolean;
> begin
> ReadIniFile;
> if (( Length(HostAddress) > 0 ) and
> ( Length(EmailAddress) > 0 ))
> then
> Result := True
> else
> Result := False;
> end;
>
> procedure PopulateSMTPValues;
> begin
> SMTP.Host := HostAddress;
> with Msg do begin
> Attachments.Clear;
> CCList := MemoCC.Lines;
> BCCList := MemoBCC.Lines;
> Too := AMemoTo.Lines;
> From := EmailAddress;
> Subject := EditSubject.Text;
> Text := MemoBody.Lines;
> if FileExists(EditAttachment.Text) then
> Attachments.AddAttachment(EditAttachment.Text);
> end;
> end;
>
> begin
> if EmailAndHostAreValid then begin
> PopulateSMTPValues;
> with TSenderThread.Create(True) do begin
> FreeOnTerminate := True;
> SMTP := Self.SMTP;
> Msg := Self.Msg;
> Resume;
> end;
> end else
> ShowMessage('Use File : Setup to set your server parameters first.');
> end;
>
> // 쓰래드 부분
> procedure TSenderThread.Execute;
> begin
> OldStatusEvent := SMTP.OnStatus; try
> SMTP.OnStatus := StatusEvent;
>
> SMTP.Send(Msg);
> Terminate;
> finally SMTP.OnStatus := OldStatusEvent; end
> end;
> *********************************************************************88
> 전 이 데모소스에서 procedure의 msg 의 값을 주는 부분을 없애고
> while 문으로 돌리기 위해
>
> begin
> if EmailAndHostAreValid then begin
> while not query1.eof do begin
> memoto.lines.text := query1.fieldbyname('email').asstring;
> SMTP.Host := HostAddress;
> with Msg do begin
> Attachments.Clear;
> CCList := MemoCC.Lines;
> BCCList := MemoBCC.Lines;
> Too := MemoTo.Lines;
> From := EmailAddress;
> Subject := EditSubject.Text;
> Text := MemoBody.Lines;
> if FileExists(EditAttachment.Text) then
> Attachments.AddAttachment(EditAttachment.Text);
> end;
> with TSenderThread.Create(True) do begin
> FreeOnTerminate := True;
> SMTP := Self.SMTP;
> Msg := Self.Msg;
> Resume;
> end;
> memoto.lines.text := '';
> query1.next;
> end;
> end else
> ShowMessage('Use File : Setup to set your server parameters first.');
> end;
>
> 이렇게 바꾸었습니다. 위를 실행시키면..
> 당연히 에러 ^^;
> 쓰래드 부분에서 계속 연결 하더군여, 그리고 프로그램 다운
> 에러 분석은 아마 연결된 상태에서 계속 연결하는거 같아여, 후미~
>
> 어떻게 해결해야 할까여, 고수님들의 조언 및 힌트를 부탁 드리겠습니다.
> 저두열심히 공부해보구여, 전 델파이4.0을 쓰고 아쉽게도 fastnet이 없기땜에 쩝,
> nmsmtp도 content-type : html/text; euc-kor가 지원안돼서, -.-; (5.0이상은 모르겠지만 전 설정하는 것이 없음)
> * 암튼 정리가 잘 안된것 같네여..
> 고수님 저 좀 살려주세여..