phpmailer为每个循环自定义正文

时间:2016-12-06 15:13:32

标签: php email 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("email1@example.com","email2@example.com");

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/unsubscribe.php?email=email1@example.com">Unsubscribe</a>

电邮至电邮地址2 正文看起来不错。

<a href="http://www.website.com/unsubscribe.php?email=email1@example.com">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();
        }

3 个答案:

答案 0 :(得分:1)

您的方法不正确,因为您正在发送&#34;一个&#34;有N个收件人的邮件,你必须在发送后使用addAddress和clearAddresses()

void Delete<T>(List<T> db, List<T> n, Func<T, T, bool> cond) // typed cond
{
    var deleted = db
        .Where(x => !n.Any(y => cond(x, y))) // Each T may have different property name? 
        .ToList();
    //....
}

答案 1 :(得分:1)

这是BCC的工作原理 - 向所有收件人发送相同的邮件。您需要向每个收件人发送单独的邮件,如the mailing list example provided with PHPMailer

中所述

为了提高效率,你应该在你的循环之前创建一个实例,遍历你的列表,同时为每条消息设置不同的主体(你拥有的代码很好,如果你想要更灵活,也许使用模板系统),发送消息,然后清除收件人列表,以便下一条消息只被发送到一个地址。它还有助于使用SMTP keepalive来提高吞吐量。示例脚本完成了大部分工作。

答案 2 :(得分:0)

我使用了$mailer->ClearAllRecipients()

<?php

foreach($subs_email as $email){
   $mailer->isHTML(true);
   $mailer->CharSet = 'UTF-8';
   $mailer->addAddress($email);
   $mailer->Body = '<div>This is the body text</div><a href="http://www.website.com/unsubscribe.php?email='.$email.'">Unsubscribe</a>';
   $mailer->send();
   $mailer->ClearAllRecipients()
 }