用PHP发送多个邮件

时间:2019-03-26 09:27:53

标签: php email

我的代码有问题,我试图一次向不同的用户发送多封邮件,但它只将邮件发送到我的邮件列表中的第一封邮件。

有人可以帮我找到问题所在吗?

    function send_mails($filename, $from){
        $infos = combine_mails_to_passwords($filename);
        $headers = "MIME-Version: 1.0" . "\r\n";
        $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
        $headers .= "X-Mailer: PHP". phpversion() ."\r\n" ;
        $headers .= "From: '$from'" . "\r\n";
        foreach($infos as $key => $info){
            $to = $info;
            $subject = "TEST Mail";
            $message = "<h2 style='font-size:18px;'>
            Voici vos identifiants pour passer l'évaluation</h2> 
            <div style='text-align:center;'>
            <table><tr><td><u>Login: </u></td> <td><b> ".$_SESSION['login']."</b><td></tr><br/> 
            <tr><td><u>Votre Mot de Passe: </u></td> <td><b> ".$key."</b></td></tr></table></div>";
            $from = "From: Company Name <TEST>";

            $ok = mail($to,$subject,$message,$headers);
            return $ok;
    }
}

if(isset($_POST['send-submit'])){

        if (!empty($_FILES['fileToUpload']) && $_FILES['fileToUpload']['name']!=''){
            $file_path = $_FILES['fileToUpload']['tmp_name'];
            $from = $_POST['from'];
            if($from!=""){
            if($_FILES['fileToUpload']['type'] != 'text/plain'){
                $error = "The file is not a text file!";
            }
            else if(count_mails($file_path)==0){
                $error = "The file is empty!";
            }
            else{

                if(send_mails($file_path, checkInput($from))){
                    $good = "Mails sent!";
                }
                else{
                    $error = "Connexion Problem!";
                }

            }
        }
            else{
                $error = "Please enter the email of the sender!";
            }
    }
    else{
        $error = "You did not import the emails file!";
    }
}

注意:邮件是从文本文件上传的。 谢谢!

3 个答案:

答案 0 :(得分:4)

return $ok;是罪魁祸首...这意味着您的函数在第一次循环后便返回,因此其余函数将永远不会执行。

相反,您可能希望构建所有电子邮件尝试结果的列表,以便您可以查看哪些成功和失败。然后,您可以在循环结束后在函数的最后返回该列表。

类似的东西(未经测试):

function send_mails($filename, $from){

    $infos = combine_mails_to_passwords($filename);
    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    $headers .= "X-Mailer: PHP". phpversion() ."\r\n" ;
    $headers .= "From: '$from'" . "\r\n";

    $results = array(); //hold a list of results

    foreach($infos as $key => $info){
        $to = $info;
        $subject = "TEST Mail";
        $message = "<h2 style='font-size:18px;'>
        Voici vos identifiants pour passer l'évaluation</h2> 
        <div style='text-align:center;'>
        <table><tr><td><u>Login: </u></td> <td><b> ".$_SESSION['login']."</b><td></tr><br/> 
        <tr><td><u>Votre Mot de Passe: </u></td> <td><b> ".$key."</b></td></tr></table></div>";
        $from = "From: Company Name <TEST>";

        $results[$to] = mail($to,$subject,$message,$headers);
    }
    return $results;
}

和类似的东西可以处理结果并警告失败:

$results = send_mails($file_path, checkInput($from));
foreach($results as $email => $result)
{
  if ($result == false) echo "Alert: Email to $email failed<br/>";
}
echo "All mail sent successfully apart from any which are alerted above";

答案 1 :(得分:1)

return $ok循环中调用for时,实际上只发送一封邮件。这可能会有所帮助,因为在为所有元素运行循环之后它会返回一些信息:

function send_mails($filename, $from){
    $infos = combine_mails_to_passwords($filename);
    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    $headers .= "X-Mailer: PHP". phpversion() ."\r\n" ;
    $headers .= "From: '$from'" . "\r\n";
    foreach($infos as $key => $info){
        $to = $info;
        $subject = "TEST Mail";
        $message = "<h2 style='font-size:18px;'>
        Voici vos identifiants pour passer l'évaluation</h2> 
        <div style='text-align:center;'>
        <table><tr><td><u>Login: </u></td> <td><b> ".$_SESSION['login']."</b><td></tr><br/> 
        <tr><td><u>Votre Mot de Passe: </u></td> <td><b> ".$key."</b></td></tr></table></div>";
        $from = "From: Company Name <TEST>";

        $ok = mail($to,$subject,$message,$headers);
    }
    return $ok;
}

...但是它将仅返回上次发送邮件的状态。您应该定义是否要在至少正确发送一封邮件时或仅在全部发送后才返回true的方法,并根据该条件修改该变量。

答案 2 :(得分:1)

您将return返回到foreach循环中,它将在第一次迭代中返回响应,因此不会处理其他电子邮件。