2017-10-04 20 views
-1

私の目標は、受信者の大きなリストを持っている場合、1つの電子メールアカウントで送信すると長い時間がかかるため、電子メールを送信する処理のスピードアップです。 |複数のメールアカウントを受信者のリストに送信するマルチスレッド?

  • smtp.company.frを:次に

    私は、各行が、これに等しい複数のメールアカウントを持つテキストファイルを持っています[email protected] | emailpass | 「|」すると

私は糸の量を作成したいの間で各情報を渡す(:-)エラーが発生します、それよりも大きい場合は明快で)この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

私は、マシンが一度に扱うことができるスレッドを(システムスレッドプールを使用してこれを助けることができる)多くのスレッドを推奨します。より多くの性能向上をもたらすことはありません。 – Victoria

+2

あなたのメールサーバーをブラックリストに載せる準備をしてください。それはそうする確実な方法です。このような問題を防ぐために、MailChimp/Mandrillなどの電子メールサービスの使用を真剣に考えてください。 –

+1

@Victoria、ご意見ありがとうございますが、私はパフォーマンスを探しています。他の言葉では、良いスピードで可能な電子メールの最大量(例:10電子メール/秒)を送信します。 –

答えて

1

パラメータをスレッドに渡すには、入力パラメータをのコンストラクタに追加するだけです。個々の値として(Host,Port,,Passwordなど)、TStringList、またはrecordのいずれかの値を使用してください。その後、コンストラクタは、クラスのメンバにデータを保存して、Execute()が必要に応じて使用できるようにします。この点で、スレッドは他のどのクラスとも異なる動作をしません。そのExecute()は、コンストラクタとは異なるコンテキストで実行されます。

2つのスレッドセーフリストを持つスレッドプールを使用することをお勧めします。 SMTPプロバイダの1つのリストと受信者の1つのリスト。インストールされているCPUと同じ数のスレッドだけを持つスレッドプールを作成します(受信者の数が送信される以上の場合)。

各スレッドには、次のことが可能です。

  1. は、受信者リストから受信者を抽出します。または、一度に複数の受信者に1つのメールを送信できるので、特に複数の受信者が同じメールドメインにある場合は、少数です。受信者がない場合は、終了してください。

  2. 次に、プロバイダリストからアイドル状態のSMTPプロバイダを抽出します。まだ接続されていない場合は、必要に応じて接続してログインしてください。

  3. 次に、受信者に電子メールを送信します。

  4. 次に、SMTPプロバイダーをプロバイダーリストに戻します(または、リスト全体にそのままにして、アイドルとしてマークするだけです)。接続を開いたままにしておくと、別のスレッド(または同じスレッド)でも次の繰り返しで同じ接続を使用できます。

  5. #1に戻ります。

すべてのスレッドが完了したら、必要に応じてクリーンアップします。他の正当なSMTPプロバイダのような唯一の既知の良好な送信者を、ホワイトリスト

  • :そうは言って

    さて、そのSMTPプロバイダを含む、多くの方法で、スパマーを阻止注意してください。自分のメールプロバイダのSMTPサーバーを使用してメールを送信することはできますが、受信者のSMTPサーバーに直接メールを送信することはできません(別のメールプロバイダを使用している場合)。あなたは、あなたが特定の期間

  • 以内に送信することができますどのように多くのメール制限時間に

  • を送ることができますどのように多くのメール制限彼らに

  • を開くことができますどのように多くの同時TCP接続制限

  • 電子メールを送信できる頻度を制限します。

これらの制限を超えるスレッドはありません。何かがあれば、通常それらを削除するために追加料金を支払わなければなりません。

この種の状況を処理する最善の方法は、Yahooのグループなどのオンラインメーリングリストを設定してから、1つのメールアドレスに1つのメールを送信し、メーリングリストのプロバイダにメールを配信することができますあなたのために。

関連する問題