使用PHP邮件功能但使用多个帐户发送邮件

时间:2013-04-19 19:41:59

标签: php for-loop while-loop phpmailer bulk-mail

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

现在我想将它带到下一级,其中admin的所有登录都将存储在另一个数据库中,代码将从数据库读取登录并发送邮件。例如,代码将使用admin#1登录向用户#1-50发送邮件,并使用admin2登录将邮件发送给用户#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..

现在,当我尝试使用此代码时,我得到了     “邮件程序错误(domain.com上的收件人)以下发件人地址失败:发件人在gmail.com:被叫邮件()没有连接”

2 个答案:

答案 0 :(得分:4)

你的查询不好。您无处定义$startnum1$endnumb1,因此内部查询变为:

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

由于您的代码中存在完全 NO 错误处理,并且只是在每个阶段都取得成功,难怪您无法找出原因失败的原因。

至少,您的查询调用应该像

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

从不使用@来抑制错误,从不忽略返回值。当你遇到明显的问题时,这可能会更加适用。

你的代码相当于把手指塞进你的耳朵并且“lalala听不到你”而忽略了MySQL可能做的所有事情来帮助你解决问题。

答案 1 :(得分:1)

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

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

  • 您正在使用@来抑制错误 ,因此您实际上并不知道何时出现错误。在您的情况下:使用@mysql_select_db("test");您甚至不知道您是否已连接到存在的数据库(因为忽略了错误)。输入类似mysql_select_db("test") or die(mysql_error());

  • 你有 不必要的paranthesis :我相信$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而不是实际的mailadresses(似乎无论如何)

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

除此之外,你 两次添加相同的“emailid”

不应使用Mysql函数 ,因为函数已弃用,很快就会从php中删除。请改用 PDO mysqli

我希望上面能帮助你朝着正确的方向前进。