使用 html5 表单和 php 获取空电子邮件

Getting Empty emails using html5 form and php

我在我管理的网站上有一些 html5 表单字段,将用户输入的数据推送到 php 文件,该文件将电子邮件发送到该网站的专用雅虎电子邮件。

这里是 html:

<form role="form" method="post" action="php/contact-us.php" lang="es" id="contactForm">
  <div class="row">
    <div class="form-group col-lg-4 required">
      <label for="name">Name</label>
      <input type="text" class="form-control"  name="name" required placeholder="Enter Name" />
    </div>
    <div class="form-group col-lg-4 required">
      <label for="email">Email</label>
      <input type="email" class="form-control"  name="email" required placeholder="Enter valid email" />
    </div>
    <div class="form-group col-lg-4">
      <label for="phone">Phone Number</label>
      <input type="tel" class="form-control"  name="phone" placeholder="e.g. (000) 000 - 0000">
    </div>
    <div class="clearfix"></div>
    <div class="form-group col-lg-12 required">
      <label for="message">Mensaje</label>
      <textarea class="form-control" rows="6"  name="message" required placeholder="Write your message here"></textarea>
    </div>
    <div class="form-group col-lg-12">
      <input type="hidden" name="save" value="contact">
      <button type="submit" class="btn btn-default">Enviar</button>
    </div>
  </div>
</form>

之前,我没有对这些字段进行任何验证,但我收到了没有用户内容的空电子邮件,所以我认为人们只是按下按钮而没有输入任何内容,我也可以自己测试。所以我添加了以下验证 JS,还为不支持的浏览器使用了 webshim(以及上面表单元素中的 required 标签):

<script>
  $('#contactForm input[type=text], select, textarea').on('change invalid', function() {
    var field = $(this).get(0);
    field.setCustomValidity('');

    if (!field.validity.valid) {
      field.setCustomValidity('Please fill required fields');
    }
  });
  $('#contactForm input[type=email]').on('change invalid', function() {
    var field = $(this).get(0);

    field.setCustomValidity('');

    if (!field.validity.valid) {
      field.setCustomValidity('Enter a valid email');
    }
  });
</script>

以前我是从用户那里获取输入的电子邮件并将其设置为发件人电子邮件,但我遇到了某些电子邮件地址等问题。所以我将其默认为随机电子邮件,该电子邮件始终有效并且只包含用户在消息中输入了电子邮件。这是我的 php 文件 (contact-us.php):

<?php
// Set your email below
$to = "<dedicatedemail>@yahoo.com";
// Receive and sanitize input
$name = $_POST['name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$message = $_POST['message'];
$subject = "Request from website";
$headers = "From: no-reply@gmail.com";

// set up email
$msg = "Sender Information \nName: " . $name . "\nEmail: " . $email . "\nPhone: " . $phone . "\n\n" . $message;
$msg = wordwrap($msg,70);

// mail
mail($to,$subject,$msg,$headers);
header('Location: ../contact-thank-you.html');
?>

所以首先让我说一切正常。当我在这里测试功能时,一切正常。我可以从我的 ios 设备和我的笔记本电脑发送电子邮件,我有几个朋友从他们的 android 设备发送电子邮件。验证对我有用,所以它不允许我在至少填写必填字段的情况下发送电子邮件。在添加验证并将发件人电子邮件设置为默认电子邮件之前,我收到了空电子邮件。但是,即使进行了所有更改,我仍然收到空电子邮件。当我测试时,我无法在所有平台和浏览器上进行测试,但我无法在添加检查后强制发送空电子邮件。我的验证在某处失败了吗?我觉得人们正在填写字段,但不知何故电子邮件是空的。当我说空时,我的意思是我以编程方式添加到消息中的内容通过了,但是用户应该输入的实际信息却没有?这是怎么回事?

始终执行服务器端验证并确认有 POST 传入。否则,即使像网络爬虫这样简单的东西也会触发空电子邮件。

<?php
if (empty($_POST['email']) || empty($_POST['name'])) {
    // Respond with a proper error message
    ...
} else {
    // Send email
    $to = "<dedicatedemail>@yahoo.com";
    $name = $_POST['name'];
    $email = $_POST['email'];
    ...
}