2016-09-08 4 views
1

Я работаю над приложением, которое извлекает письма клиентов из БД, хранит их в массиве, обрабатывает массив и отправляет электронное письмо каждому клиенту индивидуально.PHPMailer, отправляющий двойные электронные письма

Проблема возникла, когда PHPMailer отправляет двойное электронное письмо клиентам, а также в одном из полей электронной почты «в» и в одном из адресов электронной почты отправляется адрес получателя, а во втором письме также есть и другие электронные письма клиентов.

Я рассматриваю это как уязвимость.

Это мой код: $ array = [0 => '[email protected]', 1 => '[email protected]']; // Пример

foreach ($array as $key => $value) { 
    $mail->addAddress($value); 
    if (!$mail->send()) 
    { 
     throw new Exception($mail->ErrorInfo); 

    } else 
    { 
     $mail->addAddress(NULL); //Attempt to unset 
     header('Location: ../public/email.php'); //Redirect to start page 

    } 

} 

Так, чтобы подвести итог: Когда это будет работать, он посылает по электронной почте «[email protected]» и «[email protected]».

Первое электронное письмо получит один экземпляр электронной почты. Второе электронное письмо получит две копии одного и того же электронного письма, сначала показав себя получателем, а второе письмо с адресом электронной почты получателя и других клиентов.

Я тестировал это только с двумя получаемыми клиентами, и еще больше я предполагаю, что будет еще больше повторений. Спасибо, ребята!

+0

Я рекомендую посмотреть на [примере списка рассылки, снабженный PHPMailer] (https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps). – Synchro

ответ

2

Есть две проблемы:

  • Вы не вынимая адрес от почты, поэтому при добавлении второй, первый по-прежнему существует, и оба будут видеть другой адрес.
  • Вы используете перенаправление header в своем цикле, не прерывая свой скрипт. Это может вызвать код после запуска перенаправления, но нет гарантии, сколько и сколько времени.

Первая проблема, которую можно решить путем очистки получателей в конце цикла:

$mail->ClearAllRecipients(); 

Что касается второй проблемы, вы не должны перенаправлять в любом месте внутри цикла, и когда вы поменяете в конце концов сообщения были отправлены, вы должны выйти из своего сеанса, используя exit;, чтобы после этого ничего не выполнялось.

+1

Вы правы. Глупая ошибка с заголовком(). Спасибо, человек, который сработал. Не знаю для ** ClearAllRecipients() ** хотя :-) Еще раз спасибо! – fugitive

+0

@MilosM Добро пожаловать :-) – jeroen

0

Я думаю, что вы повторно используете $ value. Попробуйте использовать unset ($ value); посмотрите, помогает ли это. Вы также можете посмотреть here

Предупреждение референции $ значения, а последний элемент массива остаются даже после цикла Еогеаспа. Рекомендуется уничтожить его unset(). В противном случае вы будете испытывать следующее поведение:

Смежные вопросы