当前位置: 首页 > 知识库问答 >
问题:

PHPmailer-多次发送电子邮件

单耘豪
2023-03-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 ());
}

共有2个答案

汲时铭
2023-03-14

在循环中,在添加收件人和附件之前,创建$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\u no将始终返回相同的结果,因为(我假设)$\u POST['dephair']不会更改-因此$input$control$ctrl$ctrl\u no对于每个循环都保持(有效)相同。对于每个循环,你需要找到你真正想要的$ctrl\u 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'];

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

穆俊哲
2023-03-14

发送电子邮件后,$mail-

$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

}

 类似资料:
  • 我使用的PHPMailer表格在这里找到。 从网站下载的示例是“接触-3”,在引导主题中使用PHPMailer通过gmail发送SMTP电子邮件。当我使用“接触-1”时,它完全适用于我的托管域电子邮件地址,但SMTP版本适用于gmail地址,联系人表单不会提交。 在下面的代码中,我更改了以下行以添加我的gmail地址和gmail密码: 任何关于使用给定信息进行此工作的帮助都将不胜感激-提前感谢!

  • 我正在使用PHPMailer通过联系人表单发送电子邮件。当我在输入字段中输入无效的电子邮件地址时,电子邮件仍会发送。我想同时执行客户端和服务器端验证。 PHPMailer是否有一个内置的验证系统来检查无效的电子邮件地址?如果输入的电子邮件无效,我想返回一个错误,而不是发送电子邮件。

  • 本文向大家介绍PHPMailer发送邮件,包括了PHPMailer发送邮件的使用技巧和注意事项,需要的朋友参考一下 PHPMailer是一个封装好的PHP邮件发送类,支持发送HTML内容的电子邮件,以及图片附件,前提要设置好邮件服务器就能实现邮件发送功能。 HTML 首先我们先放置一个收件箱的输入框和一个发送邮件按钮: 收件人: 以上所述是小编给大家介绍的PHPMailer发送邮件,希望对大家有所

  • 我正在尝试通过PHPMailer发送电子邮件,它工作得很好。只有一个问题,我不知道如何解决。有可能,我可能需要尝试发送电子邮件到一个无效的地址,因为一个不存在的域。因为域名不存在,所以这些电子邮件不会被发送也没关系。当我尝试发送电子邮件时,会收到一条错误消息,PHPMailer将停止,并且不会继续向其他(有效)地址发送电子邮件。有没有办法跳过那些无效的电子邮件并强制PHPMailer继续而不显示错

  • 我一直在用代表我的office365帐号发送SMTP邮件,工作了大概一个星期,然后突然不工作了,不知道怎么变了。 当我在PHPMailer中启用high debug logging时,我看到: SMTP- 这篇文章似乎是最相关的: 不接受来自服务器的身份验证:504 5.7.4无法识别的身份验证类型 以下是我交给PHPMailer的文字SMTP设置: 以及实际的PHP代码: 作为理智检查,我在中使

  • 我正在使用Google表单将多条消息合并到一个每日电子邮件中,使用脚本和每日定时触发器发送(代码从这里复制,下面是我的版本)。 例如,一个电子邮件地址是abc@example.co.uk,他们收到了电子邮件,但在我的收件箱(xyz@example.co.uk)中是发送到abc@example.co.uk的电子邮件,但不是转发的消息或回复。 有什么办法阻止这一切吗?