ChatGPT сказал:
Создание рассылки с использованием PHPMailer — это популярный способ отправки email-сообщений с помощью PHP. Ниже приведён пошаговый пример, как настроить массовую email-рассылку через PHPMailer.
🔧 Шаг 1: Установка PHPMailer
Рекомендуется использовать Composer:
bashcomposer require phpmailer/phpmailer
Если Composer не используется, можно скачать PHPMailer с GitHub и подключить вручную.
📧 Шаг 2: Пример кода рассылки
php<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php'; // если используете Composer
// Список email-адресов получателей
$recipients = [
'user1@example.com',
'user2@example.com',
'user3@example.com',
// и т.д.
];
$mail = new PHPMailer(true);
try {
// Настройки сервера
$mail->isSMTP();
$mail->Host = 'smtp.example.com'; // SMTP-сервер
$mail->SMTPAuth = true;
$mail->Username = 'your_email@example.com'; // ваш логин
$mail->Password = 'your_password'; // ваш пароль
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// Отправитель
$mail->setFrom('your_email@example.com', 'Ваше Имя');
$mail->Subject = 'Тема письма';
$mail->isHTML(true);
$mail->Body = '<h1>Здравствуйте!</h1><p>Это тестовая рассылка.</p>';
// Отправка каждому получателю индивидуально
foreach ($recipients as $email) {
$mail->clearAddresses(); // очищает предыдущие адреса
$mail->addAddress($email);
$mail->send();
echo "Письмо отправлено: $email<br>";
}
} catch (Exception $e) {
echo "Ошибка при отправке: {$mail->ErrorInfo}";
}
✅ Советы
-
Не отправляйте слишком много писем сразу, иначе попадёте в спам или SMTP-сервер заблокирует вас. Используйте задержку или фоновые очереди (
cron,supervisor, очереди Laravel, и т.д.). -
Можно использовать
BCC, если хотите сэкономить на количестве SMTP-сессий, но это менее персонализировано. -
Убедитесь, что SMTP-провайдер разрешает массовые рассылки. У Gmail, например, есть ограничения.
-
Тестируйте на небольшом числе получателей.
🔒 SMTP от Gmail или Яндекс
Если вы используете Gmail:
-
Разрешите "ненадёжные приложения" или используйте OAuth2.
-
Или настройте "Пароль приложений".
Если хочешь, могу помочь:
-
Написать вариант с CSV-файлом со списком адресов.
-
Добавить вложения.
-
Сформировать персонализированное письмо (например, с именем получателя).
Нужно?
Вы сказали:
ChatGPT сказал:
Отлично! Давайте улучшим рассылку:
-
✅ Добавим отчётность по каждому письму: лог успеха/ошибки.
-
🎯 Добавим уникальный трекинг-пиксель: чтобы видеть, кто открыл письмо.
💡 Общая идея
-
В письме будет уникальный
id, например,?track_id=123abc. -
Мы будем логировать, кому что отправили и какой пиксель сгенерировали.
-
Создадим файл
track.php, который будет загружаться как<img src="track.php?track_id=...">— и логировать открытие письма.
📂 Структура файлов
luaproject/
├── send.php — рассылка писем
├── track.php — трекинг-пиксель
├── log.csv — лог отправки
└── open_log.csv — лог открытий
📧 send.php — рассылка с логом и трекинг-пикселем
php<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$recipients = [
['email' => 'user1@example.com', 'id' => uniqid()],
['email' => 'user2@example.com', 'id' => uniqid()],
['email' => 'user3@example.com', 'id' => uniqid()],
];
$logFile = fopen("log.csv", "a");
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'your_email@example.com';
$mail->Password = 'your_password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->setFrom('your_email@example.com', 'Ваше Имя');
$mail->isHTML(true);
$mail->Subject = 'Тестовая рассылка с трекингом';
foreach ($recipients as $user) {
$email = $user['email'];
$trackId = $user['id'];
$mail->clearAddresses();
$mail->addAddress($email);
// Уникальный пиксель
$trackingPixel = '<img src="https://yourdomain.com/track.php?track_id=' . $trackId . '" width="1" height="1" style="display:none;">';
$mail->Body = "<h1>Здравствуйте!</h1><p>Это письмо с уникальным трекингом.</p>$trackingPixel";
try {
$mail->send();
echo "Отправлено: $email<br>";
fputcsv($logFile, [$email, $trackId, date('Y-m-d H:i:s'), 'OK']);
} catch (Exception $e) {
echo "Ошибка при отправке $email: {$mail->ErrorInfo}<br>";
fputcsv($logFile, [$email, $trackId, date('Y-m-d H:i:s'), 'ERROR', $mail->ErrorInfo]);
}
}
fclose($logFile);
} catch (Exception $e) {
echo "Ошибка SMTP: {$mail->ErrorInfo}";
}
👁️ track.php — лог открытия письма
php<?php
$trackId = $_GET['track_id'] ?? null;
if ($trackId) {
$log = fopen('open_log.csv', 'a');
fputcsv($log, [$trackId, $_SERVER['REMOTE_ADDR'], date('Y-m-d H:i:s')]);
fclose($log);
}
// Отдаем прозрачное изображение 1x1
header('Content-Type: image/gif');
echo base64_decode(
'R0lGODlhAQABAPAAAP///wAAACwAAAAAAQABAAACAkQBADs='
);
exit;
📊 Что вы получаете:
-
log.csv— лог отправки писем (email, track_id, время, статус). -
open_log.csv— лог открытия писем (track_id, IP, время). -
Уникальный
<img>в каждом письме для трекинга.
🚀 Дополнительно можно:
-
Связать
track_idс email через базу данных. -
Добавить счётчик повторных открытий.
-
Добавить параметры
utm_в ссылки (для Google Analytics).
Хочешь вариант с базой данных вместо CSV или лог в Telegram?
Вы сказали:
ChatGPT сказал:
Да, запустить send.php через командную строку (cmd в Windows или терминал в Linux/Mac) — это нормальная и часто используемая практика, особенно для долгих рассылок, где веб-сервер может «отвалиться» из-за таймаута.
✅ Как запустить send.php из командной строки
1. Убедитесь, что PHP добавлен в PATH
В командной строке введите:
bashphp -v
Если видите версию PHP — всё ок. Иначе нужно добавить PHP в переменную окружения PATH.
2. Запуск скрипта:
bashphp send.php
Если вы находитесь не в той директории:
bashphp путь\к\файлу\send.php
Пример:
bashphp C:\xampp\htdocs\mailer\send.php
или в Linux/macOS:
bashphp /var/www/html/mailer/send.php
⏳ Как сделать так, чтобы выполнялся долго и стабильно
💡 Советы:
-
Отключите лимиты времени:
В началеsend.phpдобавьте:phpset_time_limit(0); // Отключить лимит выполнения ignore_user_abort(true); // Продолжать, даже если пользователь закрыл соединение -
Добавьте паузы между письмами:
phpsleep(2); // 2 секунды между письмами -
Запускайте в фоне (для Windows):
cmdstart /B php send.phpДля Linux:
bashnohup php send.php > out.log 2>&1 &Это запустит скрипт в фоне и запишет вывод в
out.log. -
Логируйте всё в файл, а не только на экран (как у вас через
fputcsv).
🛠️ Резюме
| Среда | Команда запуска | Особенности |
|---|---|---|
| Windows | php send.php | Через cmd.exe |
| Windows | start /B php send.php | В фоне, без открытия окна |
| Linux | php send.php | Прямой запуск |
| Linux | nohup php send.php & | В фоне, не останавливается при выходе |
Хочешь, я помогу тебе создать версию скрипта, где всё полностью логируется в файл и работает по очереди, например — читая адреса из CSV и отправляя по 100 писем за раз с паузами?