Вы сказали:
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().
Локальную часть с кириллицей лучше не использовать (она редко поддерживается).
Если хочешь — могу помочь полностью адаптировать твой код под эту проверку.