Frage

Ich versuche, Phpmailer für ein kleines Projekt zu verwenden, aber ich bin ein bisschen verwirrt über die Fehlerbehandlung mit dieser Software. Ich hoffe, jemand hat Erfahrung damit. Wenn ich eine E -Mail eingerichtet habe und verwende:

$result = $mail->Send();

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

Was gut funktioniert, mehr oder weniger. Das Problem ist, wenn ein Fehler vorliegt, scheint Phpmailer auch den Fehler auszuziehen. Wenn es also ein Problem gibt, sendet es diese Informationen nur direkt an den Browser und brechen im Wesentlichen einen Fehler, um den Fehler zu bearbeiten.

Gibt es eine Möglichkeit, diese Nachrichten zum Schweigen zu bringen? Es macht keine Ausnahme, sondern nur den Fehler aus, in meinem Testfall:

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

Es soll ein Fehler sein, aber es sollte in $ mail-> fehlerInfo wohnen. von der Software nicht wiederholt.

War es hilfreich?

Lösung

Phpmailer verwendet Ausnahmen. Versuchen Sie, Folgendes zu übernehmen Code:

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

Andere Tipps

Sie können mehr Informationen über den Fehler mit der Methode erhalten $mail->ErrorInfo. Zum Beispiel:

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

Dies ist eine Alternative zu dem Ausnahmemodell, mit dem Sie aktiv sind new PHPMailer(true). Wenn dies jedoch ein Ausnahmemodell verwenden kann, verwenden Sie es als @phil rykoff -Antwort.

Dies kommt von der Hauptseite von Phpmailer auf GitHub https://github.com/phpmailer/phpmailer.

Bitte beachten Sie!!! Sie müssen das folgende Format verwenden, wenn Sie Phpmailer instanziieren!

$mail = new PHPMailer(true);

Wenn Sie keine Ausnahmen ignoriert und das einzige, was Sie erhalten, ist ein Echo aus der Routine! Ich weiß, dass dies gut ist, nachdem dies geschaffen wurde, aber hoffentlich hilft es jemandem.

Ich musste das nur selbst reparieren. Die oben genannten Antworten scheinen das nicht zu berücksichtigen$mail->SMTPDebug = 0; Möglichkeit. Es war möglicherweise nicht verfügbar, als die Frage zum ersten Mal gestellt wurde.

Wenn Sie Ihren Code von der Phpmail -Site erhalten haben, ist der Standardwert$mail->SMTPDebug = 2; // enables SMTP debug information (for testing)

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

Legen Sie den Wert auf 0 ein, um die Fehler zu unterdrücken und den oben erläuterten "Catch" -Teil Ihres Codes zu bearbeiten.

Wir haben eine Wrapper -Klasse geschrieben, die den Puffer erfasst und die gedruckte Ausgabe in eine Ausnahme umwandelt. Auf diese Weise können wir die Phpmailer -Datei aktualisieren, ohne dass wir uns bei jedem Upgrade daran erinnern müssen, die Echo -Anweisungen zu kommentieren.

Die Wrapper -Klasse hat Methoden, die etwas im Sinne von:

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

Auch wenn Sie Ausnahmen verwenden, gibt es dennoch Fehler aus.
Sie müssen $ mailerdebug auf falsche festlegen, die so aussehen sollten

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

Dieser funktioniert gut

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

Dann fügen Sie das hinzu

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

In phpmailer.php gibt es Linien wie unten:

echo $e->getMessage()

Kommentieren Sie diese Zeilen einfach und Sie werden gut gehen.

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

Der einfachste Weg, um E -Mails zu verarbeiten, um erfolgreich oder fehlgeschlagen zu senden ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top