1

我有 1000 个成员的数据库,其中包含用户的电子邮件 ID,并开发了使用单个管理员帐户向数据库中的所有用户发送邮件的代码 - 管理员登录在代码中被硬编码。

现在我想把它带到下一个级别,所有管理员的登录名都将存储在另一个数据库中,代码将从数据库中读取登录名并发送邮件。例如,代码将使用 admin#1 登录向 user#1-50 发送邮件,并使用 admin2 登录向 user#51-100 发送邮件,依此类推。

下面是我正在尝试的代码,似乎多个循环存在一些问题。有人可以帮忙吗。

<?php
error_reporting(E_ALL);
//error_reporting(E_STRICT);
ini_set("display_errors", "on");
ini_set('max_execution_time', 300); //300 seconds = 5 minutes
ini_set('memory_limit', '6500M'); //Maximum amount of memory a script may consume (128MB by default)
date_default_timezone_set('UTC');

require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail                = new PHPMailer();
$body                = file_get_contents("contents.html");
$body                = preg_replace('/[\]/','',$body);

$mail->IsSMTP();        
$mail->Host          = "ssl://smtp.gmail.com";
$mail->SMTPAuth      = true;
$mail->SMTPKeepAlive = true;
$mail->Port          = 465;
$mail->Subject       = "Subject";
$mail->AddReplyTo ('example@domain.com', 'test');

$mail->body         = $body;
$mail->AltBody      = "To view the message, please use an HTML compatible email viewer!";
$mail->IsHTML(true);
$mail->MsgHTML($body);

$con = mysql_connect("localhost","root","password");
if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }
mysql_select_db("test") or die(mysql_error()); //Databasename

$query1  = "SELECT * FROM loginids WHERE Count >= 1"; //count is column name in table loginids
$result1 = mysql_query($query1) or die(mysql_error());
$row1    = mysql_fetch_array ($result1);

$Counter = 1;
$startnum1 = 0;
$endnum1 = 0;

while ($Counter <= 3) { 

 $mail->Username    = $row1["UserName"]; 
 $mail->Password    = $row1["Password"]; 
 $mail->From        = $row1["UserName"];
 $mail->FromName    = $row1["FromName"];

 $startnum1 = $endnum1;
 $endnum1   = $startnum1 + 2;

 $query2    = "SELECT EmailID FROM dummy Limit $startnum1,$endnum1";
 $result2   = mysql_query($query2) or die(mysql_error());

        while ($row2 = mysql_fetch_array ($result2)) {
            $mail->AddAddress($row2["EmailID"]);
          //$mail->AddStringAttachment($row["EmailID"], "contents.html");

          if(!$mail->Send()) {
            echo "Mailer Error (" . str_replace("@", "&#64;", $row2["EmailID"]) . ') ' . $mail->ErrorInfo . '<br />';
          } else {
            echo "Message sent From : " .$row1["UserName"]." Message sent to :" . $row2["EmailID"] . ' (' . str_replace("@", "&#64;", $row2["EmailID"]) . ')<br />';
          }
          $mail->ClearAddresses();
        }
$Counter++;     
}
?>

嗨,伙计们,感谢您的宝贵反馈,非常感谢。我仍在学习,似乎还有很多事情要做。我已经相应地更新了我的代码(上面),但仍然无法发送邮件。我不确定我是否正确使用了循环。所以这就是我我正在尝试在代码中进行操作。我想使用每个帐户发送(比如说)50 封邮件。我有 3 个电子邮件帐户,$Counter 正在检查我的帐号。startnum1/endnum1 表示每个帐户应发送的电子邮件数量。

so $startnum1, $endnum1 should also be changed dynamically for each account #.
for e.g.  
account#1, $startnum1=1, $endnum1=50
account#2, $startnum1=51, $endnum1=100
and so on..

现在,当我尝试此代码时,我收到“Mailer Error (recipient at domain.com) 以下发件人地址失败:gmail.com 上的 sender1 :在未连接的情况下调用 Mail()”

4

2 回答 2

4

你有错误的查询。您在任何地方都没有定义$startnum1and $endnumb1,因此内部查询变为:

SELECT emailid FROM dummy Limit ,
                               ^^^--syntax error

由于您的代码中绝对没有错误处理,并且只是假设每个阶段都成功,难怪您无法找出失败的原因。

至少,您的查询调用应该类似于

$result = mysql_query($sql) or die(mysql_error());
                          ^^^^^^^^^^^^^^^^^^^^^^

永远不要使用 来抑制错误@,也永远不要忽略返回值。当您遇到明显问题时,这是更适用的千亿倍。

你的代码相当于把你的手指塞在耳朵里,然后说“lalala 听不到你的声音”,而忽略了 MySQL 可能做的一切来帮助你找出问题。

于 2013-04-19T19:47:59.627 回答
1

阅读代码时会想到的一些事情。

  • 您正在迭代 4 次向每个登录发送邮件。这是你想要的吗?( for ($Counter = 0; $Counter <= 4; $counter += 1) {)

  • 您正在使用 @ 抑制错误,因此您实际上不知道何时有错误。在你的情况下:@mysql_select_db("test");你甚至不知道你是否连接到一个存在的数据库(因为错误被忽略)。输入喜欢mysql_select_db("test") or die(mysql_error());

  • 你有不必要的括号:我相信$Username = ($row1["UserName"]);有效,但输入 $Username = $row1["UserName"]; 就足够了

  • 分配不正确?价值观:

我猜想:

 $Username   = ($row1["UserName"]); 
 $Password   = ($row1["Password"]); 
 $From       = ($row1["UserName"]);
 $FromName   = ($row1["FromName"]);

 $mail->Username; 
 $mail->Password; 
 $mail->From;
 $mail->FromName;

你正在尝试做:

 $Username   = $row1["UserName"]; 
 $Password   = $row1["Password"]; 
 $From       = $row1["UserName"];
 $FromName   = $row1["FromName"];

 $mail->Username = $Username;
 $mail->Password = $Password;
 $mail->From = $From;
 $mail->FromName = $FromName;
  • 未赋值

    $query2 = "SELECT emailid FROM dummy Limit $startnum1,$endnum1";

应该是这样的

$startnum1 = 0;
$endnum1 = 99;
$query2     = "SELECT emailid FROM dummy Limit $startnum1,$endnum1"; 

否则查询将失败。

看一下这段代码:

  $mail->body       = $body;
  $mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
  $mail->IsHTML(true);
  $mail->MsgHTML($body);

似乎您可以在所有循环之外使用以上(否则定义了很多次相同的值)

  $mail->AddAddress($row2["emailid"], $row2["emailid"]);

您正在添加 id 而不是实际的邮件地址(无论如何看起来都是这样)

$mail->AddAddress($row2["emailid"], $row2["emailid"]);

除此之外,您还添加了两次相同的“emailid”

不应使用 Mysql-functions,因为函数已被弃用,并且很快将从 php.ini 中删除。请改用PDOmysqli

我希望以上内容可以帮助您朝着正确的方向前进。

于 2013-04-20T04:41:42.950 回答