2010-03-05 19 views
34

Sto cercando di utilizzare PHPMailer per un piccolo progetto, ma sono un po 'confuso riguardo alla gestione degli errori con questo software. Sperando che qualcuno abbia esperienza con esso. Quando ho impostato una e-mail e io uso:Gestione degli errori con PHPMailer

$result = $mail->Send(); 

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

Che funziona bene, più o meno. Il problema è quando c'è un errore, PHPMailer sembra anche echeggiare l'errore, quindi se c'è un problema, invia semplicemente le informazioni direttamente al browser, in pratica rompendo qualsiasi gestione degli errori che sto cercando di fare.

È ? c'è un modo per mettere a tacere questi messaggi la sua non è gettando un'eccezione, il suo solo stampando l'errore, che nel mio caso di test è:

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

che deve essere così un errore, ma dovrebbe essere residente in $ posta -> ErrorInfo; non viene echeggiato dal software

risposta

84

PHPMAiler utilizza le eccezioni Provare ad adottare il seguente code:

+19

Avevo già provato a prenderlo con le eccezioni, la parte che mi mancava era 'new PHPMailer (true)' che abilita effettivamente le eccezioni. Grazie per l'aiuto. – Stomped

+0

per me .. queste righe hanno errori .. $ mail-> MsgHTML (file_get_contents ('contents.html')); $ mail-> AddAttachment ('images/phpmailer.gif'); // allegato $ mail-> AddAttachment ('images/phpmailer_mini.gif'); // allegato come posso risolverlo .. grazie .. – pcs

+2

Questo non va bene. Anche con la gestione delle eccezioni, dovresti comunque inserire la conferma "Messaggio inviato OK \ n" "all'interno di un condizionale, altrimenti ciò porterà a conferme fuorvianti che dicono che va bene quando qualcosa è andato storto. Quindi usa e.g .: 'if ($ mail-> Invia()) {echo" E-mail inviata OK
"; } –

3

Abbiamo scritto una classe wrapper che cattura il buffer e converte l'output stampato in un'eccezione. questo ci permette di aggiornare il file phpmailer senza dover ricordare di commentare le dichiarazioni di eco ogni volta che aggiorniamo.

La classe wrapper ha metodi qualcosa sulla falsariga di:

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); 
    } 
} 
3

anche se si utilizza eccezioni, gli errori ancora uscita.
È necessario impostare $ MailerDebug False Quale dovrebbe essere simile a questo

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

Solo una nota è stata rimossa: Versione 1.25 (Lun, 02 lug 2001) * Aggiunta migliore gestione degli errori aggiungendo una variabile $ ErrorInfo * Variabile MailerDebug rimossa (obsoleta con il nuovo gestore degli errori) –

2

Questo funziona bene

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! 
} 

Quindi aggiungere questo

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

In PHPMailer.php, ci sono linee come di seguito:

echo $e->getMessage() 

Basta commentare queste righe e sarai pronto per partire.

1
$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!'; 
} 

il modo più semplice per gestire l'invio di email esito positivo o negativo ...

+4

È necessario aggiungere $ mail-> ErrorInfo nel caso else per visualizzare gli errori. – Westy92

+0

Questo è il punto di partenza della domanda originale: la domanda viene posta solo perché non è sufficiente. – pgr

15

appena avuto a risolvere questo problema io stesso. Le risposte di cui sopra non sembrano prendere in considerazione l'opzione $mail->SMTPDebug = 0;. Potrebbe non essere disponibile quando la domanda è stata posta per la prima volta.

Se hai il codice dal sito PHPMail, il default sarà $mail->SMTPDebug = 2; // enables SMTP debug information (for testing)

https://github.com/Synchro/PHPMailer/blob/master/examples/test_smtp_gmail_advanced.php

impostare il valore a 0 per eliminare gli errori e modificare la parte 'cattura' del codice, come spiegato sopra.

+0

Se ancora non funziona, vai per '$ mail-> SMTPDebug = 4;' - questo mostrerà ogni passo PHPMailer fa – Mave

+0

Ma come si fa a loggare smtp connect error? –

14

Nota !!! È necessario utilizzare il seguente formato durante l'istanziazione di PHPMailer!

Se non si fa eccezione, le eccezioni vengono ignorate e l'unica cosa che si ottiene è un'eco dalla routine! So che questo è successo dopo che questo è stato creato, ma spero che possa aiutare qualcuno.

+3

ed è già stato menzionato nella risposta accettata ... – WOUNDEDStevenJones

+0

@WOUNDEDStevenJones Ho faticato con la risposta accettata. Forse non leggo abbastanza da vicino, ma in entrambi i casi questa risposta mi ha aiutato. – Goose

10

È possibile ottenere maggiori informazioni sull'errore con il metodo $mail->ErrorInfo. Per esempio:

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

Si tratta di un'alternativa al modello eccezione, è necessario per attivare con new PHPMailer(true). Ma se è possibile utilizzare il modello di eccezione, utilizzarlo come risposta @Phil Rykoff.

Questo proviene dalla pagina principale di PHPMailer su github https://github.com/PHPMailer/PHPMailer.

+0

Mi piace, perché non devi passare gli argomenti del costruttore né catturare le aspettative. –