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
합니다" 인 "제출해 주셔서 감사합니다.thankyou.php
PHP를 사용하다코드는 완벽하게 전송되지만 이메일은 전송되지 않습니다.떻게하 하칠 ?칠? ????
에는 ''의요.mail()
이러한 트러블 슈팅 순서의 대부분은, 모든 PHP 메일 시스템에 적용할 수 있습니다.
스크립트가 전자 메일을 보내지 않는 것으로 보이는 다양한 이유가 있습니다.명백한 구문 오류가 없는 한 이러한 것들을 진단하는 것은 어렵습니다.이 체크리스트를 사용하지 않으면 다음 체크리스트에서 잠재적인 함정을 찾을 필요가 있습니다.
에러 리포트가 유효하게 되어 있는 것을 확인해, 모든 에러를 리포트 하도록 설정합니다.
에러 리포트는, 코드의 버그와 PHP에서 발생하는 일반적인 에러를 뿌리 뽑는데 불가결합니다.이러한 에러를 수신하려면 , 에러 리포트를 유효하게 할 필요가 있습니다.다음 코드를 PHP 파일(또는 마스터 구성 파일)의 맨 위에 배치하면 오류 보고가 활성화됩니다.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
PHP에서 유용한 오류 메시지를 얻는 방법을 참조하십시오.- 자세한 내용은 이 답변을 참조하십시오.
하세요.mail()
을 '함수'라고 .
, 는 실제로 이 글자를 입니다.mail()
기능을 합니다.코멘트 아웃하지 않고, 거기에 있는 것을 확인해 주세요.
하세요.mail()
불리고 있습니다.
bool mail (string $to, string $syslog, string $message [, string $syslogal_parameters ])
메일 기능에는 3개의 필수 파라미터와 옵션으로 4번째 파라미터와 5번째 파라미터가 있습니다.의 :mail()
3번입니다.
의 :mail()
올바른 순서로 올바른 파라미터가 설정되어 있지 않은 경우에도 실패합니다.
서버의 메일 로그를 확인합니다.
웹 서버가 웹 서버를 통해 전자 메일을 보내려는 모든 시도를 기록합니다.가 있을 수).으로 로그는 .다만, 통상은, 다음의 유저의 루트 디렉토리에 있습니다.logs
메일 송신 시도와 관련하여 서버가 보고한 오류 메시지가 포함되어 있습니다.
포트 연결 실패 여부를 확인합니다.
포트 블록은 대부분의 개발자가 SMTP를 사용하여 이메일을 전송하기 위해 코드를 통합하면서 직면하는 매우 일반적인 문제이며, 이는 서버 메일로그에서 쉽게 추적할 수 있습니다(위에서 설명한 바와 같이 메일 로그 서버의 위치는 서버마다 다를 수 있습니다).공유 호스팅 서버에 있는 경우 포트 25 및 587은 기본적으로 차단된 상태로 유지됩니다.이 블록은 호스팅 공급자가 의도적으로 한 것입니다.일부 전용 서버에서도 마찬가지입니다.이러한 포토가 블록 되어 있는 경우는, 포토 2525 를 사용해 접속해 주세요.해당 포트도 차단되어 있는 경우 유일한 해결책은 호스팅 공급자에게 연락하여 이러한 포트의 차단을 해제하는 것입니다.
대부분의 호스팅 공급자는 네트워크를 스팸 전자 메일 전송으로부터 보호하기 위해 이러한 전자 메일 포트를 차단합니다.
플레인/TLS 연결에는 포트 25 또는 587을 사용하고 SSL 연결에는 포트 465를 사용합니다.대부분의 사용자에게는 일부 호스팅 공급자에 의해 설정된 환율 제한을 피하기 위해 포트 587을 사용하는 것이 좋습니다.
오류 억제 연산자 사용 안 함
오류 억제 연산자가 @
PHP 식 앞에 추가되어 있으면 해당 식에 의해 생성될 수 있는 오류 메시지는 무시됩니다.이 오퍼레이터를 사용할 필요가 있지만 메일 발송은 필요하지 않습니다.
에 음음음음이 포함되어 @mail(...)
디버깅에 도움이 되는 중요한 오류 메시지를 숨기고 있을 수 있습니다.를제 remove remove remove를 remove remove 를 remove 。@
이치노
mail()
(return value)
기능:
TRUE
배달된 , 약메면면면면면면면면면면면면면면면면면면면면면 if if if if if if.FALSE
그렇지않으면.중요한 점은 메일이 배달용으로 수락되었다고 해서 메일이 실제로 목적지에 도착한다는 것을 의미하지 않습니다.
이는 다음과 같은 이유로 중요합니다.
- 「 」를
FALSE
반환 값은 서버가 메일을 승인하는 데 오류가 있다는 것을 알고 있습니다.이것은 코딩 문제가 아니라 서버 구성 문제일 수 있습니다.시스템 관리자에게 문의하여 이 문제가 발생하는 원인을 확인해야 합니다. - 「 」를
TRUE
반환값. 이메일이 확실하게 발송되는 것은 아닙니다.이는 이메일이 PHP에 의해 서버상의 해당 핸들러로 정상적으로 전송되었음을 의미합니다.PHP의 제어권 밖에는 이메일이 전송되지 않는 원인이 될 수 있는 더 많은 장애점이 있습니다.
★★★★★★★★★★★★★★★★★.FALSE
올바른 방향으로 인도하는 데 도움이 됩니다.TRUE
반드시 이메일이 정상적으로 송신된 것은 아닙니다.이것은 매우 중요합니다!
호스팅 공급자가 이메일 발송을 허용하고 메일 발송을 제한하지 않는지 확인하십시오.
많은 공유 웹 호스트, 특히 무료 웹 호스트 공급자는 서버에서 전자 메일을 보내는 것을 허용하지 않거나 지정된 기간 동안 보낼 수 있는 양을 제한합니다.이는 스팸 발송자가 저렴한 서비스를 이용하는 것을 제한하려는 노력 때문이다.
호스트에 e-메일 제한이 있다고 생각되거나 e-메일 전송을 차단하는 경우 FAQ를 확인하여 이러한 제한이 나열되어 있는지 확인하십시오.그렇지 않은 경우 이메일 전송에 대한 제한이 있는지 확인하기 위해 지원팀에 문의해야 할 수 있습니다.
스팸 폴더를 확인하여 이메일이 스팸으로 플래그 지정되지 않도록 합니다.
여러 가지 이유로 인해 PHP(및 기타 서버 측 프로그래밍 언어)를 통해 전송되는 이메일은 수신자의 스팸 폴더에 저장되는 경우가 많습니다.코드의 트러블 슈팅을 실시하기 전에, 반드시 여기를 확인해 주세요.
PHP를 통해 전송되는 메일이 수신자의 스팸 폴더로 전송되는 것을 방지하기 위해, PHP 코드와 그 외의 방법으로 이메일이 스팸으로 마크될 가능성을 최소화하기 위해 다양한 작업을 수행할 수 있습니다.Michiel de Mare의 좋은 팁은 다음과 같습니다.
- SPF 및 DKIM 등의 전자 메일 인증 방법을 사용하여 전자 메일과 도메인 이름이 함께 속해 있음을 증명하고 도메인 이름의 스푸핑을 방지합니다.SPF 웹 사이트에는 사이트의 DNS 정보를 생성하는 마법사가 포함되어 있습니다.
- 역 DNS를 확인하여 메일 서버의 IP 주소가 메일 발송에 사용하는 도메인 이름을 가리키는지 확인합니다.
- 사용하고 있는 IP 주소가 블랙리스트에 없는 것을 확인합니다.
- 회신처 주소가 유효한 기존 주소인지 확인하십시오.
- " " " " " " " " " " " " " " " " "합니다.
"John Smith" <john@blacksmiths-international.com>
를 참조해 주세요.- 계정을 .
abuse@yourdomain.example
★★★★★★★★★★★★★★★★★」postmaster@yourdomain.example
즉, 이러한 계정이 존재하는지 확인하고, 전송된 내용을 읽고, 불만 사항에 대처합니다.- 마지막으로, 구독 해제를 정말 쉽게 하세요.그렇지 않으면 스팸 버튼을 눌러 사용자의 구독을 취소하여 사용자의 평판에 영향을 미칩니다.
프로그래밍 방식으로 보낸 전자 메일이 자동으로 스팸으로 표시되지 않도록 하려면 어떻게 해야 합니까?를 참조하십시오.자세한 것은, 을 참조해 주세요.
모든 메일 헤더가 제공되었는지 확인합니다.
일부 스팸 소프트웨어는 "보낸 사람" 및 "회신 대상"과 같은 공통 헤더가 없는 경우 메일을 거부합니다.
$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:
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
수신자 값이 올바른지 확인하십시오.
이메일 수신자의 값이 잘못되어 있는 것처럼 문제가 간단할 수 있습니다.이는 잘못된 변수를 사용했기 때문일 수 있습니다.
$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 제공 이메일 계정 등)으로 보냅니다.
전자 메일이 다른 전자 메일 계정의 전부 또는 일부에 도착하면 코드가 전자 메일을 보내고 있음을 알 수 있지만 전자 메일 계정 공급자가 어떤 이유로 전자 메일을 차단하고 있을 수 있습니다.e-메일이 어느 e-메일 계정에도 도착하지 않으면 코드와 관련된 문제일 가능성이 높습니다.
코드가 폼 메서드와 일치하는지 확인합니다.
를 양음음음음으로 설정한 POST
하시길 바랍니다.$_POST
폼 값을 검색합니다.「 」로 되어 있는 .GET
전혀 않은 경우 하세요.$_GET
폼 값을 검색합니다.
을 잡으세요.action
rect (적절한 로케이션)
을 잡으세요.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의 로그 파일 외에도 특정 기능에 대한 로깅을 활성화할 수 있습니다.완전한 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/웹 서버 설정을 테스트하기 위해 사용할 수 있는 다양한 전송 및 스팸성 검사 서비스가 있습니다.일반적으로 메일 시도 수신인: 주소를 보낸 후 나중에 배달 보고서와 보다 구체적인 오류 또는 분석을 받습니다.
- mail-backets.mails(무료/무료)
- glockapps.com (무료/$$)
- senforensics.com (가입/$$)
- mailtrap.io (프로/$$)
- 울트라툴/…/emailTest (무료/MX 체크만)
- 각종 : http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
다른 메일러 사용
PHP 장내mail()
기능은 편리하고 종종 일을 완수하지만 단점도 있다.다행히 위에서 설명한 많은 문제를 처리하는 등 더 강력한 성능과 유연성을 제공하는 대안이 있습니다.
이 모든 것을 프로페셔널 SMTP 서버/서비스 프로바이더와 조합할 수 있습니다.(일반적으로 이메일 셋업/구성 시 08/15 공유 웹호스팅 계획이 히트/실패하기 때문입니다.
메일 기능에 메일 머리글 추가:
$header = "From: noreply@example.com\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>';
}
- 메일 기능에서는 항상 헤더를 송신해 주세요.
- localhost를 통해 메일을 발송하는 경우 메일 발송에 대한 SMTP 설정을 수행합니다.
- 서버를 통해 메일을 발송하는 경우 이메일 발송 기능이 서버에서 사용 가능한지 확인하십시오.
전자 메일의 송신에 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 = "me@walalang.com";
$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";
}
메일을 보내기 전에 일부 머리글만 추가하십시오.
<?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";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
★★★★★★★★★★★★★★★★★★★★★★★★mail()
로컬 호스트코드를 서버에 업로드하고 시도해 보십시오.
다음과 같은 방법으로 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@gmail.com', $subject, $message, $headers)
''
and""
.
이 코드는 기능하지만 이메일이 30분 늦게 수신되었습니다.
★★★★mail()
공유 호스팅에서는 기능이 비활성화되어 있습니다.SMTP の [ SMTP ]Gmail SendGrid 。
SMTP config.php
<?php
$SmtpServer="smtp.*.*";
$SmtpPort="2525"; //default
$SmtpUser="***";
$SmtpPass="***";
?>
SMTP 메일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();
}
?>
" " " 을 mail()
설정
, 확장 기능을 하셔야 합니다.SMTP smtp_port
그리고 가장 중요한 것은 사용자 이름과 비밀번호입니다.게게없없없없우우우우우수요요요요요요요 。 ,을 할 수 .PHPMail
송신하는 클래스.
다음 두 가지를 따로따로 시험해 보십시오.
- 제거하다
if($_POST['submit']){}
$from
만) (내 직감만)
이거면 될 것 같아. 방방 an an an an an an an an를 했습니다.if(isset
PHP와 HTML을 분리하기 위해 본문의 변수에 연결을 추가했습니다.
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$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>';
}
}
?>
으로 이 .mail
이에 대한 해답은 몇 가지 있지만, 그 이유는 알 수 없습니다.
PHP†mail
함수는 불투명할 뿐만 아니라 작업을 수행하기 위해 사용하는 MTA(즉, Sendmail)에 전적으로 의존합니다. mail
는 MTA가 수신에 실패했을 경우에만 통지합니다(즉, 송신하려고 했을 때 Sendmail이 다운되었습니다).메일이 전달되었기 때문에 메일이 성공했는지 여부를 알려줄 수 없습니다.(John Conde의 답변에 대한 자세한 내용과 같이) 이제 MTA 로그를 만지작거릴 수 있게 되었습니다.또, MTA 의 로그가 수정의 실패에 대해 충분한 정보를 얻을 수 있기를 바랍니다.공유 호스트에 있거나 MTA 로그에 액세스할 수 없는 경우 운이 없습니다.안타깝게도 Linux용 대부분의 바닐라 설치는 이러한 방식으로 처리됩니다.
메일 라이브러리(PHPMailer, Zend Framework 2+ 등)는 다음과 매우 다른 기능을 수행합니다.mail
수신 메일 서버에 직접 소켓을 열고 그 소켓을 통해 SMTP 메일명령어를 직접 전송합니다.에 「MTA」를 할 수 ).mail
최종적으로는 메일을 송신할 수 있습니다만, 그렇게 하지 않는 것을 강하게 추천합니다.
즉, 수신측 서버로부터의 응답을 직접 확인할 수 있습니다(예를 들면, PHPMailer 에서는 디버깅 출력을 유효하게 할 수 있습니다).메일의 송신에 실패했는지, 또는 왜 실패했는지는 추측할 수 없습니다.
를 하고 있는 SMTP 를 호출하고 ).
isSMTP()
한 내용은, 「」, 「SMTP」를 할 수 .SMTPDebug
★★★★★★★★★★★★★★★★★★.스크립트에 다음과 같은 행을 포함하여 이 옵션을 설정합니다.
$mail->SMTPDebug = 2;
또, 보다 뛰어난 인터페이스의 이점도 얻을 수 있습니다. With 와 함께mail
헤더, 첨부 파일을 설정해야 합니다. 첨부 파일을 설정해야 합니다.모든 헤더, 첨부 파일 등을 설정해야 합니다.도서관을 통해, 당신은 그것을 할 수 있도록 전용 기능을 가지고 있습니다.라이브러리의 경우 이를 위한 전용 기능이 있습니다.이 기능은 모든 까다로운 부품( 헤더와 같은 헤더)을 하고 있습니다.또한 이 함수는 모든 까다로운 부분(헤더 등)을 처리하고 있음을 의미합니다.
$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>";
}
설정 이메일은 CodeIgniter별로 사용할 수 있습니다.예를 들어 SMTP(간단한 방법)를 사용하는 경우:
$config = Array(
'protocol' => 'smtp',
'smtp_host' => 'mail.domain.com', // Your SMTP host
'smtp_port' => 26, // Default port for SMTP
'smtp_user' => 'name@domain.com',
'smtp_pass' => 'password',
'mailtype' => 'html',
'charset' => 'iso-8859-1',
'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);
if($this->email->send())
{
// Conditional true
}
나에게는 그게 효과가 있어요!
이거 드셔보세요
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>
';
}
}
메일 서버의 설정이 문제인 것 같습니다.이러한 문제를 회피하거나 메일 서버 문제를 걱정할 필요가 없다면 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 = 'correo@gmail.com';
$mail->Password = 'contrasenia';
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
// Recipients
$mail->setFrom('correo@gmail.com', 'my name');
$mail->addAddress('destination@correo.com');
// 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;
}
우선 메일() 기능을 위해 메일() 기능을 사용할 수 있습니다.우선 mail() 함수에 대한 파라미터가 너무 많을 수 있습니다. You are able to have of maximum of five, 최대 5개를 가질 수 있습니다.mail(to, subject, message, headers, parameters);
위 에 서 as내 far the as$from
Linux cPanel을 사용하는 경우 웹 호스트에서 자동으로 전송됩니다.자동으로 cPanel 사용자 이름과 IP 주소에서 가져옵니다.
$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";
또한 mail() 함수에 올바른 변수 순서가 있는지 확인하십시오.
mail($to, $subject, $message, etc.)
그렇지 않으면 작동하지 않을 수 있습니다.
이것은 소수의 사용자에게만 영향을 미치지만, 그 소수의 사용자에게는 문서화해 주었으면 합니다.이 작은 한 줌의 멤버는 이 문제로 인해 PHP 메일스크립트가 작동하는 문제를 해결하기 위해 6시간을 소비했습니다.
만약 당신이 www.AceITLab.com에서 XAMPP를 운영하는 대학에 간다면, 당신은 교수님이 우리에게 말하지 않은 것을 알아야 합니다.에이스ITLab 방화벽(Windows 방화벽이 아님)은 XAMPP에서 Mercury Mail을 차단합니다.다른 메일 클라이언트를 이용하셔야 합니다.배는 우리를 위해 일하고 있습니다.보안 설정이 낮은 Gmail 계정으로 전송해야 합니다.
네, 알아요. 이건 진짜 이메일에는 전혀 쓸모가 없어요.하지만 내가 본 바로는 학업 환경과 현실 세계는 종종 소중한 공통점을 거의 가지고 있지 않다.
서버에 Sendmail이 설치되어 있는지 확인합니다.
코드를 확인하고 문제가 없음을 확인했으면 /var/mail로 이동하여 해당 폴더가 비어 있는지 확인합니다.
비어 있는 경우 다음을 수행해야 합니다.
sudo apt-get install sendmail
Ubuntu 서버에 있는 경우.
외부 메일러를 사용하지 않고 전용 Linux 서버에서 메일()을 보내고 싶은 사용자용.
메일의 는, PHP 의 「PHP 의 메일 방법」에 기재되어 .php.ini
[mail function]
.
'''sendmail-path
sendmail 호호 호호 방mail mailmail mailmail다 다mailmail다은 '하다'입니다.sendmail -t -i
' 있다', '일하고 ', '일하고 있다' 이런 거 sendmail -t -i < message.txt
Linux 솔 linux linux linux linux linux linux linux linux 。 '하다'를 붙일 도 있어요.mail.log
mail호출되고 합니다.
가능한 MTA는 다음과 같이 MTA를 사용할 수 .sendmail
그 이름에 있는 바이너리에 대한 상징적 링크를 만들 뿐입니다.예를 들어 Debian의 기본값은 Postfix입니다.메일을 전송하도록 MTA를 설정하고 콘솔에서 테스트합니다.sendmail -v -t -i < message.txt
.파일message.txt
는, 을 포함할 가 있습니다.봉투의 는, 「메시지의 행선지 주소」로부터됩니다.이치노To:
머리글를를: :
From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.
Text body.
ssmtp는 단순하고 열린 포트로 데몬을 실행할 필요가 없기 때문에 MTA로 사용하는 것이 좋습니다.smtp는 localhost에서 메일을 보내는 경우에만 적합합니다.또한 공용 메일 서비스의 계정을 통해 인증된 이메일을 보낼 수도 있습니다.ssmtp 설치 및 구성 파일 편집/etc/ssmtp/ssmtp.conf
을 Unix 수를 들어 에 대한 등) Unix 계정을 /etc/ssmtp/revaliases
filename을 클릭합니다.
Yandex 메일 계정 설정은 다음과 같습니다.
root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password
PHP로 메일을 보내는 데 문제가 있다면 PHP 메일러나 재빠르다 Mailer와 같은 대안을 고려해 보십시오.
저는 보통 PHP로 메일을 보낼 때 Swift Mailer를 사용합니다.
기본 사용:
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('jane.doe@gmail.com' => 'Jane Doe'))
// The to address(es)
->setTo(array('frank.stevens@gmail.com' => '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);
}
Swift Mailer 사용 방법에 대한 자세한 내용은 공식 문서를 참조하십시오.
Debian 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시간이나 허비하고...스팸 폴더 확인하는 거 잊지 마!
로컬 서버(개발 목적의 컴퓨터)에서 이 코드를 실행하고 있는 경우는, 수신자에게 전자 메일을 송신하지 않습니다. ★★★★★★.txt
폴더 내의 파일mailoutput
.
서비스를 하고 있는 , 예를 들어 '호싱 서비스 '호싱 서비스', '호싱 서비스' 입니다.000webhost
★★★★★★★★★★★★★★★★★」hostinger
「」를 로 합니다.mail()
기능이 되고 있는지 해 주십시오.이 기능이 지원되고 있는지 문의해 주셨으면 합니다.
서비스 프로바이더가 mail() 함수를 지원하고 있는 것이 확실하다면 이 PHP 매뉴얼을 참조해 주십시오.
호스팅 서비스가 mail() 함수를 지원하는 날씨를 확인하려면 다음 코드를 실행하십시오(수신자 이메일 주소 변경 잊지 마십시오).
<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
?>
.PHPMailer
완벽하게 작동하죠 코드 예시를 들어보죠
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/phpmailer/phpmailer/src/Exception.php';
require 'vendor/phpmailer/phpmailer/src/PHPMailer.php';
require 'vendor/phpmailer/phpmailer/src/SMTP.php';
$editor = $_POST["editor"];
$subject = $_POST["subject"];
$to = $_POST["to"];
try {
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Mailer = "smtp";
$mail->SMTPDebug = 1;
$mail->SMTPAuth = TRUE;
$mail->SMTPSecure = "tls";
$mail->Port = 587;
$mail->Host = "smtp.gmail.com";//using smtp server
$mail->Username = "XXXXXXXXXX@gmail.com";//the email which will send the email
$mail->Password = "XXXXXXXXXX";//the password
$mail->IsHTML(true);
$mail->AddAddress($to, "recipient-name");
$mail->SetFrom("XXXXXXXXXX@gmail.com", "from-name");
$mail->AddReplyTo("XXXXXXXXXX@gmail.com", "reply-to-name");
$mail->Subject = $subject;
$mail->MsgHTML($editor);
if (!$mail->Send()) {
echo "Error while sending Email.";
var_dump($mail);
} else {
echo "Email sent successfully";
}
}
} catch (Exception $e) {
echo $e->getMessage();
}
에러는, 다음의 방법으로 확인할 수 있습니다.
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 = 'someone@gmail.com'; // SMTP username
$mail->Password = 'password'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted
$mail->From = 'someone@gmail.com';
$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';
?>
Hostgator에서 호스팅되는 앱에 갇힌다면, 이것이 제 문제를 해결한 것입니다.자세한 해결책을 게시해 주신 분께 감사드립니다.어느 날 링크가 오프라인이 되었을 경우의 개요는 다음과 같습니다.
- 서버에서 sendmail 경로를 찾습니다.간단하게 확인할 수 있는 방법은 사용자만 액세스할 수 있는 페이지에 일시적으로 다음 코드를 작성하여 생성된 정보를 읽는 것입니다.
<?php phpinfo(); ?>
「 」를sendmail path
이 말아 (</FONT CHANGE:></FONT CHANGE:></FONT CHANGE:></FONT CHANGE:></FONT CHANGE:</FONT CHANGE:>!) - 문제 및 해결: sendmail 경로가 "only"로 표시되는 경우
-t -i
를 편집합니다php.ini
다음 줄을.sendmail_path = /usr/sbin/sendmail -t -i;
PHP로 할 수 있게 된 에는, PHP로 을 송신할 수 있게 되었습니다.mail()
이 기능은 인증되지 않은 이메일을 보낸다는 것을 알게 되었고, 이것이 또 다른 문제를 일으켰습니다.메일은 모두 Hotmail의 정크 메일 박스에 들어가 있고, 일부 메일은 배달되지 않았습니다.이것은 인증되지 않은 것과 관련이 있다고 생각합니다. 나는 래래에서 로 했다.mail()
로로 합니다.PHPMailer
SMTP の smtp smtp smtp smtp 。
$headers의 이 부분에 있는 "From:" $email 주소에 문제가 있을 수 있습니다.
From: \"$name\" <$email>
테스트하려면 다음과 같이 머리글 부분이 없는 전자 메일을 보냅니다.
mail('user@example.com', $subject, $message);
이 경우 메일을 보내려는 시스템에 이미 생성된 이메일 계정을 사용해 보십시오.
<?php
$to = 'name@example.com';
$subject = 'Write your email subject here.';
$message = '
<html>
<head>
<title>Title here</title>
</head>
<body>
<p>Message here</p>
</body>
</html>
';
// Carriage return type (RFC).
$eol = "\r\n";
$headers = "Reply-To: Name <name@example.com>".$eol;
$headers .= "Return-Path: Name <name@example.com>".$eol;
$headers .= "From: Name <name@example.com>".$eol;
$headers .= "Organization: Hostinger".$eol;
$headers .= "MIME-Version: 1.0".$eol;
$headers .= "Content-type: text/html; charset=iso-8859-1".$eol;
$headers .= "X-Priority: 3".$eol;
$headers .= "X-Mailer: PHP".phpversion().$eol;
mail($to, $subject, $message, $headers);
HTML 전자 메일 보내기 전자 메일 메시지를 보내는 동안 HTML 전자 메일을 보낼 MIME 버전, 내용 유형 및 문자 집합을 지정할 수 있습니다.
예 위의 예에서는 HTML 이메일메시지를 name@example.com으로 보냅니다.이 프로그램은 사용자로부터 모든 콘텐츠를 수신한 후 이메일을 발송하도록 코드화할 수 있습니다.
이 문제를 해결한 것은 일부 공급자가 php 메일을 사용할 때 외부 수신자를 허용하지 않는다는 것입니다.
코드의 수신자($수신자)를 로컬 수신자로 변경합니다.즉, 서버 도메인의 이메일 주소를 사용합니다.예를 들어 서버 도메인이 www.yourdomain.com인 경우 수신자의 이메일은 someone@yourdomain.com이어야 합니다.수정된 php 파일을 업로드하고 다시 시도하십시오.그래도 작동하지 않으면 보낸 사람($sender)을 로컬 전자 메일로 변경합니다(수신자에게 사용한 전자 메일과 동일한 전자 메일 사용).수정된 php 파일을 업로드하고 다시 시도하십시오.
도움이 됐으면 좋겠네요!https://www.arclab.com/en/kb/php/how-to-test-and-fix-php-mail-function.html
이런 문제가 있었는데 머리글을 다시 떼어내면 우편물이 발송되는 데 도움이 된다는 것을 알게 되었습니다.그래서 다음과 같이 됩니다.
$headers = "MIME-Version: 1.0;\r\n";
$headers .= "Content-type: text/plain; charset=utf-8;\r\n";
$headers .= "To: ".$recipient."\r\n";
$headers .= "From: ".__SITE_TITLE."\r\n";
$headers .= "Reply-To: ".$sender."\r\n";
다음과 같이 되었습니다.
$headers = "From: ".__SITE_TITLE."\r\n";
$headers .= "Reply-To: ".$sender."\r\n";
To: 헤더는 필요 없습니다.
메일 클라이언트는 URL을 탐지하고 하이퍼링크로 다시 씁니다.그래서 HTML을 쓰거나 content-type 헤더에 text/html을 지정할 필요가 없었습니다.메시지 본문에 \r\n이라고 새 행을 입력했습니다.이것이 코드 퓨리스트의 접근법이 아닌 것은 감사하지만, 그것은 내가 필요로 하는 것에 효과가 있다.
몇 가지 가능성이 있습니다.
서버에 문제가 있습니다.서버에 메일 서버가 없습니다.그래서 당신의 메일은 작동하지 않습니다. 왜냐하면 당신의 코드는 정상이고 메일은 활자로 작동하기 때문입니다.
게시된 값을 얻지 못했습니다.정적 값을 사용하여 코드를 사용해 보십시오.
SMTP 메일을 사용하여 메일 보내기...
언급URL : https://stackoverflow.com/questions/24644436/php-mail-function-doesnt-complete-sending-of-e-mail
'IT' 카테고리의 다른 글
router-link에서 부모 v-on을 소비하는 방법: complete clicked (0) | 2022.11.18 |
---|---|
여러 TIMESTAMP 컬럼이 있는1개의 Mysql 테이블 (0) | 2022.11.17 |
Java Date & Time API의 문제점은 무엇입니까? (0) | 2022.11.17 |
폼이 전송된 후 백그라운드에서 PHP 스크립트를 실행하려면 어떻게 해야 합니까? (0) | 2022.11.17 |
기존 데이터베이스의 "innodb_file_per_table" 파라미터를 "OFF"에서 "1"로 변경하려면 어떻게 해야 합니까? (0) | 2022.11.17 |