You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPMailer批量发邮件动态内容异常:仅显示最后用户邮箱

Hey Lukas, let's fix that annoying email issue you're dealing with! The problem you're seeing—where all users get the email but only see the last user's email in the dynamic content—almost always comes down to how you're handling the loop and PHPMailer settings. Let's break this down step by step.

What's Causing the Problem?

Chances are, you're either:

  1. Setting the dynamic email content (like the user's email in the body) outside the user loop, so it gets overwritten by the last user in the list.
  2. Adding all users as recipients in one go without resetting the PHPMailer instance, then sending only once—resulting in everyone getting the final version of the content.
  3. Forgetting to clear previous recipients before adding the next user, leading to content being overwritten each time.

The Fix: Properly Loop Through Users and Reset PHPMailer Each Time

Here are two solid approaches to solve this:

Approach 1: Create a New PHPMailer Instance for Each User

This is straightforward and avoids any residual settings from previous emails:

<?php
include "core/init.php";
error_reporting(E_ALL);
date_default_timezone_set('Etc/UTC');
require 'phpmailer/PHPMailerAutoload.php';

// Fetch all users from your database (adjust this to match your actual query)
$users = $db->query("SELECT email FROM users")->fetchAll(PDO::FETCH_ASSOC);

// Loop through each user
foreach($users as $user) {
    // Initialize a fresh PHPMailer instance for every user
    $mail = new PHPMailer;
    $mail->isSMTP();
    $mail->SMTPDebug = 0; // Set to 2 if you need debug logs

    // Configure your SMTP settings (fill in your actual details!)
    $mail->Host = 'smtp.yourdomain.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'your-admin-email@domain.com';
    $mail->Password = 'your-smtp-password';
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    // Set sender info
    $mail->setFrom('admin@yourdomain.com', 'System Administrator');
    // Add ONLY the current user as recipient
    $mail->addAddress($user['email']);

    // Set email subject and dynamic body (uses the current user's email!)
    $mail->Subject = 'Important System Update';
    $mail->Body = "Hi {$user['email']},\n\nThis is your personalized system notification. Thanks for being part of our platform!";
    $mail->AltBody = "Hi {$user['email']},\n\nThis is your personalized system notification. Thanks for being part of our platform!";

    // Send the email and handle errors
    if(!$mail->send()) {
        echo "Failed to send to {$user['email']}: {$mail->ErrorInfo}<br>";
    } else {
        echo "Successfully sent to {$user['email']}<br>";
    }
}
?>

Approach 2: Reuse the PHPMailer Instance (Clear Recipients Each Time)

If you prefer not to create a new instance every time, just reset the recipients and content in each loop iteration:

<?php
include "core/init.php";
error_reporting(E_ALL);
date_default_timezone_set('Etc/UTC');
require 'phpmailer/PHPMailerAutoload.php';

// Initialize PHPMailer once
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 0;
// Configure SMTP settings (same as above)
$mail->Host = 'smtp.yourdomain.com';
$mail->SMTPAuth = true;
$mail->Username = 'your-admin-email@domain.com';
$mail->Password = 'your-smtp-password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('admin@yourdomain.com', 'System Administrator');
$mail->Subject = 'Important System Update';

// Fetch users
$users = $db->query("SELECT email FROM users")->fetchAll(PDO::FETCH_ASSOC);

foreach($users as $user) {
    // Clear all previous recipients - THIS IS CRITICAL!
    $mail->clearAddresses();
    // Add current user
    $mail->addAddress($user['email']);

    // Update body with current user's email
    $mail->Body = "Hi {$user['email']},\n\nThis is your personalized system notification. Thanks for being part of our platform!";
    $mail->AltBody = $mail->Body;

    // Send and handle errors
    if(!$mail->send()) {
        echo "Failed to send to {$user['email']}: {$mail->ErrorInfo}<br>";
    } else {
        echo "Successfully sent to {$user['email']}<br>";
    }
}
?>

Key Takeaways

  • Always set dynamic content inside the loop: This ensures each user gets their own personalized content, not the last one's.
  • Reset recipients every time: Use clearAddresses() if reusing the PHPMailer instance, or create a new instance to avoid leftover settings.
  • Send the email inside the loop: If you only send once after the loop, you'll send the final (last user's) content to everyone.

A quick bonus tip: If you have a lot of users, add a small delay (like sleep(1)) between sends to avoid triggering spam filters on your SMTP server.

内容的提问来源于stack exchange,提问作者lukas mi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:29:44