代码之家  ›  专栏  ›  技术社区  ›  UnDiUdin

是否可以调用tidmsmtp。连接一次,然后从线程调用tidmtp.send?

  •  0
  • UnDiUdin  · 技术社区  · 14 年前

    我正在编写一个应用程序,它使用Indy发送电子邮件。

    每条消息都是由线程发送的。

    当前我正在连接到 TidSMTP 在线程内部,所以要发送10封邮件,我需要10个线程,并且连接10次。

    它安全吗(缺点是什么?)有一个单身 tidmsmtp (在线程外),调用 Connect 一次又一次打电话 TidSMTP.Send 在线里面?

    威尔 tidmsmtp 正确管理事情?

    注意:这是为了避免每次都连接(如果可能的话),如果要发送很多电子邮件,这可能是一个优势。(担心这个有意义吗,或者打电话来 连接 每一条线都很好吗?).

    2 回复  |  直到 14 年前
        1
  •  4
  •   ComputerSaysNo    14 年前

    为什么你不只用一个有tidmsmtp和t list的目录来存储tidmessage,每次发送后都从列表中释放tidmessage,在这种情况下,你可以避免开销并保持简单。 如果您想发送200封电子邮件,那么如果您启动200个线程,那么您的应用程序将只对那些200个线程使用超过200MB的内存,更不用说启动应用程序中的那么多线程时可能会出现问题。 最后一行添加一个tlist,在其中临时存储准备好的tidmessages,并在线程中添加一个while循环,该循环将检查列表是否有要发送的消息,如果列表中有要从列表中获取、发送和删除的消息。

        2
  •  1
  •   Remy Lebeau    14 年前

    从技术上讲,您可以在一个线程中调用connect(),然后在其他线程中调用send()。但是,您必须序列化send()的访问权限,否则发送线程可能会相互重叠并损坏SMTP通信。Dorin建议将所有的SMTP通信移动到一个带有队列的线程上,这是最好的选择。但是,队列本身需要以线程安全的方式进行访问,因此使用普通的tlist或tqueue本身就不够好。要么使用tthreadlist(或indy自己的tidthreadsafeList)而不是tlist,要么使用单独的tcriticalsection包装tqueue。