Results 1 to 8 of 8

Thread: Email in Thread

  1. #1
    Senior Member ErikB's Avatar
    Join Date
    Aug 2010
    Location
    Biddinghuizen
    Posts
    477

    Email in Thread

    Hallo,

    ik vond een voorbeeld van email in een thread ( Remy Lebeau, https://stackoverflow.com/questions/...eparate-thread) op internet.
    Daarin heeft hij de volgende code :

    Code:
    procedure TEmailThread.Execute;
    var
      smtp: TIdSMTP;
      ssl: TIdSSLIOHandlerSocketOpenSSL;
      email: TIdMessage;
    begin
      email := TIdMessage.Create(nil);
      try
        email.LoadFromFile(FFileName);
        email.OnInitializeISO := DoInitializeISO;
    
        DeleteFile (FFileName); 
    
        smtp := TIdSMTP.Create(nil);
        try
          ssl := TIdSSLIOHandlerSocketOpenSSL.Create(smtp);
          ssl.SSLOptions.SSLVersions := [sslvTLSv1];
    
          smtp.OnStatus := DoStatus;
          smtp.IOHandler := ssl;
          smtp.Host := FHost;
          smtp.Password := FPassword;
          smtp.Username := FUsername;
          smtp.UseTLS := utUseExplicitTLS;
          smtp.Port := 587;
    
          smtp.Connect;
          try
            smtp.Send(email);
          finally
            smtp.Disconnect;
          end;
        finally
          smtp.Free;
        end;
      finally
        email.Free;
      end;
    end;

    maar hier wordt niet gecontroleerd of de connect wel OK is. Als bijvoorbeeld een verkeerd Host of Port of password wordt gebruikt, zal er geen verbinding komen en er dus geen mail worden verzonden. Als ik een try.. except er omheen zet werkt dat niet.
    Hoe kan ik de gebruiker laten zien dat er iets mis is gegaan ?
    Erik

  2. #2
    try..except om connect en niet doorgaan als de except plaats vindt. Afvangen van de e.message in de except geeft de mogelijkheid om te zien waarom de connect niet lukt

  3. #3
    Connect zal dan een exception gooien. Die wordt in deze procedure niet afgevangen, maar dat kan je in de aanroepende procedure alsnog doen. Of helemaal niet; in dat geval neemt de standaard exception handler het over, en zal de gebruiker met de (technische) foutmelding geconfronteerd worden.

    De exception handling klopt wel degelijk. Als Connect een exception geeft dan:
    - wordt Send niet aangeroepen
    - wordt Disconnect niet aangeroepen
    - worden Smtp en Email alsnog vrijgegeven.

    Als Send een exception geeft, dan is Connect wel succesvol geweest, en wordt alsnog Disconnect aangeroepen. De exception wordt dus zelf niet afgevangen, maar de code is wel netjes gestructureerd rond het eventueel ontstaan van een exception. Het afvangen ervan is aan de gebruiker van deze procedure.
    1+1=b

  4. #4
    Senior Member ErikB's Avatar
    Join Date
    Aug 2010
    Location
    Biddinghuizen
    Posts
    477
    Die exception zie ik alleen in debugmode, niet in releasemode.

    Als ik via een variabele de foutmelding zou willen doorgeven aan het aanroepende programma, hoe gaat dat dan in zijn werk?
    Code:
      OK := false;
      try
        smtp.Connect;
        OK := true;
      except
        on E:Exception do
        begin
           FResultaatBoodschap := E.Message;
        end;
      end;
    (ik heb in de TEmailthread.Create FreeOnTerminate := True; )
    Erik

  5. #5
    Je krijgt exceptions in threads ook niet te zien.
    Ik meende dat de uitvoerende procedure (die execute aanroept) de thread ontvangt en die zet een FatalException property. Verder wordt er niets gedaan met de exception.

    https://docwiki.embarcadero.com/Libr...FatalException

    Je kunt dus zelf die property bekijken maar waarschijnlijk is het handiger de exception zelf al af te handelen in de execute (zoals je laat zien met die code).

    Ps. Je moet wel op tijd iets met de FResultaatBoodschap doen want met FreeOnTerminate ben je die vrij snel kwijt na beŽindiging van de thread (bv in onterminate).

  6. #6
    Senior Member ErikB's Avatar
    Join Date
    Aug 2010
    Location
    Biddinghuizen
    Posts
    477
    dank je Rik, dat was de juiste hint

    ik heb een OnTerminate in de thread gemaakt:

    Code:
    procedure TEmailThread.DoTerminate(ASender: TObject);
    var
      ex: TObject;
    begin
      Assert(ASender is TThread);
      ex := TThread(ASender).FatalException;
      if Assigned(ex) then begin
        // Thread terminated due to an exception
        if ex is Exception then
          Application.ShowException(Exception(ex))
        else
          ShowMessage(ex.ClassName);
      end
      else
      begin
        // Thread terminated cleanly
      end;
    end;
    en die doet hetgeen ik graag wil zien.
    Erik

  7. #7
    Quote Originally Posted by rvk View Post
    Je krijgt exceptions in threads ook niet te zien.
    Doh! Inderdaad. Sorry voor de misinformatie.
    1+1=b

  8. #8
    Senior Member ErikB's Avatar
    Join Date
    Aug 2010
    Location
    Biddinghuizen
    Posts
    477
    geeft niet hoor ! niemand is perfect
    Erik

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •