我正在编写一个使用Indy发送电子邮件的应用程序。
每封邮件都是由一个帖子发送的。
目前我正在连接到线程内的TidSMTP
,所以为了发送10封邮件,我需要10个线程并连接10次。
单个TidSMTP
(线程之外)是否安全(哪些是缺点?),调用Connect
一次,然后在线程内调用TidSMTP.Send
?
TidSMTP
会正确管理事情吗?
注意:我们的想法是避免每次连接(如果可能的话),如果要发送许多电子邮件,这可能是一个优势。 (对此感到担心是有道理的,或者在每个线程中调用Connect
都可以吗?)。
答案 0 :(得分:4)
为什么不仅使用1个存在TIdSMTP的存储器和存储TIdMessage的TList,并在每次发送后从列表中释放TIdMessage,在这种情况下,您可以避免开销并保持简单。 如果您想发送200封电子邮件,如果您启动200个线程,那么您的应用程序将仅使用超过200 Mb的200个线程,更不用说在您的应用程序中启动那么多线程可能会出现问题。 底线添加一个TList,您可以在其中临时存储准备好的TIdMessages并在线程内部进行一个while循环,该循环将检查列表是否有要发送的消息,如果它已经从列表中抓取,发送和删除。
答案 1 :(得分:1)
从技术上讲,您可以在一个线程中调用Connect(),然后在其他线程中调用Send()。但是,您必须序列化对Send()的访问,否则发送线程可能会相互重叠并破坏SMTP通信。 Dorin建议将所有SMTP流量移动到具有队列的单个线程是最佳选择。但是,队列本身需要以线程安全的方式访问,因此使用普通的TList或TQueue本身就不够好。使用TThreadList(或Indy自己的TIdThreadSafeList)代替TList,或者使用单独的TCriticalSection包装TQueue。