отправлять несколько писем в PHP - PullRequest
0 голосов
/ 26 марта 2019

У меня проблема с моим кодом, я пытаюсь отправить несколько писем разным пользователям, но он отправляет почту только на первое письмо в моем списке писем.

Может кто-нибудь помочь мне найтигде находится проблема?

    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 ]

4 голосов
/ 26 марта 2019

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 голос
/ 26 марта 2019

вы возвращаетесь внутрь цикла foreach, он будет возвращать ответ в самой первой итерации, поэтому другие электронные письма не будут обрабатываться.

1 голос
/ 26 марта 2019

Когда вы звоните 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, когда хотя бы одно письмо было отправлено правильно, или только когда было отправлено all , и измените эту переменную на основе этого условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...