PHP 메일 기능이 이메일 전송을 완료하지 못함

Jul 09 2014
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = '[email protected]';
    $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페이지에 있지만 thankyou.php위의 PHP 코드가 삽입 된 별도의 "제출해 주셔서 감사합니다"페이지에 제출 됩니다. 코드는 완벽하게 제출되지만 이메일을 보내지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

533 JohnConde Jul 09 2014 at 09:21

이 답변의 일부가 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()매개 변수가 3 개 이상 없으면 실패합니다.

에 대한 호출에 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" <[email protected]>.
  • [email protected][email protected]과 같은 악용 계정을 모니터링합니다. 즉, 이러한 계정이 존재하는지 확인하고, 전송 된 내용을 읽고, 불만 사항에 대해 조치를 취해야합니다.
  • 마지막으로 구독 취소를 정말 쉽게 만드세요 . 그렇지 않으면 사용자가 스팸 버튼 을 눌러 구독을 취소하고 평판에 영향을 미칩니다.

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

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

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

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

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

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

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

가짜 From:발신자를 사용하지 마세요.

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

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

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

수신자 값이 올바른지 확인

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

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

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

mail('[email protected]', $subject, $message, $headers); 

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

여러 계정으로 보내기

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

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

코드가 양식 방법과 일치하는지 확인

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

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

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

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

웹 호스트가 이메일 전송을 지원하는지 확인

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

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

localhost메일 서버가 구성 되었는지 확인

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 공유 웹 호스팅 계획은 이메일 설정 / 구성 가능성과 관련하여 적중하거나 놓치기 때문입니다.)

39 er.irfankhan11 Jul 27 2015 at 21:01

메일 기능에 메일 헤더를 추가하십시오.

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}
25 sonamgupta May 20 2015 at 20:23
  1. 항상 메일 기능에서 헤더를 보내십시오.
  2. localhost를 통해 메일을 보내는 경우 메일을 보내기위한 SMTP 설정을 수행하십시오.
  3. 서버를 통해 메일을 보내는 경우 서버에서 이메일 전송 기능이 활성화되어 있는지 확인하십시오.
21 oneDerer Jul 09 2014 at 09:55

이메일을 보내기 위해 SMTP 구성을 사용하는 경우 대신 PHPMailer 를 사용해보십시오 . https://github.com/PHPMailer/PHPMailer 에서 라이브러리를 다운로드 할 수 있습니다 .

이 방법으로 보내는 이메일을 만들었습니다.

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}
17 user1258544 Jul 09 2014 at 10:22

메일을 보내기 전에 헤더를 추가하세요.

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

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

그리고 하나 더. mail()기능은 로컬 호스트에서 작동하지 않습니다. 코드를 서버에 업로드하고 시도하십시오.

13 bat.t Sep 29 2015 at 21:25

다음을 수행하여 000webhost에서 나를 위해 일했습니다.

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

이메일을 보낼 때 이메일 주소를 직접 입력하십시오.

mail('[email protected]', $subject, $message, $headers)

사용 ''하지 않고 "".

이 코드는 작동하지만 이메일은 30 분의 지연으로 수신되었습니다.

10 Karthik Jun 23 2016 at 16:02

대부분이 mail()기능은 공유 호스팅에서 비활성화됩니다. 더 나은 옵션은 SMTP를 사용하는 것입니다. 가장 좋은 옵션은 Gmail 또는 SendGrid입니다.


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
9 iatboy Aug 05 2014 at 10:49

mail()함수 만 사용하는 경우 구성 파일을 완료해야합니다.

메일 확장을 열고 SMTP smtp_port등, 가장 중요한 사용자 이름과 비밀번호를 설정해야합니다. 그렇지 않으면 메일을 보낼 수 없습니다. 또한 PHPMail클래스를 사용하여 보낼 수 있습니다.

9 vldfr Feb 11 2015 at 22:20

다음 두 가지를 별도로 또는 함께 시도하십시오.

  1. 제거 if($_POST['submit']){}
  2. 제거 $from(내 직감)
8 StephenM Jan 03 2015 at 09:32

나는 이것이 트릭을해야한다고 생각한다. 방금 if(issetPHP를 HTML에서 분리하기 위해 본문의 변수에 연결을 추가하고 추가했습니다.

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

if (isset($_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>'; 
    }
}

?>
8 Machavity May 20 2016 at 19:45

앞으로 이것을 발견하는 사람에게는 mail. 이것에 대한 답변이 있지만 그 이유 는 아닙니다.

PHP의 mail기능은 불투명 할뿐만 아니라 작업을 수행하기 위해 사용 하는 MTA (예 : Sendmail ) 에 전적으로 의존 합니다. mail것입니다 MTA가 그것을 받아 들일에 실패 할 경우 당신에게 (당신이 보내려고 할 때 즉, Sendmail은 아래이었다). 메일이 전달 되었기 때문에 성공했는지 알 수 없습니다. 따라서 ( John Conde의 답변 세부 정보와 같이) 이제 MTA 로그를 조작하고 수정 실패에 대해 충분히 알려주기를 바랍니다. 공유 호스트에 있거나 MTA 로그에 액세스 할 수없는 경우 운이 좋지 않습니다. 슬프게도 대부분의 Linux 용 바닐라 설치의 기본값은 이러한 방식으로 처리합니다.

메일 라이브러리 ( PHPMailer , Zend Framework 2+ 등)는 mail. 그들은 수신 메일 서버에 직접 소켓을 열고 해당 소켓을 통해 직접 SMTP 메일 명령을 보냅니다. 즉, 클래스는 자체 MTA 역할을합니다 (라이브러리 mail에 궁극적으로 메일을 보내는 데 사용할 수 있지만 그렇게하지 않는 것이 좋습니다).

즉, 수신 서버의 응답을 직접 볼 수 있습니다 (예를 들어 PHPMailer 에서 디버깅 출력을 켤 수 있음 ). 메일이 전송되지 않았는지, 왜 그런지 더 이상 추측하지 않아도됩니다.

SMTP를 사용하는 경우 (예 :를 호출하는 경우 isSMTP()) SMTPDebug속성을 사용하여 SMTP 대화에 대한 자세한 내용을 얻을 수 있습니다 .

스크립트에 다음과 같은 줄을 포함하여이 옵션을 설정합니다.

$mail->SMTPDebug = 2;

또한 더 나은 인터페이스의 이점을 얻을 수 있습니다. 으로 mail당신이 라이브러리를 등 모든 헤더, 첨부 파일을 설정해야합니다, 당신은 할 수있는 전용 기능을 가지고있다. 또한 함수가 헤더와 같은 까다로운 부분을 모두 수행하고 있음을 의미합니다.

6 Chiragpatel Jul 13 2015 at 14:27
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
6 dEsta88 Oct 07 2014 at 05:33

CodeIgniter의 구성 이메일을 사용할 수 있습니다 . 예를 들어, SMTP 사용 (간단한 방법) :

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => '[email protected]',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('[email protected]', 'Title');
$this->email->to('[email protected]');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

그것은 나를 위해 작동합니다!

4 GauravSirauthiya Jun 23 2015 at 17:58

이 시도

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}
4 JackCh Mar 20 2018 at 02:09

문제는 메일 서버의 구성 일 수 있습니다. 이러한 유형의 문제를 피하거나 메일 서버 문제에 대해 걱정할 필요가없는 경우 PHPMailer 를 사용하는 것이 좋습니다 .

메일을 보내는 데 필요한 모든 것이 포함 된 플러그인이며, 고려해야 할 사항은 SMTP 포트 (포트 : 25 및 465)를 활성화하는 것입니다.

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = '[email protected]';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('[email protected]', 'my name');
    $mail->addAddress('[email protected]');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}
3 Daniel Sep 24 2017 at 10:50

서버에 Sendmail이 설치되어 있는지 확인하십시오.

코드를 확인하고 거기에 잘못된 것이 없는지 확인한 경우 / var / mail로 이동하여 해당 폴더가 비어 있는지 확인하십시오.

비어있는 경우 다음을 수행해야합니다.

sudo apt-get install sendmail

Ubuntu 서버에있는 경우.

3 aidangig Jan 31 2016 at 21:15

우선, mail () 함수에 너무 많은 매개 변수가있을 수 있습니다. 최대 5 개까지 가질 수 있습니다. mail(to, subject, message, headers, parameters);

마찬가지로 지금까지로 $from당신의 리눅스 사용하는 경우 변수가 간다, 그것은 자동으로 웹 호스트에서 와야 의 cPanel을 . cPanel 사용자 이름과 IP 주소에서 자동으로 제공됩니다.

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

또한 mail () 함수에 올바른 순서의 변수가 있는지 확인하십시오.

mail($to, $subject, $message, etc.)순서대로, 그렇지 않으면 작동하지의 기회가있다.

3 JohnSlegers Feb 10 2016 at 20:23

PHP로 메일을 보내는 데 문제가있는 경우 PHPMailer 또는 SwiftMailer 와 같은 대안을 고려 하십시오 .

저는 보통 PHP로 메일을 보낼 때마다 SwiftMailer를 사용합니다.


기본 사용법 :

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

참조 공식 문서를 SwiftMailer을 사용하는 방법에 대한 자세한 내용은.

3 user3132194 Jun 21 2017 at 19:07

외부 메일러를 사용하지 않고 전용 Linux 서버에서 mail ()을 사용하려는 사람들을 위해.

PHP가 메일을 보내는 방법 php.ini은 섹션에 설명 되어 있습니다 [mail function].

매개 변수 sendmail-path는 sendmail이 호출되는 방법을 설명합니다. 기본값은 sendmail -t -i이므로 sendmail -t -i < message.txtLinux 콘솔에서 작업 하면 완료됩니다. mail.log디버그에 추가 하고 mail ()이 실제로 호출되는지 확인할 수도 있습니다 .

다른 MTA에서 sendmail. 그들은 그 이름으로 바이너리에 대한 심볼릭 링크를 만듭니다. 예를 들어 Debian 에서 기본값은 Postfix 입니다. 메일을 보내도록 MTA를 구성하고 sendmail -v -t -i < message.txt. 파일 message.txt에는 메시지의 모든 헤더와 본문이 포함되어야하며 봉투의 대상 주소는 To:헤더 에서 가져옵니다 . 예:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

ssmtp 를 MTA 로 사용하는 것을 선호합니다. 간단하고 열린 포트로 데몬을 실행할 필요가 없기 때문입니다. ssmtp는 localhost 에서 메일을 보내는 경우에만 적합합니다 . 또한 공용 메일 서비스의 계정을 통해 인증 된 이메일을 보낼 수 있습니다. ssmtp를 설치하고 구성 파일을 편집합니다 /etc/ssmtp/ssmtp.conf. Unix 계정으로 로컬 시스템 메일을 수신 할 수도 있습니다 (예 : cron 작업에서 루트에 대한 경고) 구성 /etc/ssmtp/revaliases파일.

Yandex 메일의 내 계정 구성은 다음과 같습니다.

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
2 TonyLuigiC Apr 05 2017 at 08:09

이것은 소수의 사용자에게만 영향을 미칠 것이지만, 그 소수에 대해 문서화하고 싶습니다. 이 소수의 구성원은이 문제로 인해 작동하는 PHP 메일 스크립트 문제를 해결하는 데 6 시간을 보냈습니다.

www.AceITLab.com에서 XAMPP를 실행하는 대학에 가려면 교수가 말하지 않은 내용을 알아야합니다. AceITLab 방화벽 (Windows 방화벽이 아님)은 XAMPP에서 MercuryMail을 차단합니다. 대체 메일 클라이언트를 사용해야합니다. 배가 우리를 위해 일하고 있습니다. 보안 설정이 낮은 Gmail 계정으로 보내야합니다.

예, 이것은 실제 이메일에는 전혀 쓸모가 없습니다. 그러나 내가 본 것에서 학문적 환경과 현실 세계는 종종 소중한 공통점이 거의 없습니다.

1 Ron Apr 01 2017 at 10:30

이 코드를 로컬 서버 (예 : 개발 목적의 컴퓨터)에서 실행하는 경우 수신자에게 이메일을 보내지 않습니다. .txt라는 폴더에 파일 이 생성됩니다 mailoutput.

같은 경우 당신은 무료로 뿌리고 서비스를 사용하는 경우 000webhosthostinger, 그러한 서비스 제공이 불가능하게 mail()당신이 그들이이 기능을 지원 여부를 확인하기 위해 그들에게 연락하는 것을 선호 등 이메일 스푸핑, 스팸의 의도하지 않은 사용을 방지하는 기능을.

서비스 제공자가 mail () 함수를 지원한다고 확신하는 경우이 PHP 매뉴얼에서 추가 참조를 확인할 수 있습니다.

PHP 메일 ()

호스팅 서비스에서 mail () 함수를 지원하는 날씨를 확인하려면 다음 코드를 실행 해보 십시오 (수신자 이메일 주소 변경을 잊지 마십시오 ) .

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>
1 BadLoser Aug 21 2019 at 16:14

데비안 10.0.0 ( 'Buster') 용 Sendmail 설치는 사실 사소한 일이었습니다!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

표준 sendmail 패키지 설치 ( '보내기'허용) :

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

기타 유용한 명령 :

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

확인 (전송 능력)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

위의 작업은 약 5 분이 소요되었습니다. 그 다음 5 시간을 낭비했습니다 . 스팸 폴더를 확인하는 것을 잊지 마십시오 !

SuReSh Apr 28 2015 at 13:08

몇 가지 가능성이 있습니다.

  1. 서버 문제에 직면 해 있습니다. 서버에 메일 서버가 없습니다. 따라서 코드가 정상이고 메일이 유형과 함께 작동하기 때문에 메일이 작동하지 않습니다.

  2. 게시 된 가치를 얻지 못했습니다. 정적 값으로 코드를 시도하십시오.

  3. SMTP 메일을 사용하여 메일 보내기 ...

krishna Dec 23 2018 at 21:25

다음과 같은 방법으로 오류를 확인할 수 있습니다.

error_reporting(E_ALL);

내 샘플 코드는 다음과 같습니다.

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = '[email protected]';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>
ofricofri Aug 16 2020 at 08:44

Hostgator에서 호스팅되는 앱에 갇혀 있다면 이것이 내 문제를 해결 한 것입니다. 자세한 솔루션을 게시 한 사람에게 감사합니다. 링크가 언젠가 오프라인 상태가되는 경우 요약이 표시됩니다.

  • 서버에서 sendmail 경로를 찾으십시오. 이를 확인하는 간단한 방법은 생성 된 정보를 읽기 위해 사용자 만 액세스 할 페이지에 다음 코드를 임시로 작성하는 것 <?php phpinfo(); ?>입니다. 이 페이지를 열고 sendmail path. (그런 다음이 코드를 제거하는 것을 잊지 마십시오!)
  • 문제 및 수정 : sendmail 경로가 'only' -t -i인 경우 서버를 편집 php.ini하고 다음 행을 추가하십시오.sendmail_path = /usr/sbin/sendmail -t -i;

그런데 PHP mail()기능으로 메일을 보낼 수있게 된 후 인증되지 않은 메일을 보낸다는 것을 알게되어 또 다른 문제가 발생했습니다. 이메일은 모두 내 Hotmail의 정크 메일함에 들어갔고 일부 이메일은 전달되지 않았는데, 이는 인증되지 않은 사실과 관련이있는 것 같습니다. 그래서 결국 SMTP 에서 mail()로 전환하기로 결정했습니다 PHPMailer.