Недавно я «преттифицировал» некоторые проверенные и настоящие формы электронной почты, чтобы сделать их более удобными для мобильных устройств, и подумал, что схожу с ума, увидев, что функция PHP mail () теперь произвольно завершается с ошибкой (и возвращает FALSE). Ну, это не случайно. Почти вытащив все свои волосы, я, наконец, понял, что каждый раз, когда я вводил недопустимый домен для поля формы, которое становится моим «ответным» адресом, mail () завершался ошибкой и возвращал FALSE! Обратите внимание, что это не «неправильно сформированные» адреса электронной почты (которые я уже проверял), а просто недействительные (например, «[email protected]»).
Я включил код тестовой формы ниже, если вы считаете, что это имеет значение, но считаете ли вы, что это новая «особенность» PHP или то, что делает только сервер моей хостинговой компании? Если это PHP, есть ли какая-нибудь новая функция «testDomain ()», которую я также мог бы добавить в свои формы? Было бы неплохо предупредить пользователя, допустившего допустимую ошибку, но все, что я могу ему точно сказать, это то, что его попытка отправки почты не удалась. В конце концов, mail () не возвращает небольшой дружественный маленький код ошибки, который указывает, что произошло, он просто возвращает true или false. На самом деле, когда он возвращает 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
не имеет собственных проверок на действительность. Ванильный sendmail тоже нет. Так что, возможно, ваш хост 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
}
Нет. mail()
не для этого. Это может будь то SMTP, который вы используете, сделает это, но это зависит от настроек указанного сервера.
PS: не использовать mail()
, Это очень примитивно. Используйте phpmailer или другие инструменты для облегчения отправки почты