2010-11-17 27 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

相關問題