我正在撰写邮件列表。
我的邮件列表现在有超过400封电子邮件,所以我使用的是foreach
。
我的问题是:我可以限制foreach仅发送100封电子邮件吗?
例如 - 向前100封电子邮件发送电子邮件,中断,然后从停止的位置开始。因此,例如,对于400封电子邮件,foreach将被调用4次以向所有电子邮件发送电子邮件。
foreach ($addresses as $to) {
mail($to,$subject,$message,$headers);
}
我需要这样做,因为如果我一次将电子邮件发送到所有400封电子邮件,我将获得503服务不可用。
我试过这个但是没有工作......
$emailchunkarray = array_chunk($addresses, 50);
$arraysize = count ($emailchunkarray);
$x = 0;
function chunker() {
if ($x <= $arraysize) {
foreach ($emailchunkarray[$x] as $to) {
mail($to,$subject,$message,$headers);
}
$x++
$chunker2();
}
}
$chunker();
function chunker2() {
if ($x <= $arraysize) {
foreach ($emailchunkarray[$x] as $to){
mail($to,$subject,$message,$headers);
}
$x++;
$chunker();
}
}
出于某种原因,我无法回答我的问题......所以我就是这样做的:
$ChunkAddresses = 10;
$EmailChunkArray = array_chunk($Addresses, $ChunkAddresses);
$ArraySize = count ($EmailChunkArray);
$ChunkSize = 0;
$ForeachCounter = 0;
ChunkLoop: {
if ($GLOBALS["ChunkSize"] <= $GLOBALS["ArraySize"]) {
$EmailChunkArrayLoop = $GLOBALS["EmailChunkArray"];
foreach ($EmailChunkArrayLoop[$GLOBALS["ChunkSize"]] as $ToChunkLoop) {
mail($ToChunkLoop,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]);
$GLOBALS["ForeachCounter"]++;
if ($GLOBALS["ForeachCounter"] == $GLOBALS["ChunkAddresses"]) {
echo "This is the " . $GLOBALS["ChunkSize"] . " chunk.";
$GLOBALS["ForeachCounter"] = 0;
break 1;}
}
$GLOBALS["ChunkSize"]++;
sleep(3);
goto ChunkLoopFollow;} else if ($GLOBALS["ChunkSize"] == $GLOBALS["ArraySize"]){
exit();}
}
ChunkLoopFollow: {
if ($GLOBALS["ChunkSize"] <= $GLOBALS["ArraySize"]) {
$EmailChunkArrayLoopFollow = $GLOBALS["EmailChunkArray"];
foreach ($EmailChunkArrayLoopFollow[$GLOBALS["ChunkSize"]] as $ToChunkLoopFollow) {
mail($ToChunkLoopFollow,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]);
$GLOBALS["ForeachCounter"]++;
if ($GLOBALS["ForeachCounter"] == $GLOBALS["ChunkAddresses"]) {
echo "This is the " . $GLOBALS["ChunkSize"] . " chunk.";
$GLOBALS["ForeachCounter"] = 0;
break 1;}
}
$GLOBALS["ChunkSize"]++;
sleep(3);
goto ChunkLoop;} else if ($GLOBALS["ChunkSize"] == $GLOBALS["ArraySize"]){
exit();}
}
echo "Finished!";
答案 0 :(得分:4)
使用array_chunk()
拆分数组,然后用另一个foreach包装你的foreach。
array_chunk($input_array, 100);
这应该会给你一个包含4个数组的数组,每个数组包含100个元素(电子邮件)。
因为这回答了你的问题,它可能无法帮助你解决问题。您必须以某种方式暂停代码,为此我建议使用AJAX,因为您可以轻松指定定时事件。例如,您可以在PHP中创建可以发送x
电子邮件的小API,从y
索引开始,其中x
和y
是来自POST请求的值,然后使用AJAX控制它调用您的小API。
另一种解决方法是使用Cron jobs
How to create cron job using PHP?
PHP array_chunk()