как отправить ссылку для отказа от подписки с уникальным идентификатором получателям с помощью phpmailer

Я использую phpmailer для рассылки информационных бюллетеней некоторым подписчикам. Каждый подписчик является частью «Категории». Перед отправкой я сначала выбираю категорию, к которой принадлежат подписчики. У каждого пользователя есть уникальный идентификатор $recipients_id. Что происходит: в приведенном ниже коде каждый пользователь получает все «ссылки для отказа от описания»; то же самое и с другими членами. И он должен получать отказ от подписки только со своим идентификатором:

// part of the script
$mail->IsHTML(true);                            //Sets message type to HTML             
$mail->Subject = "Newsletter";                  //Sets the Subject of the message
$mail->Body = $_POST["message"];
foreach($category_matches as $file) { // grab subscribers of the category
    // get data out of txt file     
    $lines = file($file, FILE_IGNORE_NEW_LINES); // set lines from matched file into an array
    $recipients_id = $lines[0]; //  id of recipients
    $recipients_name = $lines[2]; //  name of recipients
    $recipients_email = $lines[3]; //  email of the recipients                                  
    $mail->AddBCC($recipients_email, $recipients_name); //bcc to all subscribers of the category
    $mail->Body .= '<a href="http://example.com/newsletter/unsubscribe.php?id='.$recipients_id.'">Unsubscribe</a>'; //unsubscribe anchor    

    echo $recipients_id.'<br />'; // this echos me the id's of the subscribers in the category to check only 


}

if($mail->Send())           //Send an Email. Return true on success or false on error
{
    $result = '<div class="alert alert-success">Newsletter sent to subscribers of:<b> '.$recipients_category.'</b></div>';
}
else
{
    $result = 'div class="alert alert-danger">There is an Error</div>';
}

person john    schedule 20.12.2019    source источник
comment
Вы не сможете этого сделать, если добавите всех получателей в качестве скрытой копии для одного и того же электронного письма, поскольку все они получат одно и то же письмо. Если вы хотите, чтобы контент был разным для каждого пользователя, вам необходимо отправить их по одному и обновить контент (в данном случае ссылку) для каждого пользователя.   -  person Magnus Eriksson    schedule 20.12.2019
comment
Что сказал Магнус, а также взгляните на пример списка рассылки, предоставленный с PHPMailer, чтобы узнать, как эффективно отправлять в список.   -  person Synchro    schedule 20.12.2019
comment
Хорошее объяснение и решение этой проблемы @Magnus Eriksson и Synchro. Спасибо   -  person john    schedule 20.12.2019


Ответы (1)


Согласно комментариям выше, ваш код должен быть примерно таким:

// part of the script
$mail->IsHTML(true);                            //Sets message type to HTML             
$mail->Subject = "Newsletter";                  //Sets the Subject of the message
foreach($category_matches as $file) { // grab subscribers of the category
    // get data out of txt file     
    $lines = file($file, FILE_IGNORE_NEW_LINES); // set lines from matched file into an array
    $recipients_id = $lines[0]; //  name of recipients
    $recipients_name = $lines[2]; //  name of recipients
    $recipients_email = $lines[3]; //  email of the recipients                              
    $mail->AddAddress($recipients_email, $recipients_name);     //Adds a "To" address

    try {
        $mail->Body = $_POST["message"].'<br /><br />'.'<a href="http://example.com/newsletter/unsubscribe.php?id='.$recipients_id.'">Unsubscribe</a>'; //unsubscribe anchor
        $mail->Send();  
        $result = '<div class="alert alert-success">Newsletter sent to subscribers of:<b> '.$recipients_category.'</b></div>';                  

    } catch (Exception $e) {
        $result = '<div class="alert alert-success">Mailer Error (' . htmlspecialchars($recipients_email) . ') ' . $mail->ErrorInfo . '</div>';
        $mail->smtp->reset(); // reset SMTP connection
    }

    $mail->clearAddresses(); // Clear all addresses for the next iteration

}

ПРИМЕЧАНИЕ: есть только 1 $mail->Body, который включает сообщение и ссылку unique_id для отказа от подписки. Свяжите эхо с переменной var $result и echo $result вне цикла; в противном случае вы получите их несколько раз для каждого отправленного получателя

person Jack Maessen    schedule 20.12.2019