Nasıl (posta kaynaklanan bir hata yakalamak için)?

4 Cevap php

Herkes (sening e-posta ve hata mailserverların aşağı neden ise hata ekranı) nasıl php mail hatayı yakalamak biliyor mu?

Aşağıdaki gibi Emailserver aşağı kaynaklanan hata:

<!--2010-02-24T14:26:43+11:00 NOTICE (5): Unexpected Error: mail() [<a href='function.mail'>function.mail</a>]: Failed to connect to mailserver at "ip " port portip, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() (# 2).
2010-02-24 14:26:43
Username: admin
Error in line 439 of file D:\test.php
Script: /customer.php
[Global Error Handler]
-->

4 Cevap

Bu yapabileceğiniz en iyi hakkında:

if (!mail(...)) {
   // Reschedule for later try or panic appropriately!
}

http://php.net/manual/en/function.mail.php

mail() döner TRUE posta başarıyla teslim için kabul edilmiş ise, FALSE aksi.

Bu posta teslim için kabul edilmiştir sırf bu mail aslında amaçlanan hedefe ulaşmak anlamına gelmez dikkat etmek önemlidir.

Eğer uyarıları bastırmak için ihtiyacınız varsa, kullanabilirsiniz:

if (!@mail(...))

Olsa bir şey başarılı olup olmadığını olarak uygun kontroller yapılmadan @ operatörü kullanma konusunda dikkatli olun.


mail() hataları Baskılanabilir değil (garip ama şu anda test edemez) varsa, olabilir:

a) geçici hataları kapatın:

$errLevel = error_reporting(E_ALL ^ E_NOTICE);  // suppress NOTICEs
mail(...);
error_reporting($errLevel);  // restore old error levels

fire ve Mike tarafından önerilen b), farklı bir posta grubu kullanır.

mail() çok lapa lapa ve esnek olduğu ortaya çıkarsa, ben b) içine bakmak istiyorum. Hatalarını kapatarak hata ayıklama zor yapma ve genellikle ungood olduğunu.

PHPMailer SMTP üzerinden mail göndermek için kullanmak iyi bir senaryo da, güzel hataları işleme ...

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message sent!";
}

mail () bu fonksiyon içine onun hataları Emmit değil, çünkü aynı zamanda, http://php.net/error_get_last size yardımcı olmayacaktır kullanarak.

Tek yolu zaten yukarıda önerilen gibi, uygun mailler kullanıyor gibi görünüyor.

Eğer hataları üzerinden kontrol etmenizi sağlayan PEAR Mail sınıfları ve yöntemleri kullanabilirsiniz:

if (PEAR::isError($mail)) {
    echo("<p>" . $mail->getMessage() . "</p>");
} else {
    echo("<p>Message successfully sent!</p>");
}

Sen bir örnek bulabilirsiniz here.