【问题标题】:PHPmailer - Multiple sending of e-mailPHPmailer - 多次发送电子邮件
【发布时间】:2014-04-14 12:17:14
【问题描述】:

我正在使用 PHPmailer 发送电子邮件。截至目前,我已成功向一个地址发送电子邮件。现在,我想一键发送多封电子邮件。

问题:我尝试使用下面的一些循环发送多封电子邮件,但输出错误。是的,它只向一个地址发送电子邮件,并且该电子邮件地址正在获取所有应该通过电子邮件发送到其他电子邮件的电子邮件。

例如,当我发送 17 封电子邮件时,这 17 封电子邮件只会发送到一个地址。 邮件应根据数据库中的地址发送,并带有相应的唯一附件。示例:abc@gmail.com 应附加 abc.pdf,123@gmail.com 应附加 123.pdf。

我认为它在循环中。请帮我弄清楚。谢谢。

require_once('phpmailer/class.phpmailer.php');
include("phpmailer/class.smtp.php"); 

$mail             = new PHPMailer();

$body             = file_get_contents('phpmailer/body.html');
$body             = preg_replace('/\/b]/','',$body);

$file ='phpmailer/mailpass.txt';
    if($handle = fopen($file,"r")){
        $contentpass = fread($handle,'15');
        fclose($handle);
        }

$mail->IsSMTP(); 
$mail->Host       = "smtp.gmail.com"; 
$mail->SMTPDebug  = 1;                   

$mail->SMTPAuth   = true;                  
$mail->SMTPSecure = "tls";                 
$mail->Host       = "smtp.gmail.com";      
$mail->Port       = 587;                   
$mail->Username   = "email@gmail.com";  
$mail->Password   = $contentpass;           

$mail->SetFrom("email@gmail.com", "Subject");

$mail->AddReplyTo("email@gmail.com","Subject");

$mail->Subject    = "Subjects";

$mail->AltBody    = "Subject";

$mail->MsgHTML($body);


$file='current_schoolyear.txt';
    if($handle = fopen($file,"r"))
    {
        $content = fread($handle,'9');
            fclose($handle);
    }



$input = addslashes($_POST['depchair']);                        


$email = "select email_address  from sa_student where schoolyear = '$input'"; 



if ($p_address=mysql_query($email))
{ 



  while($row = mysql_fetch_assoc($p_address))
  {



    $mail->AddAddress($row['email_address']);

    $input = addslashes($_POST['depchair']);                                                                                    

    $control = "select control_no  from sa_student where schoolyear = '$input'";

    if($ctrl=mysql_query($control)){

        $ctrl_no = mysql_result($ctrl, 0);


        $mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf");  


    }
    else
    {

        echo "No attached document.";

    }

            if(!$mail->Send()) {
                    $message = "<div class=\"nNote nFailure\" >
                                    <p>Error sending email. " . $mail->ErrorInfo ."</p>
                                </div>";

            } else { 
                    $message = "<div class=\"nNote nSuccess\" >
                                    <p> Email have been sent to the examinees in ".$input_depchair. "! </p>
                                </div>";                            

                        }



       }

    }



else
{
    echo (mysql_error ());
}

更新的代码: 运行下面的代码后,我能够发送一封电子邮件并带有正确的附件。但是,只发送了一封电子邮件(数据库中的最后一个电子邮件地址),其余的电子邮件都没有发送。

$input = addslashes($_POST['depchair']);                        


$email = "select email_address, control_no  from sa_student where schoolyear = '$input'"; 



if ($p_address=mysql_query($email))
{ 



  while($row = mysql_fetch_assoc($p_address))
  {

    $cloned = clone $mail;

    $cloned->AddAddress($row['email_address']);




        $cloned->AddAttachment("fpdf/pdf_reports/document/".$row['control_no'].".pdf");  




            if(!$cloned->Send()) {
                    $message = "<div class=\"nNote nFailure\" >
                                    <p>Error sending email. " . $mail->ErrorInfo ."</p>
                                </div>";

            } else { 
                    $message = "<div class=\"nNote nSuccess\" >
                                    <p> Email have been sent to the examinees in ".$input_depchair. "! </p>
                                </div>";                            

                        }
unset( $cloned );


       }

    }



else
{
    echo (mysql_error ());
}

【问题讨论】:

  • 旁注:from sa_student y where 不是 Kosher 这里的东西 y 是错字,或者你在这两种情况下都忘记了什么?点还是逗号?
  • 我已经编辑过了。谢谢。

标签: php mysql email sendmail phpmailer


【解决方案1】:

在您的循环中,创建$mail 对象的克隆 - 在添加收件人和附件之前 - 然后使用克隆发送电子邮件。下一次循环迭代将创建一个没有先前地址和附件的新克隆:

while($row = mysql_fetch_assoc($p_address)) {

    $cloned = clone $mail;

    $cloned->AddAddress($row['email_address']);

    // add attchment to $cloned, etc.

    if ( $cloned->send() ) { /* etc */ }

    unset( $cloned );

}

这将“清除”您的每次迭代更改(例如地址、附件等),而无需您重新输入配置属性(例如、发件人、主机等)

附录:

您的附件可能都是一样的,因为您没有为这些行获取新结果(在您的循环中):

$input=addslashes($_POST['depchair']);

$control = "select control_no  from sa_student where schoolyear = '$input'";

if ($ctrl=mysql_query($control)) {

    $ctrl_no = mysql_result($ctrl, 0);

    $mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf");

}

$ctrl_no 将始终返回相同的结果,因为(我假设)$_POST['depchair'] 不会改变 - 因此$input$control$ctrl$ctrl_no 都保持(有效)相同对于每个循环。您需要为每个循环找到您真正打算成为 $ctrl_no 的任何内容 - 现在您一遍又一遍地使用同一个。

以下查询可能会有所帮助:

// replace
// $email = "select email_address  from sa_student where schoolyear = '$input'";

// with:
$students_query = "select email_address, control_no from sa_student where schoolyear = '$input'";

// then
// if ($p_address=mysql_query($email)) {
// while($row = mysql_fetch_assoc($p_address)) {

// becomes
if ( $students=mysql_query($students_query) ) {
while ( $row = mysql_fetch_assoc( $students ) ) {

// so that finally, etc
$cloned->AddAddress($row['email_address']);
$ctrl_no = $row['control_no'];

这会在同一个查询中同时提取学生电子邮件地址和他们的 control_no,确保它们通过循环保持相互关联。然后,您可以摆脱第二个循环中查询,因为您需要的所有结果都在第一个循环外查询中提取。以上不是您需要更改的所有代码,只是关键部分。

【讨论】:

  • 您好,发送邮件成功,但邮件附件相同。它应该是独一无二的。
  • 如果您将正确的文件附加到$cloned不是 $mail),那么没有理由它应该是所有电子邮件的相同附件。要么您仍在将其附加到 $mail,要么您的 $ctrl_no = mysql_result($ctrl, 0); 行没有产生独特的结果
  • 数据库中的control_no是唯一的。我认为这是我获取它的方式。你知道怎么做吗?
  • 它不起作用。现在所有电子邮件都包含所有附件。就像一封电子邮件现在有 17 个附件。
  • 可能的罪魁祸首是您仍在使用$mail-&gt;AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf"); 而不是$cloned-&gt;AddAttachment... 到目前为止,所有更改可能最好发布对您的代码的更新,以便更容易跟踪。
【解决方案2】:

在您发送电子邮件$mail-&gt;Send() 后,执行以下操作:

$mail->ClearAllRecipients();

在你的 while 循环中。
所以你的基本 while 循环结构如下所示:

while($row = mysql_fetch_assoc($p_address)){

    $mail->AddAddress($row['email_address']);
    $mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf");
    $mail->send();
    $mail->ClearAllRecipients(); 
    $mail->ClearAttachments();   //Remove all attachements

}

【讨论】:

  • 嘿!有效!但是,电子邮件应具有唯一的附件。目前,电子邮件具有相同的附件。
  • 哦,我的错,如果您有独特的附件,那么第二种方法将不起作用。生病编辑我的答案
  • @user3404474 现在呢?当你删除附件时
  • 还是一样,还是不行。这些电子邮件只有一个附件。
  • 还是谢谢你。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多