mail () 함수에 대한 오류 메시지를 어떻게 얻을 수 있습니까?


80

저는 PHP mail()기능을 사용하고 있습니다.

어떤 이유로 든 메일이 전송되지 않으면 오류 메시지를 표시하고 싶습니다. 어떻게할까요?

같은 것

$this_mail = mail('example@example.com', 'My Subject', $message);

if($this_mail) echo 'sent!';
else echo error_message;

감사!

답변:


118

SMTP를 사용하는 Windows에서는 false를 반환 error_get_last()할 때 사용할 수 있습니다 mail(). 이것은 PHP의 기본 mail () 함수에서는 작동하지 않습니다.

$success = mail('example@example.com', 'My Subject', $message);
if (!$success) {
    $errorMessage = error_get_last()['message'];
}

을 사용 print_r(error_get_last())하면 다음과 같은 결과를 얻을 수 있습니다.

[type] => 2
[message] => mail () : "xxxx"포트 25에서 메일 서버에 연결하지 못했습니다. php.ini에서 "SMTP"및 "smtp_port"설정을 확인하거나 ini_set () 사용
[파일] = > C : \ www \ X \ X.php
[줄] => 2


4
SMTP (Windows?)를 사용하는 경우에만 작동한다고 가정합니다. Linux에서 "sendmail"을 사용하는 경우 "mail ()"함수는 해당 명령의 종료 상태를 반환합니다. github.com/php/php-src/blob/PHP-5.6.25/ext/standard/mail.c# L404 오류 메시지 afaik을 얻을 수있는 신뢰할 수있는 방법이 없습니다. :이 스크립트를 시도 gist.github.com/njam/a34ecd9ef195c37c8354ab58f7bfcc9b
njam

error_get_last()반환 NULL!! 그러나 메일 함수는 true를 반환합니다!
회계사 م

이 답변이 인기가있을 때이 답변이 스레드의 맨 위로 올라가지 않는 이유는 무엇입니까? 사람들이 그것을 완전히 놓칠 수 있는지 궁금합니다.
ashleedawg

4
@ashleedawg-어떻게 이렇게 많은 찬성 투표를 받았는지 모르겠습니다. 나는 결코-error_get_last ()가 PHP의 기본 mail () 함수와 함께 작동하는 것을 본 적이 없습니다. 사실, 나는 겨우 잘못된 메일 링을 설정하고 확인하기 위해 이것을 한 번 더 시도했습니다. 나는 아무것도 얻지 못했습니다.
CreationTribe

$ errorMessage = error_get_last () [ 'message'] 행입니다. 그냥 $ errorMessage = error_get_last (); ? 나는 첫 번째 방법을 시도하는 경우에 나는 ... 오류가 발생
Jabbamonkey

15

PHP로 메일을 보내는 것은 한 단계의 과정이 아닙니다. mail ()은 참 / 거짓을 반환하지만 참을 반환하더라도 메시지가 전송된다는 의미는 아닙니다. 모든 mail ()은 메시지를 대기열에 추가하는 것입니다 (sendmail 또는 php.ini에서 설정 한 모든 것을 사용).

메시지가 php로 전송되었는지 확인할 수있는 신뢰할 수있는 방법이 없습니다. 메일 서버 로그를 살펴 봐야합니다.


3
메일 로그는 어디에 있습니까?
Mahefa

5

제 경우에는 내가 무엇을하든 ( error_get_last(), 또는 ini_set('display_errors',1);) 오류 메시지를 표시하지 않더라도 PHP 스크립트에서 오류 메시지를 얻을 수 없습니다.

이 게시물 에 따르면

$ mail의 반환 값은 서버의 메일 링 시스템이 배달을 위해 메시지를 수락했는지 여부 만 나타내며 유효한 인수를 제공하는지 여부를 알 수 없으며 알 수 없습니다. 예를 들어, sendmail이 제대로로드되지 않은 경우 (예 : 제대로 설치되지 않은 경우) 반환 값은 false이지만 sendmail이 제대로로드되었지만 수신자 주소가 존재하지 않으면 true를 반환합니다.

mail()내 PHP 스크립트에서 사용하려는 시도가 실패한 후 sendmail내 컴퓨터에 설치되지 않았지만 php.ini 변수 sendmail_path/usr/sbin/sendmail -t -i

1- 패키지 관리자에서 sendmail을 설치했습니다. shell> dnf install sendmail

2- 나는 그것을 시작했다 shell> service sendmail start

3- 이제 PHP mail()기능이 실패하면 디렉토리에 sendmail기록 된 프로그램 의 오류를 찾습니다 /var/mail/. 사용자 당 파일 1 개

예를 들어이 스 니펫은 내 /var/mail/root파일 에서 가져옵니다.

The original message was received at Sun, 29 Jul 2018 22:37:51 +0200
from localhost [127.0.0.1]
   ----- The following addresses had permanent fatal errors -----
<no-one@errorerrorerrorerror51248562221e542.com>
    (reason: 550 Host unknown)

내 시스템은 apache2.4 및 PHP 7.2가 설치된 Linux Fedora 28입니다.



3

mail()함수 와 관련된 오류 메시지가 없습니다 . 이메일이 배달을 위해 수락되었는지 여부에 대해서만 true또는 false반환 이 있습니다 . 궁극적으로 전달되는지 여부가 아니라 기본적으로 도메인이 존재하고 주소가 유효한 형식의 이메일 주소인지 여부입니다.


1
$e=error_get_last();
if($e['message']!==''){
    // An error function
}

error_get_last (); -발생한 마지막 오류를 반환


6
나중에 다른 사람에게 도움이 될 수있는 코드에 대한 설명을 추가해야합니다. 어떻게 답변하는
cosmoonot

2
이전 의견에 동의합니다. 몇 가지 설명을 포함하도록 답변을 수정하십시오. 코드 전용 답변은 미래의 SO 독자를 교육하는 데 거의 도움이되지 않습니다. 귀하의 답변은 저품질에 대한 중재 대기열에 있습니다.
mickmackusa

0

다른 사람들이 말했듯이, 보내는 메일에 대한 오류 추적은 없으며 보내는 큐에 메일을 추가 한 부울 결과를 반환합니다. 진정한 성공 실패를 추적하려면 Swift Mailer, Zend_Mail 또는 phpmailer와 같은 메일 라이브러리와 함께 SMTP를 사용해보십시오.


0

이 시도. 파일에 오류가 있으면 이메일 ID에 오류 메일이 표시됩니다. 두 개의 파일을 index.php만들고 checkErrorEmail.php서버에 업로드합니다. 그런 다음 index.php브라우저로 로드 하십시오.

Index.php

<?php
    include('checkErrorEmail.php');
    include('dereporting.php');
    $temp;
    echo 'hi '.$temp;
?>

checkErrorEmail.php

<?php
  // Destinations
  define("ADMIN_EMAIL", "pradeep.callus7@hotmail.com");
  //define("LOG_FILE", "/my/home/errors.log");

  // Destination types
  define("DEST_EMAIL", "1");
  //define("DEST_LOGFILE", "3");

  /* Examples */

  // Send an e-mail to the administrator
  //error_log("Fix me!", DEST_EMAIL, ADMIN_EMAIL);

  // Write the error to our log file
  //error_log("Error", DEST_LOGFILE, LOG_FILE);

  /**
    * my_error_handler($errno, $errstr, $errfile, $errline)
    *
    * Author(s): thanosb, ddonahue
    * Date: May 11, 2008
    * 
    * custom error handler
    *
    * Parameters:
    *  $errno:   Error level
    *  $errstr:  Error message
    *  $errfile: File in which the error was raised
    *  $errline: Line at which the error occurred
    */

  function my_error_handler($errno, $errstr, $errfile, $errline)
  {  
  echo "<br><br><br><br>errno ".$errno.",<br>errstr ".$errstr.",<br>errfile ".$errfile.",<br>errline ".$errline;
      if($errno)
      {
              error_log("Error: $errstr \n error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);
      }
    /*switch ($errno) {
      case E_USER_ERROR:
        // Send an e-mail to the administrator
        error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);

        // Write the error to our log file
        //error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_LOGFILE, LOG_FILE);
        break;

      case E_USER_WARNING:
        // Write the error to our log file
        //error_log("Warning: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;

      case E_USER_NOTICE:
        // Write the error to our log file
       // error_log("Notice: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;

      default:
        // Write the error to our log file
        //error_log("Unknown error [#$errno]: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;
    }*/

    // Don't execute PHP's internal error handler
    return TRUE;
  }


  // Use set_error_handler() to tell PHP to use our method
  $old_error_handler = set_error_handler("my_error_handler");


?>

4
include ( 'dereporting.php'); 무엇입니까?
Jon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.