Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP5.x mail()是否验证“中的域的有效性?”;答复「;领域?_Php_Forms_Email_Form Verification - Fatal编程技术网

PHP5.x mail()是否验证“中的域的有效性?”;答复「;领域?

PHP5.x mail()是否验证“中的域的有效性?”;答复「;领域?,php,forms,email,form-verification,Php,Forms,Email,Form Verification,最近,我一直在“美化”一些经过验证的电子邮件表单,使它们更便于移动,我还以为看到PHP mail()函数现在随机失败(并返回FALSE)会让我发疯。这不是随机的。在几乎拔出所有头发后,我终于意识到,每当我为表单字段输入一个无效域,该域成为我的“回复”地址时,mail()就会失败,并返回FALSE!注意,这些不是“格式错误”的电子邮件地址(我已经检查过了),只是无效的(比如name@goooogle.com" 如果您认为这很重要的话,我在下面提供了一个测试表单代码,但您认为这是PHP的一个新“功能

最近,我一直在“美化”一些经过验证的电子邮件表单,使它们更便于移动,我还以为看到PHP mail()函数现在随机失败(并返回FALSE)会让我发疯。这不是随机的。在几乎拔出所有头发后,我终于意识到,每当我为表单字段输入一个无效域,该域成为我的“回复”地址时,mail()就会失败,并返回FALSE!注意,这些不是“格式错误”的电子邮件地址(我已经检查过了),只是无效的(比如name@goooogle.com"

如果您认为这很重要的话,我在下面提供了一个测试表单代码,但您认为这是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 = "myaddress@mydomain.org";  // 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>&nbsp;
   <input type="text" name="name" value="<?php echo $name;?>"><br>
Email: <span class="error">*<?php echo $emailErr;?></span>&nbsp;
    <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()
不适用于此。可能是您正在使用的SMTP可以做到这一点,但这取决于所述服务器的设置

注意:不要使用
mail()
。它非常原始。使用phpmailer或其他工具使邮件发送更容易

否。
mail()
不适用于此。可能是您正在使用的SMTP可以做到这一点,但这取决于所述服务器的设置

注意:不要使用
mail()
。它非常原始。使用phpmailer或其他工具使邮件发送更容易

否。
mail()
不适用于此。可能是您正在使用的SMTP可以做到这一点,但这取决于所述服务器的设置

注意:不要使用
mail()
。它非常原始。使用phpmailer或其他工具使邮件发送更容易

否。
mail()
不适用于此。可能是您正在使用的SMTP可以做到这一点,但这取决于所述服务器的设置


注意:不要使用
mail()
。它非常原始。使用phpmailer或其他工具使邮件发送更容易

邮件
没有本机有效性检查。香草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
}

邮件
没有本机有效性检查。香草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
}

邮件
没有本机有效性检查。香草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
}

邮件
没有本机有效性检查。香草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
}

这不太可能是PHP做的。我认为您的主机提供商使用的SMTP服务器更有可能将这些验证步骤落实到位。谢谢。如果不是PHP,那是不幸的,因为它似乎是一个受欢迎的添加。我应该提到我的托管公司是hostmonster.com,以防它只发生在他们身上。但他们的技术服务让人难以理解,而且他们的回答也很少是一致的。所以我认为最好从这里开始,看看是否有其他人正在经历这种情况。PHP不太可能会这样做。我认为您的主机提供商使用的SMTP服务器更有可能将这些验证步骤落实到位。谢谢。如果不是PHP,那是不幸的,因为它似乎是一个受欢迎的添加。我应该提到我的托管公司是hostm