Вы сказали:
php mailer отправить несколько писем сразу Но что бы не было видно в каждом письме что кому еще отправили
Коротко — есть два рабочих подхода:
Добавить всех в BCC — получатели не увидят друг друга (их адреса не будут в поле To/CC), но письмо будет одно и то же для всех. Это простой вариант, но если нужно персонализировать тело (имя и т.п.) — не годится.
Отправлять каждому отдельно в цикле — самый приватный и гибкий способ (каждое письмо содержит только адрес одного получателя). Чтобы не открывать/закрывать SMTP-соединение каждый раз, можно держать соединение открытым (SMTPKeepAlive = true) и очищать адреса между итерациями. Это и рекомендую для рассылок средней/большой величины.
Ниже примеры с использованием PHPMailer (рекомендую ставить через Composer: composer require phpmailer/phpmailer).
Если персонализация не нужна:
php<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('you@example.com', 'Имя отправителя');
$mail->addAddress('you@example.com'); // обязательно нужен To (можете указать свой)
// Добавляем всех в BCC
$bccs = ['a@ex.com', 'b@ex.com', 'c@ex.com'];
foreach ($bccs as $r) {
$mail->addBCC($r);
}
$mail->isHTML(true);
$mail->Subject = 'Тема письма';
$mail->Body = '<p>Это общее письмо всем получателям.</p>';
$mail->send();
echo 'Отправлено';
} catch (Exception $e) {
echo "Ошибка: {$mail->ErrorInfo}";
}
Замечания:
BCC скрывает адреса в заголовках, но письмо одно и то же.
Некоторые почтовые провайдеры / СПАМ-фильтры хуже относятся к массовым BCC-рассылкам.
php<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$recipients = [
['email'=>'ivan@example.com', 'name'=>'Иван'],
['email'=>'olga@example.com', 'name'=>'Ольга'],
['email'=>'petr@example.com', 'name'=>'Пётр'],
];
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('you@example.com', 'Имя отправителя');
$mail->isHTML(true);
$mail->Subject = 'Персонализированная тема';
// держим соединение открытым, чтобы не переподключаться
$mail->SMTPKeepAlive = true;
foreach ($recipients as $r) {
// надо очищать предыдущие адреса
$mail->clearAddresses();
$mail->clearAttachments();
$mail->addAddress($r['email'], $r['name']);
// персонализация:
$body = "<p>Здравствуйте, {$r['name']}!</p><p>Это персональное письмо.</p>";
$mail->Body = $body;
if (!$mail->send()) {
// обработка ошибки для этого получателя
error_log("Не удалось отправить {$r['email']}: " . $mail->ErrorInfo);
} else {
echo "Отправлено: {$r['email']}\n";
}
// небольшая пауза может помочь (избежать лимитов)
usleep(200000); // 0.2 сек — опционально
}
// закрываем соединение
$mail->smtpClose();
} catch (Exception $e) {
echo "Ошибка: {$mail->ErrorInfo}";
}
Плюсы: каждому приходит письмо, где он — единственный получатель. Можно персонализировать. Минусы: при огромном количестве — дольше и надо учитывать лимиты SMTP.
Для приватности — используйте индивидуальную отправку (вариант 2). BCC скрывает, но не позволяет персонализацию и иногда вызывает подозрения спам-фильтров.
Если отправляете большое количество писем:
Поддерживайте SMTPKeepAlive = true и clearAddresses() между отправками.
Добавляйте паузы (sleep/usleep) при необходимости, чтобы не превысить лимиты провайдера.
Логируйте ошибки (и возможно повторные попытки).
Подумайте о массовых сервисах (SendGrid, Mailgun, Amazon SES) — у них выше доставка и меньше шансов попасть в спам.
Всегда добавляйте корректные заголовки: From, Reply-To, и опцию отписки (если это рассылка).
Если хочешь, могу:
Прислать готовый скрипт для отправки CSV-файла с адресами/именами и отчётом об ошибках.
Помочь настроить отправку через конкретный SMTP (укажи провайдера и лимиты).
Отличный вопрос! Давай кратко и чётко объясню, в чём разница между использованием:
$mail->addBCC($r);и
$recipients = [...]; + цикл отправки каждому.$mail->addBCC($r);Ты добавляешь несколько получателей в скрытую копию (BCC) в ОДНО письмо.
Пример:
php$mail->addAddress('you@example.com'); // основной получатель (можешь указать себя)
$mail->addBCC('ivan@example.com');
$mail->addBCC('olga@example.com');
$mail->addBCC('petr@example.com');
💡 Все эти люди получат одно и то же письмо, но:
не увидят адреса других получателей.
Письмо будет одинаковым для всех.
Нельзя вставить имя каждого в текст письма (например: "Здравствуйте, Иван").
$recipients = [...]; + Цикл отправкиТы создаёшь массив получателей, и каждому отправляешь отдельное письмо, например:
php$recipients = [
['email' => 'ivan@example.com', 'name' => 'Иван'],
['email' => 'olga@example.com', 'name' => 'Ольга'],
];
И дальше в цикле:
phpforeach ($recipients as $r) {
$mail->clearAddresses(); // очищаем предыдущий адрес
$mail->addAddress($r['email'], $r['name']);
$mail->Body = "Привет, {$r['name']}!";
$mail->send();
}
🔑 В этом случае:
Каждый получает СВОЁ письмо.
Можно вставить имя или другую персональную информацию.
Максимальная конфиденциальность (один адресат = одно письмо).
| Вопрос | addBCC | Персонально в цикле |
|---|---|---|
| Видят ли другие получателей? | ❌ Нет | ❌ Нет |
| Письмо одно и то же? | ✅ Да | ❌ Нет (может быть разное) |
| Можно персонализировать (имя и т.д.)? | ❌ Нет | ✅ Да |
| Один запрос к SMTP? | ✅ Да (один) | ❌ Нет (несколько, но можно KeepAlive) |
| Быстро работает? | ✅ Да | ❌ Медленнее, но гибче |
Если нужно просто отправить одно письмо многим, и не важно, чтобы было персонально — используй addBCC().
Если хочешь персонализировать текст или быть максимально аккуратным (например, для бизнес-рассылок) — используй массив $recipients и цикл с отправкой по одному.
Если хочешь — могу собрать шаблон с CSV или с HTML-шаблоном письма для персонализированной рассылки.