【问题标题】:PHPMailer Foreach LoopPHPMailer Foreach 循环
【发布时间】:2012-01-17 02:39:36
【问题描述】:

我目前正在使用 PHPMailer,它从上传的 .txt 文件中获取电子邮件地址列表。当前系统运行良好,但我正在尝试添加一个跟踪系统以查看是否查看了电子邮件。

我们通过在每封电子邮件中添加一张图片来做到这一点,当通过 php 查看更新时,我们会知道该电子邮件已被查看。

目前我们的 PHPMail 看起来像这样,

foreach ($email_addresses as $line_num => $line) {
            $ismatch = preg_match('/^[\s,]+$/',$line);
            $isvalid = preg_match('/^[^@]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$/', trim($line));

            // found a blank line, ignore
            if($ismatch)
                echo "";

            // found an invaid email address, add to string
            else if($isvalid==0)
                $strInvalidEmailAddresses .= $line. '<br />';

            // no issues, add to BCC
            else{
                $mail->addBCC($line,$line); 
            }
}

当前系统将每封电子邮件添加到密件抄送。我希望将每封电子邮件发送到每个单独的地址,而无需密件抄送。

当我在 HTML 电子邮件末尾尝试此图像时遇到了问题。

$track_image = '<img src="http://domain.com/email_test/email_beacon.php?campaign='.$intCampaignID.'&email='.$line.'" alt="" />';

$mail->MsgHTML($html_page.$track_image);

每当我尝试包含跟踪图像时,$line(或电子邮件)总是相同的,但我需要根据 .txt 文件中的电子邮件进行更改。

【问题讨论】:

  • 请记住,大多数电子邮件客户端(基于 Web/桌面)默认阻止加载远程内容。
  • 我理解这一点,并不是说这是 100% 的解决方案,但它至少会让我们知道其中一些人。

标签: php foreach phpmailer


【解决方案1】:

您可以执行以下操作,而不是使用密件抄送:

... initialize PHP mailer ...
... set options common to ALL emails ...
foreach( ... loop over all recipients ...) {
    $mail->ClearAddresses(); // remove previous email addresses
    $mail->AddAddress($new_recipient_here);
    $mail->Body = <<<EOL
... customized html here
<img src="http://domain.com/email_test/email_beacon.php?campaign={$intCampaignID}&email={$address}" alt="" />
... more html here
EOL;

    $mail->send();
}

【讨论】:

  • 谢谢。我的 .txt 文件有 2 封电子邮件供我测试。文件中的最后一封电子邮件收到两封电子邮件,第一封按原样发送。我认为这是因为 $mail->send();但删除它只会将电子邮件发送到文件中的最后一个。我不确定为什么会这样
【解决方案2】:

使用ClearAllRecipients() 清除在 TO、CC 和 BCC 数组中分配的所有收件人。它返回 void。

【讨论】:

    【解决方案3】:

    第二个问题只是一个被遗忘的 $ - 看起来您当前的示例会引发解析错误。应该是:

    $mail->MsgHTML($html_page.$track_image);
    

    为了发送单独的电子邮件,而不是发送一封带有一堆密件抄送的电子邮件,您需要每次在循环内创建一个新的 $mail 对象,而不是将它们全部附加到单个 $mail 对象中已经在循环外定义了。

    【讨论】:

    • 我原来的文件上确实有$,但是当我把它放在这里时,不小心把它删除了。
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2016-09-26
    • 2012-07-19
    • 2020-02-19
    • 2012-12-08
    相关资源
    最近更新 更多