【问题标题】:Multithread with several email account sending to a list of recipients?具有多个电子邮件帐户的多线程发送到收件人列表?
【发布时间】:2018-03-16 10:04:19
【问题描述】:

我的目标是加快发送电子邮件的过程,因为当收件人列表很大时,仅使用 1 个电子邮件帐户发送会延迟很长时间。

然后我有一个包含多个电子邮件帐户的 txt 文件,每行等于这个:

  • smtp.company.fr|ma​​rketing@company.fr|emailpass|587

然后我想创建一个线程数量等于这个txt文件的行数(如果大于它,会导致错误:-))在“|”之间传递每个信息分隔符作为每个线程的参数。

所有电子邮件收件人都将出现在唯一的Memo(逐行)中,并且我的应用不必在发送后将相同的消息发送给同一收件人。

我有一个关于如何创建多个线程的示例,但我不知道如何将这些参数传递给创建的每个线程:

type 
   TMyThread = class(TThread) 
   private 
   protected 
      procedure Execute; override; 
   public 
      constructor Create; 
   end; 

constructor TMyThread.Create; 
begin 
   inherited True; 
   FreeOnTerminate := True; 
   Priority := tpNormal; 
end; 

//=================================================================

var 
   I: Integer; 
   MyThreadList: array [0..2] of TMyThread; // creates two threads
begin 
   for I := 0 to High(MyThreadList) do 
   begin 
      MyThreadList[I] := TMyThread.Create(True); 
      MyThreadList[I].FreeOnTerminate := True; 
      MyThreadList[I].Priority := tpNormal; 
      MyThreadList[I].Resume; 
   end; 
end; 

如果存在一些更好的想法来加快仅使用 1 个电子邮件帐户发送电子邮件的过程,将受到欢迎。

【问题讨论】:

  • 准备好将您的邮件服务器列入黑名单。这是一个肯定的方法。您应该认真考虑使用 MailChimp / Mandrill 等电子邮件服务来防止此类问题。
  • @Victoria,谢谢你的建议,但我正在搜索性能。换句话说,以良好的速度发送尽可能多的电子邮件(例如:每秒发送 10 封电子邮件)。
  • 线程并不是神奇的性能解决方案。您还有其他瓶颈,例如您的 CPU、网络/互联网速度、磁盘速度(如果您正在将文件加载到电子邮件)等。同时发送 10 封电子邮件无论是在一个线程中还是在 10 个线程中都没有太大区别线程。再一次,发送任何数量的批量电子邮件都在乞求被列入黑名单,尤其是以 10/秒的速度。如果您不想使用其他服务,那么我建议您是否有任何事情让它们更慢,而不是更快
  • 为什么 CPU 的数量是相关的。这不是 CPU 绑定任务。
  • @MarcioGomes: "ex: 10 email sent/second" - 你确实意识到你可以一次向多个收件人发送一封电子邮件,不要你?额外的收件人不会花费更多时间,因为您只向 SMTP 服务器发送电子邮件的 1 份副本,然后它会为您将电子邮件复制给每个收件人。

标签: multithreading delphi mail-sender


【解决方案1】:

要将参数传递给线程,只需将输入参数添加到TMyThread 的构造函数即可。可以作为单独的string 值(HostPortUsernamePassword 等),也可以作为TStringListrecord,无论您是否愿意通过。然后构造函数可以将数据保存在类的成员中,以供Execute() 根据需要使用。在这方面,线程的工作方式与任何其他类没有任何不同。只有 Execute() 在与构造函数不同的上下文中运行。

我建议您使用带有几个线程安全列表的线程池。一份 SMTP 提供商列表和一份收件人列表。创建一个线程池,其线程数与已安装的 CPU 数相同(如果超过发送到的收件人数)。

然后每个线程可以执行以下操作:

  1. 从收件人列表中提取收件人。或者少数,因为可以一次将一封电子邮件发送给多个收件人,特别是如果多个收件人位于同一个电子邮件域中。如果没有可用的收件人,请退出。

  2. 然后,从提供程序列表中提取一个空闲的 SMTP 提供程序。如果尚未连接,请根据需要连接并登录。

  3. 然后,向收件人发送电子邮件。

  4. 然后,将 SMTP 提供程序放回提供程序列表中(或者,将其一直保留在列表中,并将其标记为空闲)。让连接保持打开状态,这样另一个线程(甚至是同一个线程)可以在下一次迭代中使用同一个连接。

  5. 回到#1。

所有线程完成后,根据需要进行清理。

现在,话虽如此,请注意 SMTP 提供商以多种方式阻止垃圾邮件发送者,包括:

  • 仅将已知的良好发件人列入白名单,就像其他合法的 SMTP 提供商一样。您可以使用自己的电子邮件提供商的 SMTP 服务器发送电子邮件,但您不能始终将电子邮件直接发送到收件人的 SMTP 服务器(如果他们与您在不同的电子邮件提供商上)。

  • 限制可以同时打开的 TCP 连接数

  • 限制您一次可以发送多少封电子邮件

  • 限制您在给定时间段内可以发送的电子邮件数量

  • 限制您发送电子邮件的频率。

没有多少线程可以让您超越这些限制。如果有的话,您通常需要支付额外费用才能删除它们。

处理这种情况的最佳方法是设置一个在线邮件列表(例如使用 Yahoo Groups),然后您可以向 1 个地址发送 1 封电子邮件,然后让邮件列表提供商将电子邮件分发给订阅的会员你。

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2017-12-05
    • 2019-06-17
    • 2015-08-29
    相关资源
    最近更新 更多