Q&A

  • Delphi에서 메일 날리기
데이터 베이스에서 쿼리 해서 쿼리 문에 해당하는 결과 값을 가지고 메일을 발송하려고 합니다.

만약에 메일을 발송하려고 하는 사람이 한 100명정도이고 이사람들에게 날리는 메일의 내용이(제목은 같고) 모두 틀린다고 가정할 때, 1사람당 하나의 Thread를 생성해서 발송해야 합니까?

그럴경우 다중쓰레드가 되는데 어떻게 구현해야 하는지 난감합니다.

(*제목과 내용이 모두 같을 경우 제작가능한 컴포넌트는 나와 있던데....상기경우일 때는 어떻게 구현을 해야 하나요....)
7  COMMENTS
  • Profile
    델파이탐크루즈 2002.12.07 03:18
    메일을 날릴때는 Thread는 상관없이 생각해보세요..

    예를 들어 하나의 메일을 날린다면 그냥 보내시면 되구

    여러개 날린다면 For 문이나 Do While문이나 엮으면서 보내면 않될까 싶군요

    ....그럼..

    더 좋은 방법이 있으면 저도 알려주세요...

    즐프...


  • Profile
    이승필 2002.12.07 03:52
    일반적으로 smtp는 smtp서버가 있어야만 이용이 가능하지 않습니까?

    제가 구현하려고 하는 것은 smtp서버가 없어도 메일을 발송할수 있는 컴포넌트를 사용해서 메일이 어떤 이유로 도착을 하지 않았는지 까지 알고 그에 해당하는 error가 발생했을 시에 얼마간의 시간이 지난후에 메일을 발송하는 거지요......그거야 smtp에서도 에러체크가 되겠지요????

    물론 smtp를 사용해서 메일을 날린다고 생각해도 메일 내용이 그러니깐 제목하고 내용이 모두 같으면 말씀하신 for나 while문을 사용해서 하면되지만(smtp가 없을 경우도 마찬가지 제가 사용하는 컴포넌트는 메일을 여러개를 한꺼번에 날릴수 있도록 만들어진 컴포넌트고 이것은 주로 메일발송기에 탑재하는 엔진 입니다. 그러나 이또한 메일 제목과 메일 내용이 모두 동일한 경우에나 사용가능합니다.), 제목과 내용이 각각의 메일 수신자 마다 다를경우 어쨋든 제목과 내용을 다르게 표시하게 할 수 밖에 없는 상황입니다.

    따라서 DB에서 제목과 내용을 읽어 들이고 나서는 각각의 상이한 수신자들한테 그 수신자가 설정해 놓은 제목과 내용을 보내려면 DB에서 읽어 들인 제목과 내용을 설정해 넣고 이를 날려야 되는데.......

    그렇다면 thread방식 밖에는 생각할 수 가 없더라구요.....

    그렇다면 thread방식에도 문제가 없느냐....

    그것도 생각해 보니 예를 들어서 DB 데이타가 만약 10,000건이 넘어간다 싶으면 thread가 10,000개가 생성이 되어야 하는데 그렇게 되면 리소스 문제가 발생한다든가 잘못하면 PC 자체가 다운이 될지 모르는 위험이 다분한것 아닙니까?

    참고로 지금 제가 공부하는게 서비스 애플리케이션 프로그램인데요....그거이 뭐하는 거냐면 서버에 서비스 프로그램 있잖아요.....그건데요....

    이렇게 되면 서버가 다운되어 버리는거 아닙니까?

    제가 방향을 잘못 잡을 건가요......아니면 더 좋은 방법이 있는데 생각을 못하는 걸까요....나이가 들어서리......



  • Profile
    심재용 2002.12.09 06:59
    스팸메일 발송할 때 발생하는 문제점들과 비슷한 경우인 듯 합니다.
    드레드 생성 방법을 추천하고 싶습니다.

    1.드레드 생성하여 메일 전송의 필요성:
    각각수신서버가 다르거나 통신상태,전송파일의 크기 등등의 이유로 메일하나 보낼때 마다 걸리는 시간이 다릅니다. 예를 들어 1,2,번째 메일은 보내는데 3초걸렸어도 3,4,5번매일은 20초씩 걸리는 경우등등이 있습니다. 이럴때 단순 루프를 사용하면 총 66초가 걸립니다. 그러나 드레드로 생성하여 전송을 하면 보통 1/3 의 시간으로 전송이 완료됩니다. 또한 매일의 갯수가 많을 수록 시간이 기하급수적으로 줄어듭니다.

    2.드레드 생성 갯수를 제한해야 합니다 :
    동시에 생성되는 드레드 갯수를 통제할 수 있도록 변수를 만드셔서 생성할때 증가하고 종료할때 감소 하여 드레드의 생성갯수를 항상 10개 또는 n개 이하로 조절해야 합니다. 그래야 무한개의 드레드가 생성되지 않으며 서버가 다운되는 현상을 막을 수 있습니다. 즉, 메일을 전송하는 루프안에서 항성 전송전에 드레드의 갯수를 체크하여 드레드를 생성/메일전송하는 것입니다.

    3.드레드 실행시간을 제한해야 합니다 :
    예를 들어 5번째 메일을 보내는데 수신서버에서 기계상황 혹은 통신상태 혹은 서버 주소 오류 등으로 수신을 못하고 오류를 발생하는 경우 응답시간이 매우 지연됩니다. 어떤경우 2분이상 지연되는 경우도 있는데 이럴때 드레드 1개는 결국 2분동안 놀고 있어야 하는 불합리한 상황이 발생합니다. 따라서 드레드 실행도중 응답대기시간을 제한하여 필요이상으로 시간을 지연하는 것을 방지합니다. 즉, 응답대기시간이 n초이상 걸리면 드레드를 제거하고 오류정보를 저장하며 다음 메일 발송하기 위하여 루프를 계속 돌립니다.

    이상입니다.
    드레드 사용하는데 익숙하시다면 어렵지 않게 구현하실 수 있을 듯 합니다.




  • Profile
    이승필 2002.12.10 04:23
    답변 감사드립니다.

    2, 3번 문제를 해결하기 위해서 쓰레드 갯수 제한과 쓰레드 실행시간을 제한 하려면 우선 한번에 날릴 쓰레드 갯수를 지정할수 있도록 하고 또한 실행시간을 초단위로 설정가능하게 한뒤에 일정 시간이 지나면 다음 쓰레드 갯수 만큼 실행하도록 하는 방법이 낳을 것 같습니다.

    여기에 각각 DB에서 가져온 제목과 내용을 넣는 다면 제목과 내용이 같은 스펨메일 성격의 한계를 극복할 수 있을 것 같은데....(어차피 발신자가 같으면 스팸으로 간주되지만........)

    그러면 설정된 쓰레드 갯수만큼 쓰레드를 만들고 일정한 시간이 지나면 다른 쓰레드를 실행 시키려면 쓰레드 리스트를 만들고 실행시간 완료시 다음 쓰레드로 넘어가는 방식으로 구현하는것이 말씀하신 답변의 요지 인것 같은데요...

    사실 제가 Delphi시작한지 3개월 남짓 밖에는 되질안는데....그런 쓰레드는 어떻게 생성하고 실행 시켜야 하는지 남감합니다.

    혹시 간단한 sample정도 구현이 가능하시면 좀 넓은 아량으로 가르쳐 주시면 감사하겠습니다.



  • Profile
    심재용 2002.12.24 04:59
    메일로 파일을 보내드렸는데 혹시 못 받으셨을 까봐 노파심에 이곳에 올립니다.

    하나하나 코딩해서 알려드리기에는 제가 먹고살기 바빠서리...

    대신 예전에 인디를 이용해서 만든 메일 쓰레드 전송예제를 올립니다...


  • Profile
    김수경 2002.12.08 21:30
    다른 님들의 글처럼 걍 Loop돌면서 처리하면 될 것 같은데...
    왜 굳이 Thread를 사용하시려는지.....(& 서비스 App도...)
    매 건(고객)마다
      자료읽기(또는 전체 Select)
      문장 조합
      전송
      전정송상태확인
    등의 순서를 반복하면 별다른 문제가 없어 보이는데
    (전송상태확인시 시간이 조금 더 걸리겠군요 ^^)...

    오히려 Thread는 일정 갯수이상이면 Thread간 Task 전환으로
    CPU에 더 많은 부하를 줄 뿐아니라 Thread간 충돌이 발생할 경우
    System이 Down 될 수도 있습니다(믈론 알고 계시겠지만... ^^;).

    제 생각에는 10,000여건을 1건씩 Loop 돌면서 프로그램밍하는 방법이
    좋을 듯 합니다(전송시간을 조금더 많이 걸리더라도요 ^^);.


  • Profile
    이추형 2002.12.06 22:55
    DB의 데이타를 토대로 메일메세지를 작성하셔서
    (여기서 작성은 DB의 내용을 SQL문으로 긁어오는 단순작업)
    SMTP 메일로 발송하면 되는데 뭔 쓰레드까지 얘기하십니까?
    (아님 특정디렉토리 검사하여 메일발송하는 프로그램 맹글고
    파일로 ftp전송하는식두 좋음)

    메일발송 sample을 참조하시면 막바로 답이나오리라 생각합니다.

    이렇게 얘기해도 막상 걸리는 문제들이 있으니(firewall, 등등)
    그런건 차차 풀어가는 묘미로 임하는건 어떨까요?
    • 김민수
    • 2002.12.07 03:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 바다를향해
      2002.12.07 20:55
      ActiveForm으로 구현을 해보심이...... ActiveForm이 ActiveX(OCX) 거든여....
    • 이승필
    • 2002.12.07 02:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 바다를향해
      2002.12.07 20:51
      스레드를 생성하는것은 어케하든지 상관 없구여.... 크리티컬섹션은 스레드가 메모리를 사용할때 현재 사...
    • 바다를향해
      2002.12.07 20:45
      1. 단순무식한 방법 -> Replace기능을 수행하는 프로그램을 맹글어서 소스내에 특정문자열을  &n...
    • 유해현
    • 2002.12.07 01:59
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 심재용
      2002.12.09 20:57
      저는 고수는 아닙니다만, 님의 질문에 대해서 제가 예전에 알게된 방법이 좀 도움이 될까해서 답변드립니다...
    • 김성민
      2006.03.09 01:58
      복받으실 꺼예용
    • 뿡뿡이
    • 2002.12.07 01:50
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2002.12.07 01:53
      c 언어의 strcat하고 같은 뜻입니다...
    • 최임정
    • 2002.12.07 01:40
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이달원
      2002.12.07 23:32
      우선 가능합니다 방법은 ActiveForm에서 TBL화일을 여십시요 그다음 자신의 ActiveForm 이름의 interface...
    • 임청택
      2002.12.09 08:59
    • ^^*
    • 2002.12.07 00:40
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 주관석
    • 2002.12.06 23:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최은석
      2002.12.06 23:43
      KeyUp 에서 잡아주세여...
    • 이승필
    • 2002.12.06 20:48
    • 7 COMMENTS
    • /
    • 1 LIKES
    • 델파이탐크루즈
      2002.12.07 03:18
      메일을 날릴때는 Thread는 상관없이 생각해보세요.. 예를 들어 하나의 메일을 날린다면 그냥 보내시면 ...
    • 이승필
      2002.12.07 03:52
      일반적으로 smtp는 smtp서버가 있어야만 이용이 가능하지 않습니까? 제가 구현하려고 하는 것은 smtp서...
    • 심재용
      2002.12.09 06:59
      스팸메일 발송할 때 발생하는 문제점들과 비슷한 경우인 듯 합니다. 드레드 생성 방법을 추천하고 싶습니...
    • 이승필
      2002.12.10 04:23
      답변 감사드립니다. 2, 3번 문제를 해결하기 위해서 쓰레드 갯수 제한과 쓰레드 실행시간을 제한 하려면...
    • 심재용
      2002.12.24 04:59
      메일로 파일을 보내드렸는데 혹시 못 받으셨을 까봐 노파심에 이곳에 올립니다. 하나하나 코딩해서 알...
    • 김수경
      2002.12.08 21:30
      다른 님들의 글처럼 걍 Loop돌면서 처리하면 될 것 같은데... 왜 굳이 Thread를 사용하시려는지.....(& 서...
    • 이추형
      2002.12.06 22:55
      DB의 데이타를 토대로 메일메세지를 작성하셔서 (여기서 작성은 DB의 내용을 SQL문으로 긁어오는 단순작업...
    • 델파이탐크루즈
      2002.12.06 21:34
      (초기화) 배열로 잡으신 걸 For문으로 그냥 돌려서 초기화시키세요.. (해제) 배열명 := nil; 이상....
    • 김기성
    • 2002.12.06 20:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김수경
      2002.12.06 21:14
      TEdit에서 처리하려기엔 무리라고 생각되네요(처리해야 할 것이 너무 많을 것 같군요). TMaskEdit를 활...
    • 이철민
      2003.01.20 10:08
      글을 올리신지 오래되서 다시 들여다 보실지 모르겠지만.. 저도 애를 먹은 경험이 있어서.. 델파이 5...
    • 한만교
      2002.12.07 11:33
      ㅎㅎ 저두 한참 이문제땜시롱 고민의 밤을 보낸적이 있지여..그래서 xp를 직접깔아서 해 보니 setup파일은 ...
    • 신동묵
      2002.12.06 19:34
      델파이 버전 때문은 아닌것 같네요... 아마 OS의 차이 때문인것 같습니다. 아직은 XP가 불안(?)해서 그런...
    • 도니
      2002.12.06 19:32
      그 문제는...델파이 버전 문제가 아닌거 같은데요..^^ 저는 지금 xp를 사용하고 있지만.. 델파이 5,6 상...
    • NiceSky
    • 2002.12.06 19:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이달원
      2002.12.06 19:28
      제가 실제 업무에서 4.0에서 5.0으로 업그레이드 한 경험이 있어서 참고삼아 답변드립니다. 우선 결론은 ...
    • 전원이
    • 2002.12.06 18:06
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 델초보
    • 2002.12.06 12:19
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 한기돈
    • 2002.12.06 11:05
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 신동묵
      2002.12.06 19:30
      델파이에서두 c처럼 쓸수 있습니다. 제가 c문법을 자세히 몰라서 말씀드리기 어렵지만 델파이가 쓰시기는 ...
    • 이달원
      2002.12.06 19:35
      if a=10 then begin    ShowMessage("a의 값은 10 입니다."); end else begin  &nbs...
    • 신동묵
      2002.12.06 20:40
    • FREEFLY
    • 2002.12.06 07:14
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 도니
      2002.12.06 19:33
      델파이5버전의 인스톨쉴드를 깔아서 쓰세요.. 아직 한글 깨지는 문제 해결안된걸로 알고 있습니다.. 그래...
    • FREEFLY
      2002.12.07 07:37
      답변 감사드립니다. 델파이6 인스톨쉴드는 ODBC 설정을 포함 할 수가 있어서요. 혹시 델파이5 에서도 되...