I was having a think of a way around this problem playing with the code last night, firstly the GPF is caused by the clarion runtime not being able to handle too many windows being opened at the same time, like you say a timing issue.
I had been experimenting with the sleep function
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298%28v=vs.85%29.aspx and although it states the thread will be paused, this is putting the entire app to sleep so C6 threads are not acting in a true win32 threaded style although this is possibly caused by the drivers accessing the db concurrently.
The C6 help is a bit contradictory as well, it states towards the top "Instead, use the Windows Sleep API function, which releases the CPU and lets other apps in the system effectively multitask." indicating or suggesting the whole app goes to sleep but further down the page it states " A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run." indicating it should be affecting the thread only, but in my tests it was putting the whole app to sleep which I suspect is down to the drivers because of the way they work with MS SQL server.
So with this in mind and the starting of too many windows too quickly causing the GPF, what I decided I needed to do was to create x threads which cycles through the "outbox" and where an email id ends with 1, that would be processed by the 1st email thread, email ids ending in 2 would be processed by the 2nd email processing thread and so on. This way I can control the starting of each thread and window to avoid the window GPF's. If emails still build up the user can increase the number of threads that should run, lets say 20 threads or 100 threads and process the relevant email based on the emails id's last number or two, ie thread 30 would process every 30th email id and thread 20 would process each 20th email id if there were 30 threads running. The users can change this in their settings but I've limited it to a max of 250 as like you say the ram requirements for each thread could kill the box. There is a setting where they state max amount of ram to use, then when I start a new thread lookup the processes ram usage when the thread sends its first email, if its ok ramwise it then starts the next thread and repeats until the maximum number of threads that are allowed to run have been started.
I've rehashed the process window so it loops through each email id it needs to and just remains open but hidden processing them and rehashed it to make a note of emails which need retrying and then retries them when the time is right from a timer event. The process window also has the sendemail class moved onto it as well for obvious reasons.
This also puts a limit of 10 threads (or whatever the user sets in their email sending settings) in place so I dont end up with hundreds or thousands of threads starting and waiting to do retrys as well which could cause problems if net access suddenly went down and the system wasnt able to send emails.
So thats how I've got around it, regarding spam restrictions affecting the sending, the email servers we are sending to are pretty varied so its rare for the same email server to receive multiple emails except for the usual short burst of communication between people because I do a DNS/MX lookup and use the SMTP servers in the DNS/MX lookup to send direct to the server that is receiving emails for the email address but it depends on the activity and communication going between my customer and who they are communicating with. It might be just one email sent or if there are questions there might be 3 or 4 emails sent to their server with possibly attachments which could be a few MB in size.
For backup the last SMTP server that is used to send through is the ISP's SMTP and any commercial smtp servers also setup in the system.
I've also got the system setup to handle SMTP server restrictions which might be applied by some ISP's/commercial smtp servers like only being able to send x emails every x mins, hours, days, weeks or month &/or x T/G/M/Kb sent per min,hour,day,week or month which seems common in the US but not as much in the UK and parts of Europe, BT for example has no limits on sending emails through their SMTP server but has a 10Mb size limit but you do have to make sure the domain names used as the senders email address is registered with them otherwise they block the email being sent.
So thats how I've handled it, I think all bases are covered so its just a case of letting it go live now.