无意中发送了多个请求

时间:2018-03-27 21:35:58

标签: php amazon-web-services xampp phpmailer amazon-ses

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

每次我运行这个脚本,说我的数据库中有3个用户,然后第一个用户获得第一,第二和第三人的邮件。第二个用户收到第二和第三人的邮件。并且第三个用户只能将邮件发送给第三方。

我不知道为什么会这样,并且已经把我的头发拉了一段时间。也许我错过了一些观点,这就是为什么在这里添加一个问题。

预要件:

func1()=用于从我没有发送电子邮件的DB收到电子邮件但是,仅返回单个值(ID)

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

func3()=用于标记"发送"我们发送邮件的那个特定身份证。

<?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>';
?>

调用该函数后,我会收到电子邮件,如开头所述。所有用户都被标记为&#34;发送&#34;

任何想法我可能做错了得到这样的结果。

1 个答案:

答案 0 :(得分:1)

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

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