0

メール システムのキューに連絡先をプッシュする SQL クエリがあります。私たちが気づいたことの 1 つは、それぞれのメーリング IP に独自の制限があることです。つまり、IP ごとに 1 分間に 2 通または 3 通の電子メールをすべての宛先ドメインに送信する代わりに、ドメインごとに IP ごとに 2 通または 3 通のメールを送信できます。ブラックリストと追跡システムをクロスチェックする有効なクエリがあるため、アクションを実行したユーザーに再メールを送信することはありません。

$query = "SELECT `email`,`template`,`id` FROM `q_main` WHERE 
            `email` NOT IN (SELECT `email` FROM `c_blacklist` WHERE `email` = `q_main`.`email`) AND 
            `email` NOT IN (SELECT `s_log`.`email` FROM `s_log`,`t_analytics` WHERE `t_analytics`.`key` = `s_log`.`key` AND `q_main`.`template` = `t_analytics`.`campaign_id`) LIMIT ".$num_nodes."";

上記のクエリは完璧に機能します。宛先ドメインに関係なく、クエリ結果に一致する次の電子メール セットを取得するだけです。制限は、IP アドレスの量に各 IP の 1 分あたりの最大値 (通常は 1 分あたり 2 または 3) を掛けることによって設定されます。

キュー内の使用可能な宛先ドメインをすべて収集するには、以下のクエリを実行します。これにより、キューにあるすべての宛先ドメインとカウントが取得されます。

$query = "SELECT SUBSTRING_INDEX( email, '@', -1 ) AS dd, COUNT( * ) AS cc FROM q_main GROUP BY SUBSTRING_INDEX( email, '@', -1 ) ORDER BY cc DESC";
$result = mysql_query($query) or die(mysql_error());
    while($row = mysql_fetch_array($result)){
        $send_domains[] = $row['dd'];
    }

以下は、基本的に何もしないテスト クエリです。最初のクエリと同じことをクエリしますが、宛先ドメインの配列を内破するだけです。それがしていないことは、私たちが達成しようとしている各宛先ドメインの結果を制限することではありません.

$query = "SELECT `email`,`template`,`id` FROM `q_main` WHERE 
            `email` NOT IN (SELECT `email` FROM `c_blacklist` WHERE `email` = `q_main`.`email`) AND 
            `email` NOT IN (SELECT `s_log`.`email` FROM `s_log`,`t_analytics` WHERE `t_analytics`.`key` = `s_log`.`key` AND `q_main`.`template` = `t_analytics`.`campaign_id`) AND 
            `email` LIKE '%".implode("' OR `email` LIKE '%",$send_domains)."' ";

要約すると、私たちがしようとしているのは、各宛先ドメインに基づいてレコードを選択および制限することです。最初の例で行ったように、クエリ全体を制限することなく、宛先ドメインごとに制限を設定するにはどうすればよいでしょうか? 各宛先ドメインを介してクエリをループしようとしましたが、まったくうまく機能しませんでした.

また、興味のある方のために、メーリング IP のスコアリング システムを実装するためにこれを実行しようとしています。これにより、特定の IP でソフトバウンスまたは否定的なフィードバックが発生したときに、宛先ドメインを制限またはスキップできます。

4

1 に答える 1

1

各ドメインの制限を個別のテーブルに保持し、そのテーブルをクエリに結合して、各ドメインで制限を利用できるようにします。次に、各ドメインの行に番号を付けます。where 条件で、rownumber > domain limit の行を除外します。

そうは言っても、mysqlには行番号機能がありません。これは、行変数を使用して行われ ます。サンプルは次のとおりです。

于 2012-07-03T19:07:28.670 に答える