无意中发送了多个请求

Multiple requests being send unintentionally

我正在使用我用 AWS(亚马逊网络服务)编写的 PHP 脚本 PHP 使用 SMTP 发送电子邮件的脚本

每次我 运行 这个脚本,假设我的数据库中有 3 个用户,那么第一个用户会收到第一、第二和第三个人的邮件。第二个用户将邮件发送给第二个人和第三个人。第三个用户只收到给第三个人的邮件。

我不知道为什么会这样,并且一直在拉我的头发一段时间。也许我遗漏了一些要点,这就是为什么在这里添加一个问题。

先决条件:

func1() = 用于从我还没有发过邮件的数据库中获取邮件,return只有一个值(ID)

func2() = 用于获取在 func1() 中找到其 ID 的特定用户的数据

func3() = 用于标记 "Send" 我们向其发送邮件的特定 ID。

<?php

require 'aws-autoloader.php';
require 'vendor/autoload.php';

$mail = new PHPMailer;    
$mail->isSMTP();    
$mail->setFrom('myemail@address.com', 'My Company Name');    
$mail->Username = 'Username';    
$mail->Password = 'Password';    
$mail->Host = 'email-smtp.us-west-2.amazonaws.com';

class Db {
    public function dbconnect(){
    $servername = "localhost";
    $username = "username";
    $password = "password";
    $dbname = "database";
    $conn = new mysqli($servername, $username, $password, $dbname);
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }
        return $conn;
    }
    public function func1()
    {
    $conn=$this->dbconnect();
    $stmt = $conn->prepare("CALL func1()");
    $stmt->execute();
    $result=NULL;
    $result = $stmt->get_result();
    $item=NULL;
    while ($row = $result->fetch_array(MYSQLI_NUM))
        {
        $item[] = $row;
        }
    return $item;
    $stmt->close();
    $conn->close();
    }
    public function func2($id)
    {
    $conn=$this->dbconnect();
    $stmt = $conn->prepare("CALL func2(?)");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $item=NULL;
    while ($row = $result->fetch_array(MYSQLI_NUM))
        {
        $item[] = $row;
        }
    return $item;
    $stmt->close();
    $conn->close();
    }
    public function func3($id)
    {
    $conn=$this->dbconnect();
    $stmt = $conn->prepare("CALL func3(?)");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $item=NULL;
    while ($row = $result->fetch_array(MYSQLI_NUM))
        {
        $item[] = $row;
        }
    return $item;
    $stmt->close();
    $conn->close();
    }
}
$count=0;
$obj=new Db;
$ids=$obj->func1();
while(($ids[0][0]!=0)&&($count<1000)){
$ids=$obj->func1();
$rslt=$obj->func2($ids[0][0]);
if($rslt[0][0]!=NULL)
    {
    $idno=$rslt[0][0];
    $companyname=$rslt[0][2];
    $email=$rslt[0][16];
    $complete=NULL;
do{
    $mail->addAddress($email, $companyname);
    $mail->Subject = 'My Subject';
    $mail->Body = '<p>Hello</p>';
    $mail->AltBody = "Hello";

    $mail->SMTPAuth = true;

    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    $mail->isHTML(true);
    if(!$mail->send()) {
        echo "Email not sent. " , $mail->ErrorInfo , PHP_EOL;
    } else {
        $complete=$obj->func3($ids[0][0]);
    }
}while($complete[0][0]!=3);
}
$count=$count+1;
//if($count%10==0) Trying to give a small break after each 10 emails are send
    sleep(1);
}
$count=$count-1;
echo 'Email Send to: '.$count.' Users.<br>';
?>

调用该函数后,我收到了开头所述的电子邮件。并且所有用户都被标记为"Send"

知道我可能做错了什么以获得这样的结果。

您的代码对每封电子邮件使用相同的 PHPMailer 对象,并且它使用 $mail->addAddress() 添加地址而不重置电子邮件之间的电子邮件地址列表,因此收件人列表每次都在增加.

您可以为每封新电子邮件调用 $mail->clearAllRecipients(),或者您可以为每封电子邮件创建一个新的 PHPMailer 对象。请注意,如果您选择前一种方法,那么您应该检查是否还有其他需要从一封电子邮件重置为下一封电子邮件的内容。