我的目标是加快发送电子邮件的过程,因为只有1个电子邮件帐户才会在收到大量收件人时延迟很长时间。
然后我有一个带有多个电子邮件帐户的txt文件,每行等于:
然后我想创建一个等于此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个电子邮件帐户发送电子邮件的过程,欢迎。
答案 0 :(得分:1)
要将参数传递给线程,只需将输入参数添加到TMyThread
的构造函数中。可以是单独的string
值(Host
,Port
,Username
,Password
等),也可以是TStringList
或{{{ 1}},无论你觉得什么都很舒服。然后,构造函数可以将数据保存在类的成员中,以便record
根据需要使用。在这方面,线程与任何其他类没有任何不同。只有Execute()
在与构造函数不同的上下文中运行。
我建议您使用带有几个线程安全列表的线程池。一个SMTP提供程序列表和一个收件人列表。创建一个线程池,其线程数与安装的CPU数相同(如果超过发送的收件人数)。
然后每个线程都可以执行以下操作:
从收件人列表中提取收件人。或者少数,因为一次只能将一封电子邮件发送给多个收件人,特别是如果多个收件人位于同一个电子邮件域中。如果没有可用的收件人,请退出。
然后,从提供者列表中提取空闲SMTP提供程序。如果尚未连接,请根据需要连接并登录。
然后,向收件人发送电子邮件。
然后,将SMTP提供程序放回提供程序列表中(或者将其保留在列表中,并将其标记为空闲)。保持连接打开,这样另一个线程(甚至同一个线程)可以在下一次迭代时使用相同的连接。
回到#1。
完成所有线程后,根据需要进行清理。
现在,请注意,SMTP提供商以多种方式阻止垃圾邮件发送者,包括:
仅将已知的好发件人列入白名单,与其他合法的SMTP提供商一样。您可以使用自己的电子邮件提供商的SMTP服务器发送电子邮件,但不能直接向收件人的SMTP服务器发送电子邮件(如果他们与您的电子邮件提供商不同)。
限制可以打开的连接数量
限制您一次可以发送的电子邮件数
限制您在指定时间段内可以发送的电子邮件数量
限制发送电子邮件的频率。
没有多少线程会让您超越这些限制。如果有的话,你通常需要支付额外费用才能删除它们。
处理此类情况的最佳方法是设置在线邮件列表(例如使用Yahoo Groups),然后您可以向1个地址发送1封电子邮件,并让邮件列表提供商将电子邮件分发给订阅的成员你。