Получение пустых писем с использованием формы html5 и php

У меня есть несколько полей формы html5 на веб-сайте, которыми я управляю, которые помещают данные, введенные пользователями, в php-файл, который отправляет электронное письмо на специальный адрес электронной почты Yahoo для сайта.

Вот 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, также использованную для неподдерживаемых браузеров (и 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. Проверка работает для меня, поэтому она не позволяет мне отправить электронное письмо, по крайней мере, не заполнив необходимые поля. Я получал пустые письма до того, как добавил проверку и установил адрес отправителя по умолчанию. Однако я все еще получаю пустые письма даже после всех изменений. Когда я тестирую, я не могу тестировать на всех платформах и в браузерах, но я не могу заставить пустое письмо после добавления проверок. Моя проверка где-то не проходит? Я чувствую, что люди заполняют поля, но электронное письмо почему-то приходит пустым. Когда я говорю "пустой", я имею в виду то, что программно добавляется в сообщение, но реальная информация, которую пользователь должен вводить, не дает? Как это происходит?

1 ответ

Решение

Всегда выполняйте проверку на стороне сервера и подтверждайте, что есть входящий 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'];
    ...
}
Другие вопросы по тегам