> while not FlagDone do begin
>   //Application.ProcessMessages;  // Don't know whether or not to use
> the message pump here   Sleep(50);
> end;

This is bad design. Do not wait in a loop. While sleeping the calling
thread is blocked. Instead let your derived component do the work in 
the background. In order to get notified when the job has finished add
a custom event that fires when the work is done, or may be add another
custom event that notifies the application when a single message has
been sent/failed. In other words, control the application completely
thru events while executing the mailing. So in the ButtonClick handler
there the call to start the mailing should be the very last line. 

---
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html


Kochendoerfer, Michael wrote:
> You all are giving excellent information in this mailing list, thanks
> a lot! 
> 
> I guess my problem is - as you describe - that the component is still
> active, even if smtpQuit has been reached within OnRequestDone. I
> don't currently check if it's still connected, but I will change it.
> Errors will be checked and force to abort the entire mail and write
> some log entries.    
> 
> As Arno said earlier, I'd like to have async components because of
> their benefits. But in fact, for me it is a sync call, at least for
> each single mail. IOW, I've to wait until each particular mail has
> been finished before I'm advancing to the next one. So I'm starting
> with Connect(), let the OnRequestDone do the background stuff and set
> a flag if either aborted or quit. Now I know I've to wait also for
> not Connected. But what's the correct method to wait for completion?
> Currently, I have a loop after calling Connect() looking like this:  
> 
> while not FlagDone do begin
>   //Application.ProcessMessages;  // Don't know whether or not to use
> the message pump here   Sleep(50);
> end;
> 
> Any thoughts?
> 
> TIA,
> Michael
> 
> 
>> -----Original Message-----
>> From: [EMAIL PROTECTED]
>> [mailto:[EMAIL PROTECTED]
>> Behalf Of DZ-Jay
>> Sent: Tuesday, January 16, 2007 10:57 AM
>> To: ICS support mailing
>> Subject: Re: [twsocket] Still problems while sending SMTP
>> 
>> 
>> 
>> On Jan 16, 2007, at 02:49, Arno Garrels wrote:
>> 
>>> When the response to the Quit command is received the connection
>>> (may) still be alive. So watch both, whether Quit response has been
>>> received as well as the SessionClose event. Call connect only
>>> after the session has been closed.
>>> Don't start a loop directly from an event handler but post a custom
>>> message to some Window, in it's message handler start the next loop.
>> 
>> You could, in fact, re-use the connection if the next message
>> is to be
>> sent through the same server.  All you have to do is, after the DATA
>> command is completed and the server acknowledges receipt, check
>> SmtpCli.Connected, if you are still connected then reset your
>> state-machine to start the cycle fromthe MAIL FROM command.  Some
>> servers required a "reset" (RSET) command be sent to reset state, and
>> it doesn't hurt to send it anyway.  The important thing is to
>> check the
>> connection, because something may have happened -- and indeed, some
>> servers have anti-spamming filters that will kick you out after
>> receiving DATA that they determine is spam, and some won't
>> allow you to
>> re-send after one message.  So the algorithm would be something like:
>> 
>> 1. Connect
>> 2. HELO
>> 3. MAIL FROM
>> 4. RCPT TO
>> 5. DATA
>> 6. If connected:
>> 6.a (yes) RSET then back to 3
>> 7. QUIT
>> 8. back to 1
>> 
>> Of course, you should check for errors after each step (in
>> OnRequestDone, before changing states).  Keep in mind that
>> some errors
>> are recoverable (transient: 400+), some errors are not
>> (non-transient:
>> 500+), and some are somewhere in between (like RCPT warnings, etc).
>> Recoverable errors allow you to try again, or require a RSET
>> and start
>> from step 3, while non-transient errors require closing the
>> connection
>> and starting from scratch.  If you are sending general messages to
>> strange servers "in the wild" it gets pretty complicated, specially
>> when you factor in all the non-RFC-compliant servers; but if your
>> application is of limited purpose, sending using the same server all
>> the time, the errors and issues that may occur are predictable and
>> substantially less.
>> 
>> Building this logic in a simple state-machine using
>> OnRequestDone makes
>> it fairly easy to make your application powerful and efficient -- the
>> reason we always push for the use of async methods.
>> 
>> dZ.
>> 
>> --
>> DZ-Jay [TeamICS]
>> http://www.overbyte.be/eng/overbyte/teamics.html
>> 
>> --
>> To unsubscribe or change your settings for TWSocket mailing list
>> please goto http://www.elists.org/mailman/listinfo/twsocket
>> Visit our website at http://www.overbyte.be
-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to