Вы сказали:
phpmailer отправить копию письма Приходящая запись строки mail1@mail.com, mail2@mail2.ru .. и т.д.
Если у вас есть строка с несколькими email-адресами, разделёнными запятыми, например:
php$mailList = "mail1@mail.com, mail2@mail2.ru, mail3@mail3.com";
И вы хотите отправить копию письма (CC) всем этим адресам через PHPMailer, то нужно:
Разбить строку на массив адресов.
Добавить каждого адресата как CC с помощью $mail->addCC().
Пример кода:
phpuse PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
// Настройки SMTP и от кого
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'secret';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->setFrom('from@example.com', 'Mailer');
$mail->addAddress('primary@example.com', 'Primary Recipient'); // Основной получатель
// Строка с копиями
$ccList = "mail1@mail.com, mail2@mail2.ru, mail3@mail3.com";
// Разбиваем строку на массив, убираем пробелы
$ccArray = array_map('trim', explode(',', $ccList));
// Добавляем каждого в копию
foreach ($ccArray as $ccEmail) {
if (filter_var($ccEmail, FILTER_VALIDATE_EMAIL)) {
$mail->addCC($ccEmail);
}
}
$mail->Subject = 'Тема письма';
$mail->Body = 'Текст письма';
$mail->send();
echo 'Письмо отправлено';
} catch (Exception $e) {
echo "Письмо не отправлено. Ошибка: {$mail->ErrorInfo}";
}
Используем explode(',', $ccList) для разбивки.
array_map('trim', ...) для удаления пробелов.
Проверяем валидность email через filter_var.
Для каждого валидного адреса вызываем $mail->addCC().
Если нужно отправлять копию письма (CC) — этот метод подходит.
Если же нужно слать отдельные письма каждому — тогда нужно делать цикл и вызывать send() для каждого адреса отдельно.
Если хочешь — могу помочь с этим!
Да, конечно! В примере, который я дал, уже есть проверка валидности email с помощью функции PHP filter_var() и фильтра FILTER_VALIDATE_EMAIL.
Вот как это выглядит в коде:
phpforeach ($ccArray as $ccEmail) {
if (filter_var($ccEmail, FILTER_VALIDATE_EMAIL)) {
$mail->addCC($ccEmail);
}
}
Этот блок проверяет каждый адрес в массиве ccArray и добавляет в копию только те, которые проходят проверку валидности.
Если хотите — могу показать, как добавить уведомление или лог, если в списке попался невалидный email, чтобы видеть такие ошибки. Например:
phpforeach ($ccArray as $ccEmail) {
if (filter_var($ccEmail, FILTER_VALIDATE_EMAIL)) {
$mail->addCC($ccEmail);
} else {
error_log("Невалидный email в копии: $ccEmail");
}
}
Хочешь сделать так?
Отличный вопрос!
Стандартная функция PHP filter_var($email, FILTER_VALIDATE_EMAIL) не поддерживает корректную проверку email с кириллическими символами (например, в локальной части адреса или в домене, если это не Punycode).
Если почта содержит кириллицу в домене (например, юзер@пример.рф), то домен должен быть преобразован в Punycode.
Для этого можно использовать функцию idn_to_ascii() из расширения intl.
Если кириллица в локальной части (до @), то это уже вне стандартного формата, и такие адреса могут не поддерживаться многими серверами.
phpfunction isValidEmailWithIDN($email) {
$parts = explode('@', $email);
if (count($parts) != 2) {
return false;
}
$local = $parts[0];
$domain = $parts[1];
// Конвертируем домен в ASCII (Punycode)
$asciiDomain = idn_to_ascii($domain, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
if ($asciiDomain === false) {
return false;
}
// Формируем email с ASCII-доменом
$asciiEmail = $local . '@' . $asciiDomain;
// Проверяем стандартной функцией
return filter_var($asciiEmail, FILTER_VALIDATE_EMAIL) !== false;
}
И дальше используем в цикле:
phpforeach ($ccArray as $ccEmail) {
if (isValidEmailWithIDN($ccEmail)) {
$mail->addCC($ccEmail);
} else {
error_log("Невалидный email в копии: $ccEmail");
}
}
filter_var не умеет работать с кириллическими доменами напрямую.
Нужно преобразовывать домен в Punycode через idn_to_ascii().
Локальную часть с кириллицей лучше не использовать (она редко поддерживается).
Если хочешь — могу помочь полностью адаптировать твой код под эту проверку.
Если придёт один почтовый ящик без запятой, например:
php$mailList = "mail1@mail.com";
то функция explode(',', $mailList) всё равно сработает и вернёт массив с одним элементом:
php['mail1@mail.com']
То есть всё будет работать корректно — почта попадёт в массив, проверится на валидность и добавится в копию.
php$ccList = "mail1@mail.com"; // без запятой
$ccArray = array_map('trim', explode(',', $ccList)); // ['mail1@mail.com']
foreach ($ccArray as $ccEmail) {
if (filter_var($ccEmail, FILTER_VALIDATE_EMAIL)) {
$mail->addCC($ccEmail);
} else {
error_log("Невалидный email в копии: $ccEmail");
}
}
В итоге:
В $ccArray будет один элемент.
Email пройдет проверку и добавится в копию.
php$ccList = "";
то explode(',', $ccList) вернёт массив с одним пустым элементом:
php['']
и проверка:
phpfilter_var('', FILTER_VALIDATE_EMAIL)
вернёт false, и в копию ничего не добавится — это тоже нормально.
В общем, такой подход универсален и безопасен для 1 и нескольких email-адресов, разделённых запятой, и даже для пустой строки.
Отличный вопрос!
Да, вы можете абсолютно так же использовать $mail->addBCC() вместо $mail->addCC(), если вы хотите отправить скрытую копию (Blind Carbon Copy).
addCC() и addBCC():| Метод | Видно получателям? | Используется для? |
|---|---|---|
addCC() | ✅ Видно всем | Открытая копия |
addBCC() | ❌ Не видно другим | Скрытая копия |
addBCC():php$ccList = "mail1@mail.com, mail2@mail.ru, кириллица@домен.рф";
// Разбиваем и очищаем
$ccArray = array_map('trim', explode(',', $ccList));
foreach ($ccArray as $ccEmail) {
if (isValidEmailWithIDN($ccEmail)) {
$mail->addBCC($ccEmail);
} else {
error_log("Невалидный email в BCC: $ccEmail");
}
}
Здесь мы используем ту же функцию
isValidEmailWithIDN(), чтобы корректно обрабатывать адреса с кириллицей в домене.
addBCC():Когда вы не хотите раскрывать список получателей другим адресатам.
Когда вы рассылаете письма нескольким людям по одному (например, рассылка).
При соблюдении политики конфиденциальности.
Если вы используете только BCC и не указываете основного получателя (addAddress()), некоторые SMTP-серверы могут отклонить письмо.
Решение: добавьте фиктивного получателя в addAddress() — например, самого себя:
php$mail->addAddress('noreply@вашдомен.ru');
addBCC() отлично работает для скрытых получателей.
Логика с разбором строки и валидацией email остаётся такой же.
Только не забывайте указывать хотя бы одного "основного" получателя (через addAddress()), иначе письмо может быть не отправлено.
Хочешь, покажу полный рабочий пример с BCC и поддержкой кириллических email-доменов?
Да, всё верно — функция isValidEmailWithIDN() корректно обработает как латинские, так и кириллические email-адреса, но с некоторыми важными уточнениями:
Обычные email-адреса (латиница):
textuser@example.com
Email с кириллическим доменом (после @):
textuser@пример.рф → Преобразуется в Punycode → user@xn--e1afmkfd.xn--p1ai
Email-адреса с кириллицей в локальной части (до @), например:
textюзер@example.com ❌
Такие адреса теоретически допустимы по современному стандарту (EAI — Email Address Internationalization), но:
Не поддерживаются большинством SMTP-серверов.
filter_var()считает их невалидными.
isValidEmailWithIDN():phpfunction isValidEmailWithIDN($email) {
$parts = explode('@', $email);
if (count($parts) != 2) {
return false;
}
$local = $parts[0];
$domain = $parts[1];
// Преобразуем кириллический домен в Punycode
$asciiDomain = idn_to_ascii($domain, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
if ($asciiDomain === false) {
return false;
}
// Собираем email с ASCII-доменом
$asciiEmail = $local . '@' . $asciiDomain;
// Валидируем email с помощью filter_var
return filter_var($asciiEmail, FILTER_VALIDATE_EMAIL) !== false;
}
| Результат | |
|---|---|
| user@example.com | ✅ Валиден |
| user@пример.рф | ✅ Валиден (через Punycode) |
| юзер@example.com | ❌ Не валиден |
| user@xn--e1afmkfd.xn--p1ai | ✅ Валиден |
Функция isValidEmailWithIDN() работает и с латиницей, и с кириллицей в домене.
Не поддерживает кириллицу в имени пользователя (до @), как и большинство систем.
Это надёжный способ валидации email в проектах, где могут быть IDN-домены.
Если нужно, могу дополнить функцию логированием ошибок или поддержкой исключений.
Хороший вопрос.
Адрес вида:
swiftпочта@почта.ру
содержит кириллицу и в локальной части (до @), и в домене (после @).
| Часть | Содержит | Поддержка |
|---|---|---|
Локальная часть (почта) | Кириллица | ❌ Почти нигде не поддерживается |
Домен (почта.ру) | Кириллица | ✅ Поддерживается через Punycode |
почта@почта.ру — ❌ НЕ будет считаться валидным для большинства серверов и валидаций (filter_var() вернёт false), потому что:
Локальная часть с кириллицей (юзернейм) требует поддержки стандарта EAI (Email Address Internationalization).
Такие адреса не поддерживаются большинством почтовых серверов, библиотек (включая PHPMailer), и часто просто не доставляются.
Стандарт EAI допускает использование Unicode (в т.ч. кириллицы) в обеих частях email.
Однако почти никакие SMTP-серверы, особенно массовые (Gmail, Mail.ru, Yandex и т.д.), этого не поддерживают.
PHPMailer (и другие библиотеки) тоже не поддерживают EAI из коробки.
Рекомендовать пользователям использовать email в латинице в локальной части.
Например:
kotlinuser@почта.ру ✅
Если вы работаете с почтовыми адресами, где ожидается кириллица в локальной части — лучше отказаться от автоматической отправки писем на них.
С функцией isValidEmailWithIDN() адрес почта@почта.ру будет считаться невалидным, потому что filter_var() на финальном шаге вернёт false.
Это правильно и безопасно.
почта@почта.ру — формально допустим, но в реальности не поддерживается.
Использовать такие адреса для отправки писем — не рекомендуется.
Валидация через isValidEmailWithIDN() отсекает такие случаи — это хорошо.
Если хочешь, могу предложить вариант, где таким адресам можно просто показывать предупреждение пользователю.