2016-12-06 2 views
1

Я отправляю электронные письма с помощью онлайн-формы через phpmailer и пытаюсь использовать для каждого цикла, чтобы настроить тело, в частности, для кнопки отмены подписки. В настоящее время я использую только два моих личных письма без шифрования для целей тестирования. Я добавлю шифрование, как только это действительно начнет работать так, как должно.phpmailer для каждого цикла пользовательского органа

Мой код PHP:

$mail = new PHPMailer; 

/*php mailer settings*/ 
//All settings for php mailer here - working fine, email sends 

/*for each loop to send bcc to each email and customize body*/ 

//array of emails - really loading from database with while loop 
$subs_email("[email protected]","[email protected]"); 

foreach ($subs_email as $email) { 
$mail->addBCC($email); 

$mail->Body = '<p>This is the body text</p><a href="http://www.website.com/unsubscribe.php?email='.$email.'">Unsubscribe</a>'; 
} 
if(!$mail->send()) { 
    echo 'Message could not be sent.'; 
    echo 'Mailer Error: ' . $mail->ErrorInfo; 
} 

Использование вариации выше электронной почты кода будет посылать (BCC) для двух писем в массиве, но все письма получат ту же отписки адрес ссылку/электронной почты. Примечание: email1 @ используется оба раза.

Email на адрес электронной почты 1: Текст кузова выглядит хорошо.

<a href="http://www.website.com/[email protected]">Unsubscribe</a> 

Отправить адрес электронной почты 2: текст тела хорошо выглядит.

<a href="http://www.website.com/[email protected]">Unsubscribe</a> 

Это, очевидно, не то, что я хочу. Когда я тестирую и просто выхожу за каждым текстом цикла на пустой странице, он показывает каждую настраиваемую ссылку на отмену подписки, как и следовало бы, по одному для каждого адреса электронной почты.

Любая помощь приветствуется, и дайте мне знать, если вам нужно больше или.

рабочий код создается на основе ответа Главный вопрос использования addBCC вместо addAddress

 foreach ($subs_email as $email) { 
      $mail->addAddress($email); 

      $mail->Body = '<p>This is the body text</p><a href="http://www.website.com/unsubscribe.php?email='.$email.'">Unsubscribe</a>'; 


      if (!$mail->send()) { 
       echo "Mailer Error" . $mail->ErrorInfo . '<br />'; 
       break; //Abandon sending 
      } 
      // Clear all addresses and attachments for next loop 
      $mail->clearAddresses(); 
     } 
+1

так .. вы отправляете почту в пределах цикла foreach или после? потому что, если вы его отправите, ваше тело и ссылка будут установлены в соответствии с последним повторным письмом. Если вы отправляете его в цикле foreach, должно быть что-то еще, что вы не разделили, что вызывает ошибку. – Cashbee

+0

@Cashbee Отправляется после. Таким образом, ваш комментарий имеет смысл. Я просто попробовал это снова с помощью send() в цикле, но теперь каждый адрес получает два сообщения электронной почты: один с правильным адресом электронной почты и один с другим ... Я обновил свой код до того, что я изначально делал. –

ответ

1

Это как BCC работает - то же самое сообщение отправлено всем получателям. Вам необходимо отправить отдельное сообщение каждому получателю, как описано в the mailing list example provided with PHPMailer.

Для эффективности вы должны создать единый экземпляр перед вашим циклом, перебирать по списку, а для каждого сообщения - по-разному настраивать тело (код у вас в порядке, если вы хотите больше гибкости, возможно, используете систему шаблонов) отправьте сообщение, затем очистите список получателей, чтобы следующее сообщение отправлялось только на один адрес. Это также помогает использовать SMTP keepalive для увеличения пропускной способности. Пример сценария делает большую часть этого.

+1

Большое спасибо за ответ, я знал, что получу четкий и правильный ответ, увидев ваше имя. Я нашел ваш пример после нескольких поисков, и это действительно помогло. Я не видел проблему BCC, но теперь это имеет смысл. PHPMailer поистине замечательный. –

+0

Спасибо! Официально SO любит ответы, чтобы включить код, но делать это для популярных проектов делает его сложнее поддерживать, потому что вы в конечном итоге со старыми версиями распространяются повсюду! – Synchro

1

Ваш подход это неправильно, потому что вы посылаете «один» почты с получателями N вы должны использовать addAddress и clearAddresses() после того, как послал

<?php 
foreach($subs_email as $email){ 
    $mail->addAddress($email); 
    $mail->Body = '<p>This is the body text</p><a href="http://www.website.com/unsubscribe.php?email='.$email.'">Unsubscribe</a>'; 
    $mail->send(); 
    $mail->clearAddresses(); 
} 
+1

Я не думаю, что это правильно. Я нашел [this] (https://github.com/PHPMailer/PHPMailer/wiki/Sending-to-lists), который сказал, что каждый раз не создает новую почтовую программу. Это также дает ошибку, если не вызывается перед всеми настройками phpmailer. –

+1

Действительно, это неправильно. – Synchro

+0

Я исправил ответ – OsDev

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