프로그래밍 언어/PHP

PHP 메일 기능이 이메일 전송을 완료하지 못할 경우 체크할 사항들

Rateye 2021. 8. 3. 10:46
728x90
반응형
질문 : PHP 메일 기능이 이메일 전송을 완료하지 못함

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = 'contact@yoursite.com';
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) {
            echo '<p>Your message has been sent!</p>';
        } else {
            echo '<p>Something went wrong, go back and try again!</p>';
        }
    }
?>

간단한 메일 양식을 만들어 보았습니다. 양식 자체는 내 index.html 페이지에 있지만 위의 PHP 코드가 삽입 된 별도의 "제출해 주셔서 감사합니다"페이지 인 thankyou.php 코드는 완벽하게 제출되지만 이메일을 보내지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

이 답변의 일부가 mail() 함수 자체의 사용에만 적용되지만 이러한 문제 해결 단계의 대부분은 모든 PHP 메일 링 시스템에 적용될 수 있습니다.

스크립트가 이메일을 보내지 않는 것처럼 보이는 데에는 여러 가지 이유가 있습니다. 명백한 구문 오류가 없으면 이러한 것들을 진단하기가 어렵습니다. 하나가 없으면 아래 체크리스트를 실행하여 발생할 수있는 잠재적 인 함정을 찾아야합니다.

오류 보고가 활성화되어 있는지 확인하고 모든 오류를 보고하도록 설정합니다.

오류보고는 코드의 버그와 PHP에서 발생하는 일반적인 오류를 제거하는 데 필수적입니다. 이러한 오류를 수신하려면 오류보고를 활성화해야합니다. PHP 파일 상단 (또는 마스터 구성 파일)에 다음 코드를 배치하면 오류보고가 활성화됩니다.

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

PHP에서 유용한 오류 메시지를 어떻게 얻을 수 있습니까?를 참조하십시오. — 이에 대한 자세한 내용은 이 답변입니다.

'mail()' 기능이 호출되었는지 확인합니다.

어리석은 것처럼 보일 수 있지만 일반적인 오류는 실제로 mail() 함수를 코드에 배치하는 것을 잊는 것입니다. 거기에 있고 주석 처리되지 않았는지 확인하십시오.

'mail()' 기능이 올바르게 호출되었는지 확인하십시오.

bool 메일 (문자열 $ to, 문자열 $ subject, 문자열 $ message [, 문자열 $ additional_headers [, 문자열 $ additional_parameters]])

메일 함수는 세 개의 필수 매개 변수와 선택적으로 네 번째 및 다섯 번째 매개 변수를 사용합니다. mail() 대한 호출에 적어도 세 개의 매개 변수가 없으면 실패합니다.

mail() 호출에 올바른 순서로 올바른 매개 변수가 없으면 실패합니다.

서버의 메일 로그 확인

웹 서버는이를 통해 이메일을 보내려는 모든 시도를 기록해야합니다. 이러한 로그의 위치는 다양하지만 (서버 관리자에게 해당 위치를 문의해야 할 수 있음) 일반적으로 logs 아래 사용자의 루트 디렉토리에서 찾을 수 있습니다. 내부에는 이메일 전송 시도와 관련하여 서버가보고 한 오류 메시지가 있습니다.

포트 연결 실패 확인

포트 차단은 대부분의 개발자가 코드를 통합하여 SMTP를 사용하여 이메일을 전달하는 동안 직면하는 매우 일반적인 문제입니다. 그리고 이것은 서버 메일 로그에서 쉽게 추적 할 수 있습니다 (메일 로그의 서버 위치는 위에서 설명한대로 서버마다 다를 수 있습니다). 공유 호스팅 서버에있는 경우 포트 25 및 587은 기본적으로 차단 된 상태로 유지됩니다. 이 블록은 호스팅 제공 업체가 의도적으로 수행 한 것입니다. 일부 전용 서버의 경우에도 마찬가지입니다. 이러한 포트가 차단되면 포트 2525를 사용하여 연결을 시도합니다. 해당 포트도 차단 된 경우 호스팅 제공 업체에 연락하여 이러한 포트를 차단 해제하는 것이 유일한 해결책입니다.

대부분의 호스팅 제공 업체는 스팸 이메일을 보내지 못하도록 네트워크를 보호하기 위해 이러한 이메일 포트를 차단합니다.

일반 / TLS 연결에는 포트 25 또는 587을 사용하고 SSL 연결에는 포트 465를 사용합니다. 대부분의 사용자는 일부 호스팅 공급자가 설정 한 속도 제한을 피하기 위해 포트 587을 사용하는 것이 좋습니다.

오류 억제 연산자 사용 안 함

오류 억제 연산자 @ 가 PHP에서 표현식 앞에 추가되면 해당 표현식에 의해 생성 될 수있는 모든 오류 메시지가 무시됩니다. 이 연산자를 사용해야하는 경우가 있지만 메일 발송은 그중 하나 가 아닙니다.

@mail(...) 포함 된 경우이를 디버그하는 데 도움이되는 중요한 오류 메시지를 숨길 수 있습니다. @ 제거하고보고 된 오류가 있는지 확인하십시오.

구체적인 실패 를 확인한 error_get_last() 확인할 때만 권장됩니다.

'mail()' 반환 값을 확인하십시오.

mail() 함수 :

반환 TRUE 메일이 성공적으로 배달, 허용 된 경우 FALSE 그렇지. 우편물이 배달을 위해 수락되었다고해서 우편물이 실제로 의도 한 목적지에 도착한다는 것을 의미하지는 않는다는 점에 유의해야합니다.

이는 다음과 같은 이유로 중요합니다.

  • FALSE 반환 값을 받으면 서버가 메일을 수락하는 데 오류가 있음을 알 수 있습니다. 이것은 아마도 코딩 문제가 아니라 서버 구성 문제 일 것입니다. 이 문제가 발생하는 이유를 알아 보려면 시스템 관리자에게 문의해야합니다.
  • TRUE 반환 값을 받았다고해서 이메일이 확실히 전송된다는 의미는 아닙니다. 이는 이메일이 PHP에 의해 서버의 해당 핸들러로 성공적으로 전송되었음을 의미합니다. 이메일이 전송되지 않게 할 수있는 PHP의 제어를 벗어나는 실패 지점이 여전히 더 많습니다.

따라서 FALSE 는 올바른 방향을 가리키는 데 도움이되는 반면 TRUE 는 반드시 이메일이 성공적으로 전송되었음을 의미 하지는 않습니다. 이것은 중요합니다!

호스팅 공급자가 전자 메일 보내기를 허용하고 메일 보내기를 제한하지 않는지 확인하십시오.

많은 공유 웹 호스트, 특히 무료 웹 호스팅 제공 업체는 서버에서 이메일을 보내는 것을 허용하지 않거나 주어진 기간 동안 보낼 수있는 양을 제한합니다. 이는 스팸 발송자가 저렴한 서비스를 이용하지 못하도록 제한하려는 노력 때문입니다.

호스트가 이메일 제한이 있거나 이메일 전송을 차단한다고 생각되면 FAQ를 확인하여 그러한 제한 사항이 있는지 확인하십시오. 그렇지 않으면 지원팀에 연락하여 이메일 전송과 관련된 제한 사항이 있는지 확인해야 할 수 있습니다.

 

반응형

 

스팸 폴더 확인, 전자 메일이 스팸으로 플래그 지정되지 않도록 방지

종종 다양한 이유로 인해 PHP (및 기타 서버 측 프로그래밍 언어)를 통해 전송 된 이메일이 수신자의 스팸 폴더에 들어갑니다. 코드 문제를 해결하기 전에 항상 확인하십시오.

PHP를 통해 전송 된 메일이 수신자의 스팸 폴더로 전송되는 것을 방지하기 위해 PHP 코드 및 기타 방법 모두에서 이메일이 스팸으로 표시 될 가능성을 최소화 할 수있는 다양한 작업이 있습니다. Michiel de Mare의 좋은 팁은 다음과 같습니다.

  • SPFDKIM 과 같은 이메일 인증 방법을 사용하여 이메일과 도메인 이름이 함께 속해 있음을 증명하고 도메인 이름의 스푸핑을 방지합니다. SPF 웹 사이트에는 사이트에 대한 DNS 정보를 생성하는 마법사가 포함되어 있습니다.
  • 확인 하여 역 DNS를 메일을 보내는 데 사용하는 도메인 이름에 확인 메일 서버 포인트의 IP 주소를 확인합니다.
  • 사용중인 IP 주소가 블랙리스트에 없는지 확인하십시오.
  • 회신 주소가 유효한 기존 주소인지 확인하십시오.
  • 받는 사람 필드에 이메일 주소뿐만 아니라받는 사람의 실제 이름을 사용합니다 (예 : "John Smith" <john@blacksmiths-international.com> ).
  • abuse@yourdomain.com 및 postmaster@yourdomain.com과 같은 악용 계정을 모니터링합니다. 즉, 이러한 계정이 존재하는지 확인하고 전송 된 내용을 읽고 불만 사항에 대해 조치를 취해야합니다.
  • 마지막으로 구독 취소를 정말 쉽게 만드세요. 그렇지 않으면 사용자가 스팸 버튼을 눌러 구독을 취소하고 평판에 영향을 미칩니다.
  • SPFDKIM 과 같은 이메일 인증 방법을 사용하여 이메일과 도메인 이름이 함께 속해 있음을 증명하고 도메인 이름의 스푸핑을 방지합니다. SPF 웹 사이트에는 사이트에 대한 DNS 정보를 생성하는 마법사가 포함되어 있습니다.
  • 확인 하여 역 DNS를 메일을 보내는 데 사용하는 도메인 이름에 확인 메일 서버 포인트의 IP 주소를 확인합니다.
  • 사용중인 IP 주소가 블랙리스트에 없는지 확인하십시오.
  • 회신 주소가 유효한 기존 주소인지 확인하십시오.
  • 받는 사람 필드에 이메일 주소뿐만 아니라받는 사람의 실제 이름을 사용합니다 (예 : "John Smith" <john@blacksmiths-international.com> ).
  • abuse@yourdomain.com 및 postmaster@yourdomain.com과 같은 악용 계정을 모니터링합니다. 즉, 이러한 계정이 존재하는지 확인하고 전송 된 내용을 읽고 불만 사항에 대해 조치를 취해야합니다.
  • 마지막으로 구독 취소를 정말 쉽게 만드세요. 그렇지 않으면 사용자가 스팸 버튼을 눌러 구독을 취소하고 평판에 영향을 미칩니다.

프로그래밍 방식으로 보내는 이메일이 자동으로 스팸으로 표시되지 않도록하려면 어떻게하나요?를 참조하세요. 이 주제에 대한 자세한 내용은.

모든 메일 헤더가 제공되었는지 확인

일부 스팸 소프트웨어는 "From"및 "Reply-to"와 같은 공통 헤더가 누락 된 경우 메일을 거부합니다.

$headers = array("From: from@example.com",
    "Reply-To: replyto@example.com",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

메일 헤더에 구문 오류가 없는지 확인

잘못된 헤더는 헤더가없는 것만큼이나 나쁩니다. 하나의 잘못된 문자 만 있으면 이메일을 탈선시킬 수 있습니다. PHP가 이러한 오류를 감지 하지 못 하므로 구문이 올바른지 다시 확인하십시오.

$headers = array("From from@example.com", // missing colon
    "Reply To: replyto@example.com",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

'From:' 발송자 사용 안 함

메일이에서을을 가지고 있어야하지만 : 보낸 사람, 당신은 모든 값을 사용할 수 없습니다. 특히 사용자가 제공 한 발신자 주소는 메일을 차단하는 확실한 방법입니다.

$headers = array("From: $_POST[contactform_sender_email]"); // No!
                                                                                                    

이유 : 귀하의 웹 또는 발송 메일 서버가 @hotmail 또는 @gmail 주소를 담당하는 것처럼 위장하기 위해 SPF / DKIM 허용 목록에 포함되지 않았습니다. From: sender 도메인이 구성되지 않은 메일을 자동으로 삭제할 수도 있습니다.

수취인 값이 올바른지 확인하십시오.

때때로 문제는 이메일 수신자에 대해 잘못된 값을 갖는 것처럼 간단합니다. 잘못된 변수를 사용했기 때문일 수 있습니다.

$to = 'user@example.com';
                                                                                                    // other variables ....
                                                                                                    mail($recipient, $subject, $message, $headers); // $recipient should be $to
                                                                                                    

이를 테스트하는 또 다른 방법은 수신자 값을 mail() 함수 호출에 하드 코딩하는 것입니다.

mail('user@example.com', $subject, $message, $headers); 
                                                                                                    

mail() 매개 변수에 적용될 수 있습니다.

여러 계정으로 보내기

이메일 계정 문제를 배제하려면 다른 이메일 제공 업체의 여러 이메일 계정으로 이메일을 보내세요. 이메일이 사용자의 Gmail 계정에 도착하지 않는 경우 동일한 이메일을 Yahoo 계정, Hotmail 계정 및 일반 POP3 계정 (예 : ISP 제공 이메일 계정)으로 보냅니다.

이메일이 다른 이메일 계정 전체 또는 일부에 도착하는 경우 코드가 이메일을 보내고 있음을 알고 있지만 이메일 계정 제공 업체가 어떤 이유로 든 이메일을 차단할 가능성이 있습니다. 이메일이 이메일 계정에 도착하지 않으면 문제가 코드와 관련이있을 가능성이 높습니다.

코드가 양식 메서드와 일치하는지 확인하십시오.

양식 메소드를 POST $_POST 를 사용하여 양식 값을 찾고 있는지 확인하십시오. GET 설정했거나 전혀 설정하지 않은 경우 $_GET 을 사용하여 양식 값을 찾도록하십시오.

양식 action 값이 올바른 위치를 가리키는지 확인하십시오.

action 속성에 PHP 메일 링 코드를 가리키는 값이 포함되어 있는지 확인하십시오.

<form action="send_email.php" method="POST">
                                                                                                    

웹 호스트가 전자 메일 보내기를 지원하는지 확인

일부 웹 호스팅 제공 업체는 서버를 통한 이메일 전송을 허용하거나 활성화하지 않습니다. 그 이유는 다양 할 수 있지만 메일 전송을 비활성화 한 경우 타사를 사용하여 해당 이메일을 보내는 다른 방법을 사용해야합니다.

기술 지원팀에 이메일을 보내면 (온라인 지원 또는 FAQ를 방문한 후) 서버에서 이메일 기능을 사용할 수 있는지 명확히해야합니다.

로컬 호스트 메일 서버가 구성되어 있는지 확인합니다.

WAMP, MAMP 또는 XAMPP를 사용하여 로컬 워크 스테이션에서 개발하는 경우 이메일 서버가 워크 스테이션에 설치되지 않았을 수 있습니다. 하나가 없으면 PHP는 기본적으로 메일을 보낼 수 없습니다.

기본 메일 서버를 설치하여이를 극복 할 수 있습니다. Windows의 경우 무료 Mercury Mail을 사용할 수 있습니다.

SMTP를 사용하여 이메일을 보낼 수도 있습니다. 이를 수행하는 방법을 배우려면 Vikas Dwivedi의 훌륭한 답변 을 참조하십시오.

PHP의 사용자 정의 mail.log 사용

MTA 및 PHP의 로그 파일 외에도 mail() 함수에 대한 로깅을 특별히 활성화 할 수 있습니다. 완전한 SMTP 상호 작용을 기록하지는 않지만 적어도 함수 호출 매개 변수와 호출 스크립트를 기록합니다.

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

자세한 내용은 http://php.net/manual/en/mail.configuration.php 를 참조하십시오. php.ini 또는 .user.ini 또는 .htaccess 에서 이러한 옵션을 활성화하는 것이 가장 좋습니다.)

메일 테스트 서비스에 확인

MTA / 웹 서버 설정을 테스트하는 데 활용할 수있는 다양한 배달 및 스팸 확인 서비스가 있습니다. 일반적으로 메일 검사받는 사람 : 주소를 보낸 다음 나중에 배달 보고서와보다 구체적인 실패 또는 분석을받습니다.

다른 메일러 사용

PHP의 내장 mail() 함수는 편리하고 종종 작업을 완료하지만 단점이 있습니다. 다행히도 위에 설명 된 많은 문제를 처리하는 것을 포함하여 더 많은 힘과 유연성을 제공하는 대안이 있습니다.

이 모든 기능은 전문 SMTP 서버 / 서비스 제공 업체와 결합 할 수 있습니다. (일반적인 08/15 공유 웹 호스팅 계획은 이메일 설정 / 구성 가능성과 관련하여 적중하거나 놓치기 때문입니다.)

출처 : https://stackoverflow.com/questions/24644436/php-mail-function-doesnt-complete-sending-of-e-mail
728x90
반응형