5

このメールシステムにswiftmailerを実装しようとしています。私のクライアントには、半定期的に送信する必要があるアクティブなメールが約 30 万あります。システムは、もともと sendmail と php の mail() 関数用に構成されていました。それ以来、最新バージョンのpostfixをインストールしました。

私の期待が高すぎたのかもしれませんが、これは大量のメールをすばやくキューに入れることができるという印象を受けました。これはまさに私が必要としているものです. すべてのレート処理とスロットリングは postfix 側で行われるため、postfix 設定が処理できる速度でそれらをキューに入れることができれば素晴らしいことです。

連絡先をキューに直接挿入するメソッドを実装することもできますが、smtp サーバーのグローバル送信レートなどのさまざまなオプションに基づいて、キューに入る電子メールの入力を制限したいと思います。

以下のコードは、テストするための基本的なものです。それぞれ独自のレート プロパティを持つ 30 の個別のメール SMTP アカウントをループします。cronごとにデータベースから最大量の電子メールを引き出してから、すべてを使用して送信batchsend()し、次のsmtpアカウントにループし、最大値を送信するなど..

技術的には動作しますが、非常に遅いです。SMTPアカウントごとに60/分の速度で、それぞれ約15〜20秒かかりますが、これは明らかに機能せず、私が期待していたものとはまったく異なります.

なぜこれがとても遅く送信されるのかについて本当に明白なことはありますか? SMTPサーバーは問題ないようで、過負荷などはありません。後置エラーはなく、明らかなことは何もありません。

メールがキューに入ったら、魔法のように postfix を機能させます。合理的な速度でキューに入れるのが難しくなっています。私はswiftmailerがすべての問題に対する魔法の解決策であることを知っていますが、実際よりも速く送信する必要があると確信しています. アイデアや提案はありますか?

$query = "SELECT * FROM `smtp`";
    $result = mysql_query($query) or die(mysql_error());
    $num_rows1 = mysql_num_rows($result);
    while($row = mysql_fetch_array($result)){
        $smtp = $row['ip'];
        $login = $row['user'];
        $pass = $row['pass'];
        $smtp_domain = $row['domain'];   

    $querya = "SELECT * FROM `mailer_lists` ml JOIN `mailer_controller` mc ON ml.project_name = mc.project_name LIMIT ".$global_limit."";
    $resulta = mysql_query($querya) or die(mysql_error());
    $num_rows2 = mysql_num_rows($resulta);

    // quickly check if any mail returned query
    if ($num_rows2 < 1){
        mysql_close($connection);
        echo "Nothing to mail... \n";
        die();
        }

    while($rowa = mysql_fetch_array($resulta)){
        $email[] = $rowa['email'];
        $project_name = $rowa['project_name'];
        $from_name = $rowa['from_name'];
        $subject = $rowa['subject'];
        $body = $rowa['body'];
        $from = array($spun_from_email => $spun_from_name);
    }    

    require_once 'swift/swift_required.php';
        $transport = Swift_SmtpTransport::newInstance(''.$smtp.'', 25)
          ->setUsername($login)
          ->setPassword($pass)
          ;
        $mailer = Swift_Mailer::newInstance($transport);
        $message = Swift_Message::newInstance()
          ->setSubject($subject)
          ->setFrom($from)
         // ->addPart('add part message', 'text/html')
         // ->attach(Swift_Attachment::fromPath(''))
          ->setTo($email)
          ->setBody($body)
        ;
        $mailout = $mailer->batchSend($message);
         // ->addPart('add part message', 'text/html')
         // ->attach(Swift_Attachment::fromPath(''))
          ;  


            $queryb = "DELETE FROM `mailer_lists` WHERE `project_name` = '".$project_name."' AND `email` = '".implode('\' OR `email` = \'',$email)."'";  
            $resultb = mysql_query($queryb) or die(mysql_error());
            $c++;
            echo "sent $num_rows1 emails to smtp $c \n";
        }
4

1 に答える 1

4

あなたの問題は、使用しているライブラリではありません。メールサーバーに大量のデータを送信しているため、これは遅くなっています...そのため、postfixは返信する前にすべてを処理しようとしています. 接続を閉じずに、一度に 1 つの電子メールを送信してみてください。これにより、電子メール サーバーは、送信した各電子メールをより速く処理し、応答もより速く返すことができます。

  • 次の行をスクリプトの先頭に移動します

require_once 'swift/swift_required.php';

  • smtp サーバーへの接続を遅延させます。メールを送信するたびに接続する必要はありません。上部で一度接続し、接続が有効かどうかを確認し (そうでない場合は再度接続します)、電子メールを送信し、フィールドtofromなどをクリアします...

  • 上部のデータベースからsmtp設定を取得してから、giant を削除しwhileます。それはコードをまったく読みやすくしません

于 2011-05-26T19:37:12.550 に答える