2010-02-24 5 views
25

누구든지 어떻게 알 수 있습니까 메일 오류 (전자 메일을 보내는 동안 오류가 표시됩니다 메일 서버에 의해 오류가 발생했습니다) PHP에서? emailserver 아래에 의해 발생 된mail()로 인한 오류를 어떻게 잡을 수 있습니까?

오류는 다음과 같습니다 :

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

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

mail() returns TRUE if the mail was successfully accepted for delivery, FALSE otherwise.

It is important to note that just because the mail was accepted for delivery, it does NOT mean the mail will actually reach the intended destination.

당신이 억제해야하는 경우 :

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

+1

어떻게 메일을 보내나요? SMTP 서버와 직접 이야기하고 있습니까? –

답변

42

이것은 당신이 할 수있는 최선에 관한 것입니다 경고 : 다음을 사용할 수 있습니다.

if ([email protected](...)) 

성공 여부에 대한 적절한 확인없이 @ 연산자를 사용하는 것에주의하십시오. mail() 오류가 억제 할 수없는 (이상한,하지만 지금 그것을 테스트 할 수 없습니다) 경우


, 당신은 할 수 :

가) 일시적으로 오류를 끄 :

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

B)를 사용 fireMike으로 제안 된 다른 메일러.

mail()이 너무 편하고 유연하지 못하면 b)를 살펴 보겠습니다. 오류를 끄는 것은 디버깅을 어렵게 만들고 일반적으로 좋지 않습니다. 당신은 예를 들어 here을 찾을 수 있습니다

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

:

+3

+1 좋은 답변입니다. 종종 사람들은'mail()'이'bool'을 리턴한다는 것을 잊어 버린다. 당신이 "오류가 없다면, 메일이 도착했다"는 가정을 너무 잘 받아 들였습니다. 이것은 새로운 개발자들 사이에서도 일반적인 오해였습니다. – Sampson

+0

안녕하세요, 나는 mail()이 true 또는 false를 반환합니다 것을 이해합니다.그러나 알 수없는 이유는 항상 내 페이지에 오류 메시지를 표시합니다. 오류 메시지는 위 질문에 표시되고 오류는 페이지의 소스 코드를 볼 때만 볼 수 있습니다. 이 오류로 인해 내 페이지를 새 페이지로 리디렉션 (header())합니다. 코드 주위를 검색했지만 실제로이 오류를 표시하는 위치를 찾을 수 없습니다. 아마도 이것은 PHP stmp 설정에서 설정되어 있습니까? –

+0

내 질문은 ... 어떻게 내 페이지 제목에서 "메일 서버에 연결하지 못했습니다."라는 오류 메시지를 무시하거나 던질 수 있습니까? 누구든지 어떻게 할 생각이 있습니까? 나는 구글에서 계속 검색했지만 여전히 솔루션을 찾을 수 없다. –

1

당신은 당신을 통해 오류를 검사 할 수있는의 PEAR Mail 클래스와 메소드를 사용할 수 있습니다.

6

PHPMailer도 잘 SMTP를 통해 메일을 보내기 위해 사용하는 것이 스크립트를 ... 오류를 처리

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

사실 나는 예외 속성을 true로 설정하지 않았다면 오류를 반향한다고 생각합니다. – AntonioCS

+0

코드로 나눠서 오류를 처리하기 위해 임시 '안전 모드'+ @mail()을 사용합니다. –

4

또한 메일()이로 그 오류를 emmit하지 않기 때문에, 당신을 도움이되지 않습니다 http://php.net/error_get_last를 사용하여 기능.

유일한 방법은 이미 위에 제안 된 것과 같은 적절한 메일러를 사용하는 것 같습니다. http://php.net/manual/en/function.error-get-last.php에 따르면

+2

이 주장은 약간의 가치가있는 것처럼 보입니다.'mail'은 나를 위해 false를 반환하지만'error_get_last'는 null입니다. – yoshi

3

는 사용 : 마지막 오류의 배열을 반환합니다

print_r(error_get_last()); 

생성. [message] 요소에 액세스하여 오류를 표시 할 수 있습니다.

관련 문제