2016-12-06 73 views
1

我使用phpmailer在線表單發送電子郵件,並嘗試使用爲每個循環定製主體,特別是取消訂閱按鈕。我目前只使用我的兩封個人電子郵件,但沒有加密用於測試目的。一旦實際開始工作,我將添加加密,因爲它應該。phpmailer for each loop定製主體

我的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 @。

發郵件到郵件地址1: 正文文字看起來不錯。

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

電子郵件到郵箱地址2: 正文文本看起來不錯。

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

這顯然不是我想要的。當我測試並在空白頁面上回顯每個循環文本時,它會顯示每個自定義退訂鏈接,因爲它應該爲每個電子郵件地址一個。

任何幫助表示讚賞,並讓我知道如果你需要更多或。

工作的代碼基礎上創建的答案使用,而不是addAddress addBCC 主要問題

 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

你的方法,因爲您要發送「一」與你必須使用addAddress一個N收件人的郵件是不正確的, 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

我不認爲這是正確的。我發現[這](https://github.com/PHPMailer/PHPMailer/wiki/Sending-to-lists),它說每次都不會創建一個新的郵件程序。如果沒有在所有phpmailer設置之前調用,也會出現錯誤。 –

+1

確實,這是錯誤的。 – Synchro

+0

我修復了答案 – OsDev