У меня есть несколько полей формы 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, также использовавшую 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: [email protected]";
// 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'];
...
}
Других решений пока нет …