我需要一些帮助来修复这个PHP脚本中的小东西

时间:2013-11-15 18:06:01

标签: php email

我有一个网站,我想通知所有用户(总共400个)。为了避免服务器上的大量邮件限制,有人帮助我使用此脚本,它延迟了电子邮件发送。这里的问题是$to,我不知道那是什么意思,因为帮助我的人不知何故忘记了这一点。如何修复此脚本才能正常工作?

我很匆忙,因为我不知道下次什么时候会再次找到那个人:D谢谢!

<?php
ini_set('max_execution_time', 600); //600 seconds = 10 minutes
$sql = "SELECT `email`FROM `users`";
$rs = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

while($sel = mysql_fetch_assoc($rs))
{
echo $sel['email'];
echo "<br>";

$headers = "From:site <noreply@site.com>\n";
$headers .= "Content-Type: text/plain;\r\n charset-iso-8859-1\r\n";
$body = "message";
$subject = "subject";
$recipient = $sel['email'];

foreach($to as $recipient)
{
$result = mail($recipient, $subject, $message, $header);
sleep(4);
}
}

4 个答案:

答案 0 :(得分:3)

此脚本中的任何位置都没有声明$ to变量。

<?php
ini_set('max_execution_time', 600); //600 seconds = 10 minutes
$sql = "SELECT `email`FROM `users`";
$rs = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

while($sel = mysql_fetch_assoc($rs))
{
echo  $recipient = $sel['email'];
echo "<br>";

$headers = "From: site <noreply@site.com>\n";
$headers .= "Content-Type: text/plain;\r\n charset-iso-8859-1\r\n";
$body = "message";
$subject = "subject";


$result = mail($recipient, $subject, $message, $header);
sleep(4);

}

答案 1 :(得分:1)

  

“这里的问题是$to,我不知道那是什么”

解释你的问题--- ^

如果你在数组中有电子邮件,那么

foreach($to as $recipient)是有效的。

例如:

$to = array('email1@example.com', 'email2@example.com', 'email3@example');

我有一个类似的脚本,我为测试目的编写为foreach

然而,这似乎不是你的情况,也不是必需的。

您也可以尝试:

foreach($sel as $recipient)

而不是foreach($to as $recipient)

我这样说是因为我用于类似(工作)应用程序的代码是这样的(简化):

while($user = mysqli_fetch_array($query)){

  $to = $user['email'];
  mail($to, $subject, $body, $headers);

}

答案 2 :(得分:1)

$ recipient是您单独存储每个人的电子邮件地址的阵列。所以只需在你的foreach循环中交换$ to和$ recipient,并在mail函数中用$ to替换$ recipient,它应该可以正常工作。

/* correct code */
foreach($recipient as $to) 
{
$result = mail($to, $subject, $message, $header); 
sleep(4);
}

基本上你正在做的是你首先从数据库中检索所有电子邮件并将它们放入数组$ recip。在此之后使用foreach然后在每次迭代时,$ recipient中的当前元素的值被分配给$ to,内部数组指针被提前一。这就是你的邮件功能中的第一个参数应该是$ to。

的原因

答案 3 :(得分:0)

首先,您可能需要在email语句中的FROM$sql之间添加一个空格来修复该查询。

$sql = "SELECT `email` FROM `users`";

$ recipient必须是以逗号分隔的列表

$recipient = '';

while($sel = mysql_fetch_assoc($rs))
{
    $recipient .= $sel['email'] . ', '; // note the comma
}

$recipient = preg_replace('/, $/', '', $recipient); // remove last comma

$headers = "From: site <noreply@site.com>\n";
$headers .= "Content-Type: text/plain;\r\n charset-iso-8859-1\r\n";
$body = "message";
$subject = "subject";


$result = mail($recipient, $subject, $message, $header);
sleep(4);

或者您可以遍历每个收件人

$headers = "From: site <noreply@site.com>\n";
$headers .= "Content-Type: text/plain;\r\n charset-iso-8859-1\r\n";
$body = "message";
$subject = "subject";

while($sel = mysql_fetch_assoc($rs))
{
   $recipient = $sel['email'];    

   $result = mail($recipient, $subject, $message, $header);
   sleep(4);
}

您不需要foreach($to as $recipient),因为您已经处于循环中。如果您想让代码按原样运行,那么您只需要在$to语句中将foreach切换为$ recipient

$recipient = $sel['email'];

foreach($recipient as $to)
{
     $result = mail($to, $subject, $message, $header);
....