代码之家  ›  专栏  ›  技术社区  ›  Haris Khan

通过phpmailer发送批量电子邮件

  •  1
  • Haris Khan  · 技术社区  · 6 年前

    我使用phpmailer向我的订阅者发送大量电子邮件,但我面临一个可怕的问题,即当我向订阅者发送电子邮件时,每个订阅者都会多次收到相同的电子邮件。有些人得到了4次,有些人得到了14次。 我通过Mysql表获取订阅服务器电子邮件,其中flag=0,在while循环结束时,我将订阅服务器标志更新为1。我知道这是一个循环的问题,但我不知道我哪里做错了,甚至不确定我应该使用while循环或其他方法来修复这个问题。任何帮助都将非常感谢我。 这是我的代码:

    <?php
    
    $db_host = "localhost";
    $db_username = "root";
    $db_pass = "";
    $link= mysqli_connect("$db_host","$db_username","$db_pass", "mydb") or die ("could not connect to mysql"); 
    
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    // Simply:
    
    //Load Composer's autoloader
    require 'vendor/autoload.php';
    
    if(isset($_POST['send'])){
    
    $mail = new PHPMailer(true);                              // Passing `true` enables exceptions
    try {
         $query = "select customer_id, customer_name, customer_email from subscribers where flag_email = 0";
         $result = mysqli_query($link, $query) or die("No customer in the table");;
    
         while($values = mysqli_fetch_array($result)){
             $id = $values['customer_id'];
             $name = $values['customer_name'];
             $toemail = $values['customer_email'];
    
    
        //Server settings
        $mail->SMTPDebug = 1;                                 // Enable verbose debug output
        $mail->isSMTP();                                      // Set mailer to use SMTP
        $mail->Host = 'smtp server';  // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                               // Enable SMTP authentication
        $mail->Username = 'username';                 // SMTP username
        $mail->Password = 'password';                           // SMTP password
        $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 587;                                    // TCP port to connect to
    
        //Recipients
        $mail->setFrom('username', 'username');
    
    
        $mail->addReplyTo('myemail', 'name');
    
        $mail->addBCC(''.$toemail.'', ''.$name.'');
    
        //Content
        $mail->isHTML(true);                                  // Set email format to HTML
        $mail->Subject = 'Here is the subject';
        $mail->Body    = 'Here is the message';
    
    
        $mail->send();
        echo 'Message has been sent';
        $upd_query = "update subscribers set flag_email = 1 where customer_id = ".$id."";
        $result= mysqli_query($link, $upd_query);
    }
    
    } catch (Exception $e) {
        echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
    }
    
    
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Synchro    6 年前

    发生这种情况是因为您没有清除 to 每次在循环中寻址-请注意该方法被调用 addAddress setAddress ,它会照这句话做。你需要打电话 $mail->clearAddresses(); 在循环结束时重置它。在其他方面,您所做的事情基本上是正确的,但是您可以做一些事情来提高效率,主要是使用keep-alive和设置循环之前所有消息的公共属性。

    你可以看到所有这些都在 the mailing list example provided with PHPMailer

        2
  •  0
  •   Santhy K    6 年前

    我看到的问题是,在while循环中用update输出替换结果变量。请在while循环中使用不同的变量名

    $upd_query = "update subscribers set flag_email = 1 where customer_id = ".$id.""; $updateResult= mysqli_query($link, $upd_query);

    mailer对象创建可以在内部移动到while循环

    $query = "select customer_id, customer_name, customer_email from subscribers where flag_email = 0";
         $result = mysqli_query($link, $query) or die("No customer in the table");;
    
         while($values = mysqli_fetch_assoc($result)){
            $mail = new PHPMailer(true); 
            ....
         }