PHP 메일 기능이 이메일 전송을 완료하지 못했습니다.
P粉257342166
2023-08-27 14:03:20
<p><br /></p>
<pre class="brush:php;toolbar:false;"><?php
$이름 = $_POST['이름'];
$email = $_POST['이메일'];
$메시지 = $_POST['메시지'];
$from = '보낸사람: yoursite.com';
$to = 'contact@yoursite.com';
$subject = '고객문의';
$body = "보낸 사람: $namen 이메일: $emailn 메시지:n $message";
if ($_POST['제출']) {
if (메일 ($to, $subject, $body, $from)) {
echo '<p>메시지가 전송되었습니다!</p>';
} 또 다른 {
echo '<p>문제가 발생했습니다. 돌아가서 다시 시도하세요!</p>';
}
}
?></pre>
<p>간단한 이메일 양식을 만들려고 합니다. 양식 자체는 내 <code>index.html</code> 페이지에 있지만 위의 내용이 있는 별도의 "제출해 주셔서 감사합니다" 페이지인 <code>thankyou.php</code>에 제출됩니다. PHP가 코드에 내장되어 있습니다.
코드는 완벽하게 제출되지만 이메일은 전송되지 않습니다. 이 문제를 어떻게 해결할 수 있나요? </p>
이 답변의 일부는
mail()
함수 자체 사용에만 적용되지만 이러한 문제 해결 단계 중 대부분은 모든 PHP 메일 시스템에 적용될 수 있습니다. 嗯>스크립트가 이메일을 보내지 못하는 데에는 몇 가지 이유가 있습니다. 명백한 구문 오류가 없으면 이러한 사항을 진단하기가 어렵습니다. 그렇지 않은 경우 아래 체크리스트를 통해 발생할 수 있는 잠재적인 함정을 찾아보세요.
오류 보고가 활성화되어 있고 모든 오류를 보고하도록 설정되어 있는지 확인하세요
오류 보고는 코드의 버그와 PHP에서 발생하는 일반적인 오류를 근절하는 데 중요합니다. 이러한 오류를 수신하려면 오류 보고를 활성화해야 합니다. PHP 파일 상단(또는 기본 구성 파일)에 다음 코드를 배치하면 오류 보고가 활성화됩니다.
으아악참조 PHP에서 유용한 오류 메시지를 얻는 방법은 무엇입니까? — 자세한 내용은 이 답변을 참조하세요.
꼭
를 호출하세요mail()
함수우스꽝스러워 보일 수도 있지만 흔히 저지르는 실수는 코드에 실제로
mail()
함수를 배치하는 것을 잊어버리는 것입니다. 그것이 거기에 있고 주석 처리되지 않았는지 확인하십시오.mail()
함수메일 기능은 세 개의 필수 매개변수와 선택적인 네 번째 및 다섯 번째 매개변수를 사용합니다.
mail()
에 대한 호출에 인수가 세 개 이상 없으면 실패합니다.mail()
호출이 올바른 인수를 올바른 순서로 제공하지 않으면 호출도 실패합니다.서버의 메일 로그를 확인하세요
웹 서버는 이를 통해 이메일을 보내려는 모든 시도를 기록해야 합니다. 이러한 로그의 위치는 다양하지만(서버 관리자에게 위치를 문의해야 할 수도 있음) 일반적으로 사용자 루트 디렉터리의
logs
에서 찾을 수 있습니다. 내부에는 이메일 전송 시도와 관련하여 서버(있는 경우)에서 보고한 오류 메시지가 있습니다.포트 연결이 실패하는지 확인하세요
포트 차단은 대부분의 개발자가 SMTP를 사용하여 이메일을 보내기 위해 코드를 통합하는 동안 직면하는 매우 일반적인 문제입니다. 그리고 이는 서버 메일 로그에서 쉽게 추적할 수 있습니다(위에서 언급한 것처럼 메일 로그 서버의 위치는 서버마다 다를 수 있습니다). 공유 호스팅 서버를 사용하는 경우 포트 25 및 587은 기본적으로 여전히 차단됩니다. 이 차단은 호스팅 공급자가 의도적으로 수행합니다. 일부 전용 서버의 경우에도 마찬가지입니다. 해당 포트가 차단되면 포트 2525를 사용하여 연결해 보세요. 포트도 차단된 경우 유일한 해결 방법은 호스팅 제공업체에 문의하여 해당 포트의 차단을 해제하는 것입니다.
대부분의 호스팅 제공업체는 스팸 전송으로부터 네트워크를 보호하기 위해 이러한 이메일 포트를 차단합니다.
일반/TLS 연결에는 포트 25 또는 587을 사용하고 SSL 연결에는 포트 465를 사용하세요. 대부분의 사용자는 일부 호스팅 공급자가 설정한 속도 제한을 피하기 위해 포트 587을 사용하는 것이 좋습니다.
오류 억제 연산자를 사용하지 마세요
PHP에서 표현식 앞에 오류 억제 연산자
@
를 추가하면 해당 표현식에 의해 생성될 수 있는 모든 오류 메시지가 무시됩니다. 이 연산자가 필요한 상황이 있지만 메시지를 보내는 것은 그 중 하나가 아닙니다 .코드에
@mail(...)
,那么您可能隐藏了有助于您调试的重要错误消息。删除@
가 포함되어 있으면 오류가 보고되는지 확인하세요.특정 오류가 발생한 직후 사용
error_get_last()
하는 경우에만 해당됩니다.반환값 확인
mail()
다음과 같은 이유로 주목할 가치가 있습니다.mail()
기능:FALSE
TRUE
는 올바른 방향을 안내하는 데 도움이 될 것이지만
FALSE
将帮助您指明正确的方向,而TRUE
가 반드시 이메일이 성공적으로 전송되었음을 의미하는 것은 아닙니다. 주목할 가치가 있습니다!호스팅 공급자가 이메일 전송을 허용하고 메일 전송을 제한하지 않는지 확인하세요
많은 공유 웹 호스트, 특히 무료 웹 호스팅 제공업체는 서버에서 이메일을 보내는 것을 허용하지 않거나 특정 기간에 보낼 수 있는 이메일 수를 제한합니다. 이는 스패머가 저렴한 서비스를 이용하지 못하도록 제한하기 위해 열심히 노력하기 때문입니다.
호스트가 이메일 제한 사항이 있거나 이메일 전송을 차단하고 있다고 생각되면 FAQ를 확인하여 그러한 제한 사항이 나열되어 있는지 확인하세요. 그렇지 않은 경우 해당 지원팀에 문의하여 이메일 전송에 제한 사항이 있는지 확인해야 할 수도 있습니다.
스팸 폴더를 확인하여 이메일이 스팸으로 표시되는 것을 방지하세요
PHP(및 기타 서버 측 프로그래밍 언어)를 통해 전송된 이메일은 다양한 이유로 수신자의 스팸 폴더에 들어가는 경우가 많습니다. 코드 문제를 해결하기 전에 먼저 확인하세요.
PHP를 통해 전송된 이메일이 수신자의 스팸 폴더로 전송되는 것을 방지하기 위해 PHP 코드에서 수행할 수 있는 작업이 많거나 이메일이 스팸으로 표시될 가능성을 최소화할 수 있는 방법이 있습니다. Michiel de Mare의 유용한 팁은 다음과 같습니다.
이 주제에 대한 자세한 내용은 프로그래밍 방식으로 전송된 이메일이 자동으로 스팸으로 표시되지 않도록 하는 방법을 참조하세요. .
모든 이메일 헤더를 제공하세요
일부 스팸 소프트웨어는 "보낸 사람" 및 "답장"과 같은 일반적인 헤더가 누락된 경우 메시지를 거부합니다.
으아악이메일 헤더에 문법 오류가 없는지 확인하세요
잘못된 헤더는 헤더가 전혀 없는 것만큼이나 나쁩니다. 잘못된 문자 하나가 이메일을 탈선시킬 수 있습니다. PHP 에서는 이러한 오류를 잡아내지 못하므로 구문이 올바른지 다시 한 번 확인하세요.
으아악가짜
를 사용하지 마세요.发件人:
발신자메시지에는 보낸 사람:발신자가 있어야 하지만 모든 값을 사용할 수는 없습니다. 특히 사용자가 제공한 보낸 사람 주소는 메시지를 차단하는 안정적인 방법입니다.
으아악원인: 네트워크 또는 보내는 메일 서버가 SPF/DKIM 화이트리스트에 포함되어 있지 않으며 @hotmail 또는 @gmail 주소에 대한 책임을 지는 척할 수 없습니다. 구성되지 않은
From:
보낸 사람 도메인이 있는 메시지를 자동으로 삭제할 수도 있습니다.받는 사람 값이 올바른지 확인하세요
때때로 문제는 이메일 수신자 값이 올바르지 않은 것처럼 간단합니다. 이는 잘못된 변수가 사용되었기 때문일 수 있습니다.
으아악이 문제를 테스트하는 또 다른 방법은 수신자 값을
으아악mail()
함수 호출에 하드코딩하는 것입니다.모든
mail()
매개변수에 적용할 수 있습니다.여러 계정으로 보내기
이메일 계정 문제를 해결하려면 다양한 이메일 제공업체의 여러 이메일 계정으로 이메일을 보내세요. . 귀하의 이메일이 사용자의 Gmail 계정에 도달하지 못하는 경우 동일한 이메일을 Yahoo 계정, Hotmail 계정 및 일반 POP3 계정(예: ISP에서 제공하는 이메일 계정)으로 보내십시오.
이메일이 다른 이메일 계정 전체 또는 일부에 도착하는 경우 코드가 이메일을 보내고 있다는 것을 알 수 있지만 이메일 계정 제공업체가 어떤 이유로 해당 계정을 차단했을 수 있습니다. 이메일이 어떤 이메일 계정에도 도착하지 않으면 코드와 관련된 문제일 가능성이 높습니다.
코드가 양식 방법과 일치하는지 확인하세요
양식 방법을
POST
,请确保使用$_POST
查找表单值。如果您已将其设置为GET
或根本没有设置,请确保使用$_GET
으로 설정한 경우 양식 값을 찾습니다.양식
action
값이 올바른 위치를 가리키는지 확인하세요양식
으아악action
속성에 PHP 메일 코드를 가리키는 값이 포함되어 있는지 확인하세요.웹 호스트가 이메일 전송을 지원하는지 확인하세요
일부 웹 호스팅 제공업체에서는 서버를 통한 이메일 전송을 허용하거나 활성화하지 않습니다. 그 이유는 다양할 수 있지만 이메일 전송을 차단하는 경우 이러한 이메일을 귀하에게 보내는 타사 대안을 사용해야 합니다.
온라인 지원 또는 FAQ를 방문한 후 기술 지원팀에 이메일을 보내면 서버에서 이메일 기능을 사용할 수 있는지 여부를 명확히 알 수 있습니다.
localhost
메일 서버가 구성되어 있는지 확인하세요WAMP, MAMP 또는 XAMPP를 사용하여 로컬 워크스테이션에서 개발하는 경우 워크스테이션에 이메일 서버가 설치되어 있지 않을 수 있습니다. 그렇지 않으면 PHP는 기본적으로 이메일을 보낼 수 없습니다.
기본 메일 서버를 설치하면 이 문제를 극복할 수 있습니다. Windows의 경우 무료 Mercury Mail을 사용할 수 있습니다.
SMTP를 사용하여 이메일을 보낼 수도 있습니다. 이 작업을 수행하는 방법을 알아보려면 >Vikas Dwivedi의 훌륭한 답변을 참조하세요.
PHP 사용자 정의 활성화mail.log
기능의 특정 로깅
자세한 내용은mail()
을 활성화할 수도 있습니다. 전체 SMTP 상호 작용을 기록하지는 않지만 최소한 함수 호출 매개변수와 호출 스크립트는 기록합니다. 으아악http://php.net/manual/en/mail.configuration.php 을 참조하세요. (에서 이러한 옵션을 활성화하는 것이 더 좋습니다.)
메일 테스트 서비스 확인php.ini
或.user.ini
或.htaccess
기능은 편리하고 일반적으로 작업을 완료하지만
mail()
단점이 있습니다. 다행히 위에서 언급한 많은 문제를 처리하는 것을 포함하여 더 많은 성능과 유연성을 제공하는 대안이 있습니다.이 모든 기능은 전문 SMTP 서버/서비스 제공업체와 연계하여 사용할 수 있습니다. (일반적인 8월 15일 공유 웹 호스팅 계획은 이메일 설정/구성 가능성에 영향을 미치거나 실패하기 때문입니다.)