我们有一个 sql 查询将联系人推送到我们的邮件系统的队列中。我们意识到的一件事是我们的每个邮件 IP 都有自己的限制。这意味着我们可以为每个 ip每个域发送 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 地址数量乘以每分钟的最大值来设置的(通常是每分钟 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 上时,我们将能够限制或跳过目标域。