user1078494
user1078494

Reputation: 509

phpmailer with mysql results

I'm trying to use phpmailer to send out emails to each email address found in the database, but as a unique email. For some reason, it's sending duplicate emails, and it sends it out in as many copies as my query returns rows. So, if my query returns 5 rows, each recipient will receive 5 email (total emails sent is 25). I can't use the same email for multiple recipients because the email content is personalized.

What am I doing wrong with my code? Please help...

Here's my code:

$customers_query = "SELECT customer_name, customer_email, customer_id FROM customers";

    $customers = mysql_query($customers_query);

    if (!$customers) {
        $message  = 'Error notice: ' . mysql_error() . "\n";
        $message .= 'Whole query: ' . $query;
    die($message);
    }

    require_once('class.phpmailer.php');
    // create an instance

    while ($row = mysql_fetch_array($customers)) {
        $email = $row['customer_email'];
        $name = $row['customers_name'];
        $id = $row['customer_id'];
        $mail = new PHPMailer();
        // use sendmail for the mailer
        $mail->IsSendmail();
        $mail->SingleTo = true;
        $mail->IsHTML(true);
        $mail->From = "[email protected]";
        $mail->FromName = "MyWebsite";
        $mail->Subject = "Welcome to MyWebsite";
        $mail->AddAddress($email);

        $mail->Body = "Dear ".$name.", welcome to MyWebsite. Your ID is: ".$id.". Enjoy your stay.";
        $mail->Send();
    }

So, what am missing here? Why does it send that many emails?

Upvotes: 0

Views: 1536

Answers (3)

Vetrivel
Vetrivel

Reputation: 1149

You can do one more thing, add one more extra field in the customer table, like is_email_sent, yes or no. Once sent email you can update specific row using primary key. so it will not send the same email to multiple time..

Upvotes: 0

RugerSR9
RugerSR9

Reputation: 458

Try something like is below, you need to be counting your rows somehow so that it doesn't re-process them. Also, the AddAddress(); function is used to keep adding email addresses to the TO: field, so you need to call ClearAddresses(); in order to restart with a fresh set of recipients.

$customers_query = "SELECT customer_name, customer_email, customer_id FROM customers";

    $customers = mysql_query($customers_query);
    $count = mysql_num_rows($customers); 
    $result = mysql_fetch_array($customers);
    $i = 0;

    if (!$customers) {
        $message  = 'Error notice: ' . mysql_error() . "\n";
        $message .= 'Whole query: ' . $query;
    die($message);
    }

    require_once('class.phpmailer.php');
    // create an instance

    while ($i < $count) {
        $email = mysql_result($result,$i,"customer_email");
        $name = mysql_result($result,$i,"customers_name");
        $id = mysql_result($result,$i,"customer_id");
        $mail = new PHPMailer();
        // use sendmail for the mailer
        $mail->IsSendmail();
        $mail->SingleTo = true;
        $mail->IsHTML(true);
        $mail->From = "[email protected]";
        $mail->FromName = "MyWebsite";
        $mail->Subject = "Welcome to MyWebsite";
        $mail->AddAddress($email);

        $mail->Body = "Dear ".$name.", welcome to MyWebsite. Your ID is: ".$id.". Enjoy your stay.";
        $mail->Send();
        $mail->ClearAddresses();
        $i++;
    }

Upvotes: 0

Karim Lahlou
Karim Lahlou

Reputation: 168

Try this:

$mail->ClearAddresses(); after $mail->Send();

Upvotes: 1

Related Questions