Pergunta

Estou tentando usar o PHPMailer para um pequeno projeto, mas estou um pouco confuso com o tratamento de erros com este software. Esperando que alguém tenha experiência com isso. Quando eu configurei um e -mail e uso:

$result = $mail->Send();

if(!$result) {
    // There was an error
    // Do some error handling things here
} else {
    echo "Email successful";
}

O que funciona bem, mais ou menos. O problema é que quando há um erro, o Phpmailer também parece ecoar o erro, por isso, se houver um problema, ele apenas envia essas informações diretamente para o navegador, essencialmente quebrando qualquer manuseio de erros que estou tentando fazer.

Existe uma maneira de silenciar essas mensagens? Não está jogando uma exceção, está apenas imprimindo o erro, que no meu caso de teste é:

invalid address: @invalid@email You must provide at least one recipient email address.

É para ser um erro, mas deve residir em $ Mail-> errorInfo; não estar ecoando pelo software.

Foi útil?

Solução

Phpmailer usa exceções. Tente adotar o seguinte código:

require_once '../class.phpmailer.php';

$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch

try {
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->Subject = 'PHPMailer Test Subject via mail(), advanced';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML(file_get_contents('contents.html'));
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}

Outras dicas

Você pode obter mais informações sobre o erro com o método $mail->ErrorInfo. Por exemplo:

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

Esta é uma alternativa ao modelo de exceção com o qual você precisa ativo new PHPMailer(true). Mas se puder usar o modelo de exceção, use -o como resposta @Phil Rykoff.

Isso vem da página principal de Phpmailer no Github https://github.com/phpmailer/phpmailer.

Observe!!! Você deve usar o seguinte formato ao instantar o phpmailer!

$mail = new PHPMailer(true);

Se você não é exceção é ignorado e a única coisa que você receberá é um eco da rotina! Eu sei que isso está bem depois que isso foi criado, mas espero que ajude alguém.

Só tive que consertar isso sozinho. As respostas acima não parecem levar em consideração o$mail->SMTPDebug = 0; opção. Pode não estar disponível quando a pergunta foi feita pela primeira vez.

Se você obteve seu código no site phpmail, o padrão será$mail->SMTPDebug = 2; // enables SMTP debug information (for testing)

https://github.com/synchro/phpmailer/blob/master/examples/test_smtp_gmail_advanced.php

Defina o valor como 0 para suprimir os erros e editar a parte 'Catch' do seu código, conforme explicado acima.

Escrevemos uma classe de wrapper que captura o buffer e converte a saída impressa em uma exceção. Isso nos permite atualizar o arquivo phpmailer sem precisar se lembrar de comentar as instruções de eco cada vez que atualizamos.

A classe Wrapper tem métodos algo parecido com:

public function AddAddress($email, $name = null) {
    ob_start();
    parent::AddAddress($email, $name);
    $error = ob_get_contents();
    ob_end_clean();
    if( !empty($error) ) {
        throw new Exception($error);
    }
}

Mesmo se você usar exceções, ele ainda emitirá erros.
Você tem que definir $ MailerDebug como falso, que deve ficar assim

$mail = new PHPMailer();
$mail->MailerDebug = false;

Este funciona bem

use try { as above

use Catch as above but comment out the echo lines
} catch (phpmailerException $e) { 
//echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {   
//echo $e->getMessage(); //Boring error messages from anything else!
}

Em seguida, adicione isso

if ($e) {
//enter yor error message or redirect the user
} else {
//do something else 
}

Em phpmailer.php, existem linhas abaixo:

echo $e->getMessage()

Basta comentar essas linhas e você estará pronto.

$mail = new PHPMailer();

$mail->AddAddress($email); 
$mail->From     = $from;
$mail->Subject  = $subject; 
$mail->Body     = $body;

if($mail->Send()){
    echo 'Email Successfully Sent!';
}else{
    echo 'Email Sending Failed!';
}

A maneira mais simples de lidar com o e -mail enviando bem -sucedido ou falhado ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top