Search code examples
phpphpmailer

phpMailer mailing list don't send


I'm having problems sending emails with a mailing list, this is what i have now and no email are sended

 public function mailingList($email, $nome, $message){
    $destinatário = $this->getAllEmails();
    $mail = new PHPMailer;
    $mail->isSendmail();
    $mail->setFrom('[email protected]', 'Webmaster');
    $mail->IsHTML(true);
    $mail->Subject = 'Informação - XXXX';
    $mail->CharSet = 'UTF-8';
    $mail->Body = "
        <html>
        <head>
            <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
        </head>
        <body>
            <h1>Mensagem da Administração</h1>
            <table>
            <tbody>
            <tr>
            <td><strong>Mensagem:</strong></td>
            </tr>
            <tr>
            <td>$message</td>
            </tr>
            </tbody>
            </table>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <p>Equipa xxxxx.</p>
            <p>&nbsp;</p>
            <p>Obrigado</p>
            </body>
            </html>";
    $mail->addAttachment('../img/logo_pek.gif');
    foreach ($destinatário as $dest) {
        $correio = $dest['email'];
        if($correio != ''){
            $mail->ClearAddresses();
            $mail->addAddress($correio, 'Informação - XXXX');
        }
        if (!$mail->send()) {
            echo "Mailer Error: " . $mail->ErrorInfo;
            return array('status' => 'error', 'message' => 'O email não foi enviado...');
        }
        else{
            echo "Ok";
            return array('status' => 'success', 'message' => 'O email foi enviado com sucesso...');
        }
    }
}

When i use var_dump($correio) in the loop i have all the emails, so i don't get why the email is not sended. Any help?


Solution

  • There's a simple mistake in your loop:

    foreach ($destinatário as $dest) {
        $correio = $dest['email'];
        if($correio != ''){
            $mail->ClearAddresses();
            $mail->addAddress($correio, 'Informação - XXXX');
        }
        if (!$mail->send()) {
            echo "Mailer Error: " . $mail->ErrorInfo;
            return array('status' => 'error', 'message' => 'O email não foi enviado...');
        }
        else{
            echo "Ok";
            return array('status' => 'success', 'message' => 'O email foi enviado com sucesso...');
        }
    }
    

    Either of those return staements will exit the function entirely, so it will never get beyond the first message, and you need to keep track of each sending result, not just one of them. I think you meant something like this:

    $results = [];
    foreach ($destinatário as $dest) {
        $correio = $dest['email'];
        if($correio != ''){
            $mail->ClearAddresses();
            $mail->addAddress($correio, 'Informação - XXXX');
        }
        if (!$mail->send()) {
            echo "Mailer Error: " . $mail->ErrorInfo;
            $results[$correio] = array('status' => 'error', 'message' => 'O email não foi enviado...');
        }
        else{
            echo "Ok";
            $results[$correio] = array('status' => 'success', 'message' => 'O email foi enviado com sucesso...');
        }
    }
    return $results;