2016-12-06 9 views
1

Ich sende E-Mails mit einem Online-Formular über phpmailer und versuchen, eine für jede Schleife zu verwenden, um den Körper speziell für eine Schaltfläche zum Abbestellen anzupassen. Ich verwende derzeit nur zwei meiner persönlichen E-Mails ohne Verschlüsselung für Testzwecke. Ich werde die Verschlüsselung hinzufügen, sobald dies tatsächlich so funktioniert, wie es sollte.phpmailer für jede Schleife benutzerdefinierten Körper

Mein PHP-Code:

$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; 
} 

eine Änderung des Codes über die E-Mail verwenden sendet (bcc) an die beiden E-Mails im Array aber alle E-Mails wird die gleiche Abmelde-Link/E-Mail-Adresse. Hinweis email1 @ wird beide Male verwendet.

Email an E-Mail-Adresse 1: Textkörper sieht gut aus.

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

E-Mail an E-Mail-Adresse 2: Body text sieht gut aus.

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

Das ist offensichtlich nicht das, was ich will. Wenn ich Tests teste und einfach den Text für jede Schleife auf einer leeren Seite ausspreche, wird jeder benutzerdefinierte Abmeldungslink für jede E-Mail-Adresse angezeigt.

Jede Hilfe wird geschätzt, und lassen Sie mich wissen, ob Sie mehr benötigen oder.

Arbeits Code erstellt basierend auf Antwort Haupt Problem wurde mit addBcc statt 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

also .. senden Sie die Mail innerhalb der foreach-Schleife oder nach? denn wenn Sie es nachher senden, werden Ihr Körper und der Link entsprechend der letzten wiederholten E-Mail gesetzt. Wenn Sie es innerhalb der foreach-Schleife senden, muss es etwas anderes geben, das Sie nicht freigegeben haben, das den Fehler verursacht – Cashbee

+0

@Cashbee Es sendet nach. Also macht dein Kommentar Sinn. Ich habe es gerade noch einmal mit der send() in der Schleife versucht, aber jetzt bekommt jede Adresse zwei E-Mails, eine mit dem richtigen E-Mail-Adresse-Link und eine mit der anderen ... Ich habe meinen Code auf das aktualisiert, was ich ursprünglich gemacht habe. –

Antwort

1

Dies ist, wie BCC funktioniert gesendet. Sie müssen eine separate Nachricht an jeden Empfänger senden, wie in the mailing list example provided with PHPMailer beschrieben.

Aus Effizienzgründen sollten Sie eine einzelne Instanz vor Ihrer Schleife erstellen, über Ihre Liste iterieren, während Sie den Text für jede Nachricht anders einstellen (der Code ist in Ordnung, wenn Sie mehr Flexibilität wünschen, vielleicht ein Templating-System), Senden Sie die Nachricht und löschen Sie die Empfängerliste, sodass die nächste Nachricht nur an eine Adresse gesendet wird. Es hilft auch, SMTP-Keepalive zu verwenden, um den Durchsatz zu erhöhen. Das Beispielskript erledigt das meiste.

+1

Vielen Dank für die Antwort, ich wusste, dass ich eine klare und korrekte Antwort bekommen würde, sobald ich Ihren Namen sah. Ich fand dein Beispiel nach einigem Suchen und es hat mir sehr geholfen. Ich habe das BCC-Problem nicht gesehen, aber es macht jetzt Sinn. PHPMailer ist wirklich großartig. –

+0

Danke! Offiziell mag SO Antworten auf den Code, aber wenn man das für beliebte Projekte macht, ist es schwieriger zu pflegen, weil man alte Versionen erhält, die überall verteilt sind! – Synchro

1

Ihr Ansatz es falsch ist, weil Sie „eins“ senden mit einem N Empfänger Mail, die Sie verwenden, um addAddress und die gleiche Nachricht an alle Empfänger gesendet - clearAddresses() nach

<?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

Ich glaube nicht, dass das richtig ist. Ich fand [das] (https://github.com/PHPMailer/PHPMailer/wiki/Sending-to-lists), das sagte, um nicht jedes Mal einen neuen Mailer zu schaffen. Das gibt auch einen Fehler wenn nicht vor allen phpmailer Einstellungen aufgerufen wird. –

+1

In der Tat, das ist falsch. – Synchro

+0

Ich reparierte die Antwort – OsDev