【问题标题】:phpmailer for each loop custom body每个循环自定义正文的 phpmailer
【发布时间】:2017-04-21 06:52:13
【问题描述】:

我正在通过 phpmailer 使用在线表单发送电子邮件,并尝试使用 for each 循环来自定义正文,特别是取消订阅按钮。我目前仅使用两封未加密的个人电子邮件进行测试。一旦它真正开始正常工作,我将添加加密。

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

这显然不是我想要的。当我进行测试并在空白页面上回显 for each 循环文本时,它会按应有的方式显示每个自定义取消订阅链接,每个电子邮件地址都有一个。

感谢任何帮助,如果您需要更多帮助,请告诉我。

根据答案创建的工作代码 主要问题是使用 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();
        }

【问题讨论】:

  • so.. 你是在 foreach 循环内还是之后发送邮件?因为如果您之后发送,您的正文和链接将根据上次迭代的电子邮件设置。如果您在 foreach 循环中发送它,则一定有其他您未共享的内容导致错误
  • @Cashbee 它正在发送。所以你的评论是有道理的。我刚刚在循环中使用 send() 再次尝试,但现在每个地址都会收到两封电子邮件,一封带有正确的电子邮件地址链接,另一封带有正确的电子邮件地址链接……我已将代码更新为我最初所做的。跨度>

标签: php email phpmailer


【解决方案1】:

我用$mailer-&gt;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()
 }

【讨论】:

    【解决方案2】:

    这就是密件抄送的工作方式 - 将同一封邮件发送给所有收件人。您需要向每个收件人发送单独的消息,如the mailing list example provided with PHPMailer 中所述。

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

    【讨论】:

    • 非常感谢您的回复,我知道一旦我看到您的名字,我会得到一个清晰而正确的答案。经过更多搜索后,我找到了您的示例,这确实很有帮助。我没有看到密件抄送问题,但现在有意义了。 PHPMailer 真的很棒。
    • 谢谢!官方 SO 喜欢包含代码的答案,但是对于流行的项目这样做会使维护变得更加困难,因为您最终会得到遍布各处的旧版本!
    【解决方案3】:

    您的方法不正确,因为您要发送“一个”邮件,其中有 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();
     }
    

    【讨论】:

    • 我认为这是不对的。我找到了this,它说不要每次都创建一个新的邮件。如果未在所有 phpmailer 设置之前调用,也会出现错误。
    • 我修正了答案
    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多