Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

O PHPMailer pára após o primeiro ou segundo e-mail ser enviado

Estou usando o PHPMailer 5.2 (https://github.com/PHPMailer/PHPMailer/tree/5.2-stable) no meu localhost (XAMPP 3.2.2) e tenho o seguinte problema:

Eu quero enviar um e-mail para muitas pessoas (a mensagem é um pouco diferente para cada uma delas). Então eu criei um FOR para passar por todos os e-mails dessas pessoas que estão guardados em uma ARRAY, enviando uma mensagem para cada um desses e-mails. O URL que eu insiro no meu navegador para executar o send-emails.php que criei é como http://localhost/mailer/send-emails.php, mas logo após o primeiro e-mail ser enviado, a página da web pára de carregar e nada mais acontece (sem erro de log, sem exceção, sem log do console, sem nada ...). Às vezes, se tiver sorte, o localhost consegue até enviar os dois primeiros e-mails da minha ARRAY, mas depois pára.

Não sei por que o PHPMailer está parando depois que o primeiro ou o segundo e-mail são enviados (no exemplo abaixo, ele só enviaria para aaaa@gmail.com e, talvez, para bbb@gmail.com por ex).

Alguém poderia ajudar, por favor?

O código é:

<?php
ini_set('MAX_EXECUTION_TIME', 3600);

include('PHPMailerAutoload.php');

$mail = new PHPMailer();
$mail->isSMTP();
$mail->CharSet = 'UTF-8';
$mail->Host = 'smtp.office365.com';
$mail->Port = 587;
$mail->SMTPSecure = 'STARTTLS';
$mail->SMTPAuth = true;
$mail->Username = "xxxx@xxxx"; //my e-mail
$mail->Password = "xxx";       //my password
$mail->setFrom("xxxx@xxxx", "Xxxx");

//'To' addresses
$email = array("aaaa@gmail.com","bbb@gmail.com","cccc@gmail.com","dddd@gmail.com","eeee@gmail.com");

for ($i=0; $i < sizeof($email); $i++) { 
    try {
        $mail->addAddress($email[$i]);
        //Blind copy to myself
        $mail->AddBCC("xxxx@xxxx", "Xxxx");

        $mail->Subject = "...";

        $mensagemHtml = "...";
        $mensagemBody = "...";
        $mail->msgHTML("<html>{$mensagemHtml}</html>");
        $mail->AltBody = "{$mensagemBody}";

        $mail->send();

        $mail->clearAddresses();
    } catch (Exception $e) {
        echo 'Error: ' . $mail->ErrorInfo;
    }
}
4 respostas

Há um tempo limite para o SCRIPT continuar rodando. Então, para enviar uma grande quantidade de emails é preciso programar a página para enviar alguns emails durante o tempo máximo que o script pode rodar e depois disto recarrregar a página para enviar outro grupo de email.

Gabriel, obrigado pela resposta!

Tentei fazer (algo parecido com) isso usando o

ini_set('MAX_EXECUTION_TIME', 3600);

mas não deu resultado

Há alguma sugestão?

Abraços

Boa tarde Renato.

Uma dica, dentro do bloco do catch coloque um echo para mostrar qual é a exceção que está ocorrendo:

echo 'Erro: ' . $e->getMessage();
solução!

Segue um exemplo que funciona:

<?php
// Arquivo de Mensagem
require 'mensagem.php';

// Mensagem
$assunto = 'Convite TST : Seminario sobre Hermeneutica Constitucional e Direito Social';

$remetente = "Fórum-TST";

$email_remet = "forum@tst.jus.br";

// Configuração
## Número de Mensagens enviadas por Blocos,
$msg_num = 50;
## Tempo, em segundos, entre os Blocos de E-mail
$sec = 12;

$ok = 0;
$inicio = 0;
$fim = $inicio + $msg_num;

// Conexão com Banco de Dados
$servidor = 'localhost';
$usuario = 'xxx';
$senha = 'xxx';
$banco = 'xxxx';

$mysqli = new mysqli ( $servidor, $usuario, $senha, $banco );

if ( mysqli_connect_errno ()) trigger_error ( mysqli_connect_error () );

mysqli_query($mysqli, "SET NAMES 'utf8'");
mysqli_query($mysqli, "SET character_set_connection=utf8");
mysqli_query($mysqli, "SET character_set_client=utf8");
mysqli_query($mysqli, "SET character_set_results=utf8");

$string_sql = "SELECT id, email, status FROM tabela WHERE remover=0 AND status=0 LIMIT $inicio,$fim;";
$query = $mysqli->query ( $string_sql );
$registros = mysqli_num_rows($query);

if($registros==0) {
    printf("<font face='tahoma'>Envio de mensagens: O.K.</font>");
    $ok = 1;
}

while ( $result  = mysqli_fetch_array ( $query ) ) {
    $id = $result[0];
    $para = $result[1];
    $status = $result[2];

    $headers = "Content-type: text/html; charset=utf-8\r\n";
    $headers .= "From: forum@tst.jus.br\r\n";
    mail($para,$assunto,$mensagem,$headers);
    $mysqli->query("update tabela set status = 1 where id = $id");
    printf("<font face='tahoma'>[$id] mensagem para <b>$para</b> <font color='#ff0000'>enviada com sucesso!</font></font><br>");
}    

mysqli_free_result($query);
mysqli_close($mysqli);

if(!$ok){
    echo("<meta http-equiv='refresh' content='" . $sec . "'>");
}

?>