如何在html表单输入字段中正确检查电子邮件地址?

时间:2015-09-04 13:37:50

标签: php html forms email email-headers

首先,对于PHP,我不是专家。我最近使用PHP为我们的网站实现了一个网站电子邮件表单。它有三个输入字段名称,电子邮件和消息。它们都是必需的领域。对于电子邮件输入字段,必须输入电子邮件地址,字段中只能有一个电子邮件地址,并且必须具有@符号。然后,只有脚本会将要发送的字段作为电子邮件发布。

以下是html表单:

enter image description here

以下是表单的HTML代码:

<form action="somescript.php" method="POST">
<input type="text" name="name" id="name" placeholder="Name" required>
<input type="email" name="email" id="email" placeholder="Email" required>
<textarea name="message" id="message" placeholder="Message" rows="5" required></textarea>
 <br>
<?php
require_once('recaptchalib.php');
$publickey = "LONG STRING";
echo recaptcha_get_html($publickey);
?>
<br>
<ul class="actions">
<li><input name="submit" type="submit" class="button alt" value="Send Message" /></li>
</ul>
</form>

以下是向我们发送电子邮件的实际脚本。

<?php
session_start();

if(isset($_POST['submit'])) {

    // check reCAPTCHA information
    require_once('recaptchalib.php');

    $privatekey = "LONG STRING";
    $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);

    // if CAPTCHA is correctly entered!                        
    if ($resp->is_valid) { 

    $name = $_POST['name'];
    $visitor_email = $_POST['email'];
    $message = $_POST['message'];

    if (IsInjected($visitor_email)){
        $_SESSION['caperror']="Please enter a valid email address.";
        header('Location: Contact-Us.php');         
    } else {            

    $email_from = 'Website';//<== update the email address
    $email_subject = "Website email from $name";
    $email_body = "$message";

    $to = "some-dude@some-company.com";//<== update the email address
    $headers = "From: $email_from \r\n";
    $headers .= "Reply-To: $visitor_email \r\n";

    //Send the email!
    mail($to,$email_subject,$email_body,$headers);
    //done. redirect to thank-you page.
    header('Location: thank-you.html');
    }

    } else {
        // handle the CAPTCHA being entered incorrectly
        $_SESSION['caperror']="You have entered CAPTCHA incorrectly. Try again.";
        header('Location: Contact-Us.php');
    }
} else { 
    // handle the form submission error somehow
echo "error; you need to submit the form!";        
}

 // Function to validate against any email injection attempts
 function IsInjected($str)
 {
      $injections = array('(\n+)',
          '(\r+)',
          '(\t+)',
          '(%0A+)',
          '(%0D+)',
          '(%08+)',
          '(%09+)'
          );
      $inject = join('|', $injections);
      $inject = "/$inject/i";
      if(preg_match($inject,$str))
      {
           return true;
      }
      else
      {
           return false;
 }
}

?>

就电子邮件字段而言,您只能拥有一个电子邮件地址,并且必须包含@符号。但是,看了今天早上从网站访问者那里得到的电子邮件,我很困惑。他们在表单中输入的电子邮件地址会添加到&#34;回复 - &#34;电子邮件地址的标题。以下是我为电子邮件地址获得的实际回复标题,我认为这是不可能的。他们是如何做到这一点的?我尝试重现这个错误,我似乎无法做到这一点。

enter image description here

那么,这位访问者如何能够做到这一点以及我遇到的问题是在电子邮件输入栏中检查电子邮件地址的正确或正确方法是什么?

3 个答案:

答案 0 :(得分:2)

或者您只需使用HTML5的email输入类型:

<input type="email" name="email">

作为Mozilla Developer Network documentation

  

电子邮件:用于编辑电子邮件地址的字段。在提交之前,输入值将被验证为包含空字符串或单个有效电子邮件地址。适当时应用:valid :invalid CSS伪类。

还有official documentation,但可能有点难以阅读。

修改

注意到您实际上正在使用email输入。

如果您需要验证它是否是来自PHP的有效电子邮件地址,那么在我看来最简单的方法是安装一个库来为您做这件事。我建议使用Zend Framework的验证器库。

要安装它,请从项目根目录运行以下命令:

composer require zendframework/zend-validator

然后简单地实例化验证器并将值传递给它:

use Zend\Validator\EmailAddress;

$validator = new EmailAddress();
$valid = $validator->isValid($yourValue);

它将为您完成所有工作,如果您需要here,还可以指定其他选项。

答案 1 :(得分:0)

您应该使用PHP内置函数filter_var

<?php
$email_a = 'joe@example.com';
$email_b = 'bogus';

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
    echo "This ($email_a) email address is considered valid.";
}
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) {
    echo "This ($email_b) email address is considered valid.";
}
?>

答案 2 :(得分:0)

您似乎没有真正检查提交是否是有效的电子邮件地址,您只通过INSTALLED_APPS = ( # ... 'django.contrib.staticfiles', 'django_static_jquery', # ... ) 函数检查注入的代码。因此,只要有人发布任何没有该代码的字符串,您的代码就会认为它是一个真正的电子邮件地址 - 当然,这不是真的。

在发送电子邮件之前,请尝试使用以下代码:

isInjected