【问题标题】:PHPMailer sends multiple emails with loopPHPMailer 使用循环发送多封电子邮件
【发布时间】:2020-02-24 17:03:56
【问题描述】:

我使用以下代码通过 PHPMailer 发送邮件。它从 db 将电子邮件发送给收件人,但它向他们发送了许多电子邮件。我只想向每个用户发送 1 封 HTML 表中的相关记录。例如。如果为用户返回 5 条记录,则它会向用户发送 5 封电子邮件,其中包含 1 条记录。 另外,我不想使用默认 PHPMailer 脚本使用的 trycatch 命令,但是 while ...

我怎样才能改变它来做我想做的事? 谢谢。

<?php
$stmt = sqlsrv_query( $conn, $sql );   

$rows = array();
while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){

$rows[] = $row; 

//foreach ($result as $row) {
try {


    $mail->addAddress($row['email']);
} 
   catch (Exception $e) {
    echo 'Invalid address skipped: ' . htmlspecialchars($row['email']) . '<br>';
    continue;
}

try {
    $body = 'Hi: '. $row['first'] .' '. $row['last'] .'<br>';
    $body .=  '<table border="1"><tr><th>Username</th><th>Day</th><th>Date</th></tr><th>Action</th>';

    $body .= '<tr><td>';         
    $body .= $row['username'] . '</td><td>'; 
    $body .= $row['day'] . '</td><td>';  
    $body .= $row['date'] . '</td><td>';                        
    $body .= $row['action'] . '</td></tr>';
    $body .= '</table>';      

    $mail->msgHTML($body);

    $mail->send();
    echo 'Message sent to :' . htmlspecialchars($row['last']) . ' '. htmlspecialchars($row['first']) . '(' . htmlspecialchars($row['email']) . ')<br>';


} catch (Exception $e) {
    echo 'Mailer Error (' . htmlspecialchars($row['email']) . ') ' . $mail->ErrorInfo . '<br>';
    $mail->smtp->reset();
}

$mail->clearAddresses();
$mail->clearAttachments();
 }
?>

【问题讨论】:

  • 我们有点需要查看您的 SQL 查询,但听起来您提到的每个“记录”都是结果行,所以这就是为什么您会得到您的行为。
  • 您的查询很可能需要按用户 ID 分组。
  • $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC 返回所有用户的所有记录。您的意思是 SQL 语句中的GROUP BY?我认为它需要在while 命令中再添加一个循环。

标签: php phpmailer html-email


【解决方案1】:

这是你的意思吗?只将所有结果发送给结果集中的每个人一次?

$stmt = sqlsrv_query( $conn, $sql );   

$rows = array();
$body = '<table border="1"><tr><th>Username</th><th>Day</th><th>Date</th></tr><th>Action</th>';

while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){

  $rows[] = $row; 
  $name = $row['first'] .' '. $row['last'];

  $body .= '<tr><td>';         
  $body .= $row['username'] . '</td><td>'; 
  $body .= $row['day'] . '</td><td>';  
  $body .= $row['date'] . '</td><td>';                        
  $body .= $row['action'] . '</td></tr>';


  $mail->addAddress($row['email'], $name);

}
$body .= '</table>'; 
$mail->msgHTML($body);

$mail->send();

以下是双 while 循环的示例。 $sql = 在您的时间范围或其他部分条件内选择所有人员和电子邮件地址

$stmt = sqlsrv_query( $conn, $sql );  
while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){

  $name = $row['first'] .' '. $row['last'];
  $email = $row['email'];
  $body = '<table border="1"><tr><th>Username</th><th>Day</th><th>Date</th></tr><th>Action</th>';

  // now get this person's messages

  $sql2 = "SELECT username, day, date, action from Message WHERE name = $row['name']";

  $stmt2 = sqlsrv_query( $conn, $sql2 );  
  while($row2 = sqlsrv_fetch_array( $stmt2, SQLSRV_FETCH_ASSOC)){
    $body .= '<tr><td>';         
    $body .= $row['username'] . '</td><td>'; 
    $body .= $row['day'] . '</td><td>';  
    $body .= $row['date'] . '</td><td>';                        
    $body .= $row['action'] . '</td></tr>';
  }
  $body .= '</table>';

  // at this point you can create the phpmailer add the single email address & message body, and send the email

}

好的,您可以尝试重新组织结果。您可以将 $testing 数组替换为您的 SQL 结果集。使用两个 foreach 循环,您可以将其重新组织成一个多维数组 $names,然后循环通过它发送您的电子邮件。

$test1 = array('name'=>'mike','email'=>'mike@mike','day'=>'monday','action'=>'acrtion1');
$test2 = array('name'=>'mike','email'=>'mike@mike','day'=>'tuesday','action'=>'acrtion2');
$test3 = array('name'=>'mike','email'=>'mike@mike','day'=>'wedday','action'=>'acrtion3');

$test4 = array('name'=>'dave','email'=>'dave@mike','day'=>'monday','action'=>'acrtion1');
$test5 = array('name'=>'dave','email'=>'dave@mike','day'=>'tuesday','action'=>'acrtion2');
$test6 = array('name'=>'dave','email'=>'dave@mike','day'=>'wedday','action'=>'acrtion3');

$test7 = array('name'=>'tom','email'=>'tom@mike','day'=>'monday','action'=>'acrtion1');
$test8 = array('name'=>'tom','email'=>'tom@mike','day'=>'tuesday','action'=>'acrtion2');
$test9 = array('name'=>'tom','email'=>'tom@mike','day'=>'wedday','action'=>'acrtion3');

$testing = array($test1,$test2,$test3,$test4,$test5,$test6,$test7,$test8,$test9);

$names = array();

foreach($testing as $test){
    $names[$test['name']][] = $test;
}

print_r($names);

foreach($names as $name=>$records){
    echo "<p>email $name";
    foreach($records as $record){
        // this is where you can construct the email body for current $name
        echo "<p>".$record['email']." ".$record['day']." ".$record['action'];
    }
    // now send the email to current $name
}

【讨论】:

  • 假设它返回 90 条记录(每个用户 30 条)。我想发送 3 封电子邮件(每个用户一封),HTML 表中有 30 条记录。
  • 好的,第一个 while 或 foreach 循环应该选择每个用户,下一个应该选择该用户的记录并构建电子邮件正文表。然后将电子邮件发送给该用户。
  • 我不明白如何写第二个循环。
  • 如果没有看到你的sql就很难解释,因为这里有几种方法可以完成同样的事情。我会发布另一个答案
  • 我的 sql 返回以下 rsult。电子邮件必须是 GROUPED BY ???用户名 电子邮件 日期 行动 Mike mike@... wed ... 行动 1 Mike mike@... fri ....行动 2 迈克迈克@... 坐... 行动 3 约翰约翰@... 周五... 行动 2 约翰约翰@... 周一 ... 行动 1 玛丽亚玛丽亚@... 周一 ... 行动 2 玛丽亚玛丽亚@... 周六。 . 行动 3
【解决方案2】:

我的 sql 返回以下结果。'email' 必须是 GROUPED BY ???

【讨论】:

  • 看不到sql就无法调试
  • 您不需要在 SQL 中调试任何内容。我发布了 SQL 结果。我不知道如何在我的示例中使用 foreach(电子邮件循环)。我想发送 1 封电子邮件/用户并在电子邮件中包含来自每个用户的第二个循环的记录(例如,mike 3 条记录、John 2 条记录、Maria 2 条记录)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多