1

ユーザーの電子メールIDを含む1000人のメンバーのデータベースがあり、単一の管理者アカウントを使用してデータベース内のすべてのユーザーにメールを送信するためのコードを開発しました-管理者のログインはコードでハードコーディングされました.

ここで、管理者のすべてのログインが別のデータベースに保存され、コードがデータベースからログインを読み取り、メールを送信する次のレベルに進みたいと思います。たとえば、コードは 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..

今、このコードを試していると、「メーラー エラー (受信者は domain.com) 次の差出人アドレスが失敗しました: gmail.com の送信者 1 : 接続せずに 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 = "ダミー制限 $startnum1,$endnum1 から emailid を選択";

次のようなものでなければなりません

$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」を2回追加しています。

関数は非推奨であり、まもなく php から削除されるため、 Mysql 関数は使用しないでください。代わりにPDOまたはmysqliを使用。

上記が正しい方向に役立つことを願っています。

于 2013-04-20T04:41:42.950 に答える