2010-11-17 50 views
0

我在写一个使用Indy发送电子邮件的应用程序。是否可以调用TidSMTP.Connect一次,然后从线程调用TidSMTP.Send?

每条消息都由一个线程发送。

目前我在TidSMTP里面连接线程,所以为了发送10封邮件,我需要10个线程,我连接了10次。

单线程TidSMTP(线程外)是否安全(哪些是缺点?),请调用Connect一次,然后在线程内调用TidSMTP.Send

请问TidSMTP正确处理事情?

注意:这个想法是为了避免每次都连接(如果可能的话),万一有很多电子邮件被发送,这可能是一个优势。 (是否有必要为此担心,或者在每个线程中调用Connect确实没问题?)。

回答

4

为什么不仅仅使用1个你有TIdSMTP和你存储TIdMessage的TList,并且在每次发送你从列表中释放TIdMessage之后,在这种情况下你可以避免开销并保持简单。 如果您想发送200封电子邮件,那么如果您启动200个线程,那么您的应用程序将仅为200个线程使用超过200 Mb的内容,更不要说在应用程序中启动多个线程时会出现问题。 底线添加一个TList,在该TList中临时存储准备好的TIdMessages,并在线程内部添加一个while循环,该循环将检查列表是否有任何要发送的消息,如果该列表已经抓取,发送并从列表中删除。

+0

是的,这是一个很好的建议。我的想法是从简单的开始,一次只有一个线程,在这种情况下,您的suggestino是100%的逻辑。但是接下来我想要有3条并行线程(一条不发送邮件,没有附件,另一条发送小附件,另一条发送更大的附件)。无论如何,你的建议,我可以简单地创建1每个线程smtp。谢谢。 – LaBracca 2010-11-17 13:20:17

+0

欢迎你,如果你愿意,你可以有3个线程,甚至20个,如果你想发送电子邮件给X nr,每个线程有不同的范围,但不是50,100,200等线程。的人然后看看密件抄送(密件抄送),以便他们不会看到收到电子邮件的其他电子邮件地址。 – ComputerSaysNo 2010-11-17 14:07:55

+1

@ user193655:为什么不使用TQueue,我认为它更准确。您可能每个线程都有一个SMTP组件和一个Queue组件......建议TList而不是TQueue是我不赞成@Dorin回答的唯一原因。 – jachguate 2010-11-17 22:48:31

1

从技术上讲,您可以在一个线程中调用Connect(),然后在其他线程中调用Send()。但是,您必须序列化对Send()的访问,否则发送线程可能会相互重叠并破坏SMTP通信。 Dorin建议将所有SMTP流量转移到带有队列的单个线程是最佳选择。然而,队列本身需要以线程安全的方式访问,所以使用纯粹的TList或TQueue本身就不够好。使用TThreadList(或Indy自己的TIdThreadSafeList)而不是TList,或者用单独的TCriticalSection包装TQueue。

+0

感谢您提及那些我不知道的组件,无论如何,我找到了适合我的可行方案。 – LaBracca 2010-11-19 09:41:58