나는 최근에 좀 더 모바일 친화적 인 이메일 양식을 "고맙게 생각"했고, PHP mail () 함수가 이제 무작위로 실패 (그리고 FALSE를 반환)하는 것을보고 정신이 나갔다고 생각했습니다. 음 그것은 무작위가 아니 었습니다. 머리카락을 거의 모두 뽑은 후 마침내 "답장"주소가되는 양식 필드에 잘못된 도메인을 입력 할 때마다 mail ()이 실패하고 FALSE를 반환한다는 것을 마침내 깨달았습니다! 이것은 "잘못된 형식의"이메일 주소 (내가 이미 확인)가 아니라 유효하지 않은 이메일 주소 (예 : "[email protected]")입니다.
중요하다고 생각하는 경우 아래에 테스트 양식 코드를 포함 시켰지만 이것이 PHP의 새로운 "기능"이라고 생각하십니까? 아니면 제 호스팅 회사의 서버에서만 수행하는 작업이라고 생각하십니까? PHP 인 경우 양식에 추가 할 수있는 새로운 "testDomain ()"함수가 있습니까? 합법적 인 실수를 한 사용자에게 알리는 것이 좋지만 내가 확실히 말할 수있는 것은 메일 시도가 실패했다는 것입니다. 결국, mail ()은 무슨 일이 일어 났는지 나타내는 친숙한 작은 오류 코드를 반환하지 않고 참 또는 거짓을 반환합니다. 실제로 false를 반환하면 로그 파일에 오류를보고하지도 않습니다.
사실, 이것은 내가 내 양식에서 실패한 mail ()을 얻은 유일한 시간입니다. 그러나 실패가 항상 도메인이 나쁘다는 것을 의미한다고 가정하면 현명하지 않을 것입니다.
<!DOCTYPE HTML>
<html>
<head> <title> Simple Test Email Form;</title> </head>
<!--
<?php
// define variables and set to empty values
$name = $email = $comments = ""; // $address = $citystate = $zip = $phone not used
$nameErr = $emailErr = $commentsErr = "";
$headers = $email_message = $sendersIP = "";
$email_to = "[email protected]"; // this is bogus!!!
$email_subject = "Private Mailform";
$status = "Form Not Yet Processed";
// some basic security functions
function clean_string($string) {
$bad = array("content-type","bcc:","to:","cc:","href");
return str_replace($bad,"",$string);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
// mail processing
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
if (empty($_POST["name"])) { $nameErr = " Name is required"; }
else { $name = test_input($_POST["name"]); }
if (empty($_POST["email"])) { $emailErr = "Email is required"; }
else { $email = test_input($_POST["email"]); }
// at least email should be validated
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "Invalid email format"; }
// keep senders IP, so we can watch for idiots.
$sendersIP = $_SERVER['REMOTE_ADDR'];
$comments = $_POST["comments"];
// So is all well?
if (empty($nameErr) && empty($emailErr) && empty($commentsErr) )
{
$email_message = $headers = "";
$email_message .= "Name: ".clean_string($name)."\n";
$email_message .= "Email: ".clean_string($email)."\n";
$email_message .= "IP: ".$sendersIP."\n";
$email_message .= "Comments: "."\n\n".clean_string($comments)."\n";
// create regular email headers
$headers .= 'From: '.$email."\r\n".
'Reply-To: '.$email."\r\n" .
'X-Mailer: PHP/' . phpversion();
$mail_sent = mail($email_to, $email_subject, $email_message, $headers);
// modify status string to show result
$status = ($mail_sent==TRUE) ? "mail() function returned TRUE" :" mail() function returned FALSE";
}
}
?>
-->
<body >
<table><tr><td style ="text-align:right;" width=100%>
<b><?php echo $status; ?></b><br>
<p><span >* = required fields.<br>Please double check your email address.</span></p>
<form name="contactform" method="post" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <span class="error">*<?php echo $nameErr;?></span>
<input type="text" name="name" value="<?php echo $name;?>"><br>
Email: <span class="error">*<?php echo $emailErr;?></span>
<input type="text" name="email" value="<?php echo $email;?>"><br>
<br>
<div align="center"> ---- <span class="error">*</span> Message ---- <span class="error"><?php echo $commentsErr;?></span><br>
<textarea name="comments" wrap="physical" cols="40" rows="10" ><?php echo $comments;?></textarea>
<br><br>
</div>
<input name="submit" id="submit" type="submit" value="Submit" >
</form>
</td></tr></table>
</body>
</html>
mail
유효성에 대한 기본 검사가 없습니다. 바닐라 센드 메일도 마찬가지입니다. 따라서 호스트가 MTA 클라이언트가이 작업을 수행 할 수 있습니다. 별도의 메일 클라이언트를 사용하여이를 테스트 할 수 있습니다. 예를 들어 ZF2, PHPMailer 및 기타 많은 최신 PHP 메일 링 시스템은이 mail
기능을 전혀 사용하지 않습니다 . 실제로 소켓을 열고 메일 명령을 직접 보냅니다. 쉽지는 않지만 실제 명령과 응답을 다시 보내고 SMTP 트랜잭션이 실패한 위치를 확인하기 위해이 방법을 사용할 수 있습니다.
우연히 그렇게 멀리 가기 전에 자체 유효성 검사를 추가 할 수 있습니다.
// this will fail to send if the DNS for the domain has no MX records
if(!checkdnsrr($domain, 'MX')) {
// don't send
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다