PHPmailer - Multiple sending of e-mail

前端 未结 2 1720
无人及你
无人及你 2020-12-30 17:03

I am sending emails using PHPmailer. As of now, I am successful in sending email to one address. Now, I want to send multiple emails in just one click.

PROBL

相关标签:
2条回答
  • 2020-12-30 17:04

    Within your loop, create a clone of the $mail object - before you add the recipient and attachment - then use the clone to send the email. The next loop iteration will create a new clone free of the previous address and attachment:

    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 );
    
    }
    

    This will "clear" your per-iteration changes (like address, attachment, etc) without you having to reenter config properties (like, from, host, etc.)

    Addendum:

    Your attachments will likely be all the same because you're not fetching new results for these lines (within your loop):

    $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 will always return the same result because (I'm assuming) $_POST['depchair'] does not change - thus $input, $control, $ctrl, and $ctrl_no all remain (effectively) the same for each loop. You need to find whatever it is your actually intend to be the $ctrl_no for each loop - right now you're using the same one over and over.

    The following query could probably help:

    // 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'];
    

    This pulls both the student email address and their control_no in the same query, making sure they stay associated with each other through the loop. You can then get rid of the second mid-loop query, since all the results you need were pulled in the first out-of-loop query. The above isn't all the code you need to change, just the critical parts.

    0 讨论(0)
  • 2020-12-30 17:22

    After you send an email $mail->Send(), execute this:

    $mail->ClearAllRecipients();
    

    in your while loop.
    So your basic while loop structure looks like this:

    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
    
    }
    
    0 讨论(0)
提交回复
热议问题