2011-02-06 7 views
9

Piszę dość prosty skrypt php rejestru, który używa wbudowanej w PHP funkcji mail(), aby wysłać użytkownikowi link aktywacyjny.Łapanie błędów PHP mail() i wyświetlanie uzasadnionego komunikatu o błędzie użytkownika

Problem polega na tym, że potrafię złapać zwykłe błędy, takie jak formatowanie wiadomości e-mail, ale po uruchomieniu serwera i stwierdzeniu, że użytkownik wprowadził adres e-mail, który się nie udał, nie wiem, jak złapać ten błąd i powiedz użytkownikowi, co się stało.

Na przykład w tej chwili mam to:

Warning: mail() [function.mail]: SMTP server response: 554 : Recipient address rejected: Relay access denied in ** on line 70

jakieś pomysły, co można zrobić o błędach, takich jak ten? Jestem świadomy używania symbolu @ do tłumienia błędu, ale chciałbym zrobić więcej i poradzić sobie z problemem.

Odpowiedz

21

Użyj logiczną wynik wykryć błąd:

$success = @mail(...); 

a chcesz dowiedzieć się, co spowodowało problem wewnętrzny błąd, więc należy używać:

$error = error_get_last(); 
preg_match("/\d+/", $error["message"], $error); 
switch ($error[0]) { 
    case 554: 
     ... 
    default: 
     ... 

Zauważ, że to działa w PHP 5.2 tylko dalej.

Nie ma możliwości zweryfikowania dostarczenia lub wyświetlenia komunikatów o błędach związanych z transportem za pomocą PHP. Potrzebny byłby do tego pope głosnik.

+2

dzięki za przesłanie odpowiedzi na to pytanie :) –

0

chcesz złapać jak najwięcej jak można przed wysłaniem wyłączyć pocztę, zdezynfekować swoje wejścia, aby upewnić się, że naprawdę jest to, co można oczekiwać, że będzie

Można użyć filter_var, by sprawdzić, czy adres e-mail naprawdę jest to adres, check że całkowite mieści się w dozwolonym zakresie swojej itp

Ustaw nagłówek mail z adresem do miejsca, gdzie można sprawdzić nieudanych dostaw:

$headers = 'From: [email protected]' . "\r\n"; 

można als o sprawdzić, czy wiadomość wykonywane zgodnie z oczekiwaniami:

if(mail($to,$subject,$message)) 

a ostateczną rzeczą, prawdopodobnie nie chcesz display warnings w rzeczywistym środowisku, można włączyć te wyłączone, albo za pośrednictwem pliku ini lub za pomocą ini_set.

+0

prawdziwych rzeczy, ale nie jest odpowiedź na pytanie. są też rzeczy, które mogą powodować błędy SMTP, których nie możesz z góry. na przykład listy blokujące spam. –

-2

Najlepiej byłoby użyć biblioteki takiej jak Swift Mailer, która zgłasza wyjątki, które można łatwo obsłużyć.

+4

jest to lekarstwo na problem, ale nie odpowiedź, jak rozwiązać go samodzielnie. obecnie dostępne są biblioteki prawie do wszystkiego i oczywiście mogą one zabezpieczyć wiele pracy. ale szkoda patrzeć, jak ludzie tracą zdolność rozwiązywania podstawowych problemów, ponieważ po prostu nie znają już podstaw języka programowania, w którym pracują. –

+0

To prawda, że ​​nie jest to odpowiedź na to pytanie, ale sugeruje sposób rozwiązania problemu. problem jest bardziej pragmatyczny. – Jan

Powiązane problemy