У меня есть простая php-страница с формой html. Его настройка позволит вам заполнить форму и автоматически отправить электронное письмо на мой адрес электронной почты. Вместо этого я не получаю никаких сообщений по электронной почте, а страница перенаправляется на «Файл не найден (ошибка 404)».
Вот PHP
<?php if (isset($_POST['submit'])){ //Name $Name = $_POST['Name']; $Name = mysqli_real_escape_string($Name); //Email $Email = $_POST['Email']; $Email = mysqli_real_escape_string($Email); //Subject $Subject = $_POST['Subject']; $Subject = mysqli_real_escape_string($Subject); //Message $Message = $_POST['Message']; $Message = mysqli_real_escape_string($Message); $email_subject = $Subject . ' from: ' . $Email; $email_from = $Email; $email_body = $Message; $webEmail = "temcgee@email.neit.edu"; $headers = "From: $email_from \r\n"; $headers .= "Reply-To: $Email \r\n"; $headers .= 'X-Mailer: PHP/' . phpversion(); $headers .= 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; mail($webEmail,$email_subject,$email_body,$headers); } ?>
Вот html-форму
<form action="action_page.php" name="myform"> <input onfocus="this.value='';" type="text" name="Name" value="Name" id="name"> <input onfocus="this.value='';" type="text" name="Email" value="Email" id="email"> <input onfocus="this.value='';" type="text" name="Subject" value="Subject" id="subject"> <textarea onfocus="this.value='';" cols="50" rows="4" placeholder="Message" name="Message" id="message"></textarea> <input type="submit" value="submit" id="submit"> </form>
Есть идеи?
Здесь есть несколько вещей.
Давайте начнем с вершины и с вашим условным утверждением ( и проделаем свой путь вниз ).
if (isset($_POST['submit'])){...}
Кнопка отправки <input type="submit" value="submit" id="submit">
не имеет для этого атрибута имени.
Измените его так, чтобы он читался как:
<input type="submit" name="submit" value="submit" id="submit">
Затем вы используете mysqli_real_escape_string()
который теоретически требует, чтобы соединение было передано этой функции.
То есть:
$Name = mysqli_real_escape_string($connection,$Name);
и сделать то же самое для остальных; предполагая, что вы взаимодействуете с базой данных.
Однако неясно, действительно ли вы взаимодействуете с вашей базой данных или нет, поэтому, если вы не взаимодействуете с ней, удалите все эти mysqli_real_escape_string
из ваших массивов POST.
То есть:
$Name = $_POST['Name'];
и сделать то же самое для других.
Вы также пропускаете POST в качестве метода в вашей форме:
<form action="action_page.php" name="myform">
по умолчанию GET при пропуске. Поэтому измените его на:
<form action="action_page.php" name="myform" method="post">
Чтобы проверить, отправлено ли письмо, измените
mail($webEmail,$email_subject,$email_body,$headers);
в
if(mail($webEmail,$email_subject,$email_body,$headers)){ echo "Sent"; }
Если вы видите «Отправлено», почта будет выполнять свою работу. Если почта не получена, проверьте свой спам. Или ваш сервер может быть внесен в черный список.
Убедитесь, что у вас есть доступ к использованию mail()
.
Вы также должны убедиться, что все входы были заполнены с помощью условного empty()
.
То есть:
if(!empty($_POST['Name'])){ // $Name = mysqli_real_escape_string($Name); $Name = $_POST['Name']; }
Добавьте отчет об ошибках в начало файла (ов), который поможет найти ошибки.
<?php error_reporting(E_ALL); ini_set('display_errors', 1); // rest of your code
Sidenote: Сообщение об ошибках должно выполняться только в стадии постановки и никогда не выпускаться.
Примечания:
Я не знаю, что они используют для onfocus="this.value='';"
поэтому, если у вас где-то есть JS / Ajax, вам нужно их проверить.
Вы также должны попробовать удалить value="Name"
и для остальных, на всякий случай.
Примечание:
Если вы все еще получаете ошибку 404, попробуйте поместить свой PHP сверху и вашу HTML-форму ниже этого и внутри того же файла с расширением .php
и выполните:
<form action="" name="myform" method="post">
используя action=""
как действие, которое должно выполняться на той же странице.
Дополнительная сноска:
Я заметил в комментарии, который вы разместили в другом ответе:
«Я добавил заголовок (« Местоположение: lizbethmcgee.com/pages/Contact.php »;);
Во-первых, убедитесь, что вы не выводите перед заголовком.
Кроме того, вы должны также включить полный http://
вызов и exit;
:
header("Location: http://www.lizbethmcgee.com/pages/Contact.php"); exit;
чтобы избежать дальнейшего выполнения кода, который может присутствовать ниже этого, если он есть.
Как сказал AdamT в комментарии:
Отправляя почту с помощью команды php mail
, нет гарантии, что почта поступит в папку входящих сообщений, в которую вы ее отправите. Как уже упоминалось, есть много спамеров, и, к сожалению, тяжелая степень фильтрации спама. Если вы действительно хотите получить больше шансов получить почту, вам следует связаться с GoDaddy и спросить, как вы можете настроить SMTP-рассылку для своей учетной записи.
Как уже упоминалось выше, ваша кнопка отправки ДОЛЖНА иметь name="submit"
атрибута name="submit"
иначе ваше if (isset($_POST['submit'])){...
не будет работать. Тем не менее, у меня недавно была эта точная проблема и почему-то наткнулся на упоминание о том, что винить было <input name="name">
. В вашем случае <input name="Name">
. Как только я обновил атрибут name до «username», форма функционировала отлично. Хотя я не смог найти точных аргументов в пользу этой причуды, он определенно поднял осознание того, что я назвал моими атрибутами, селекторами, переменными и т. Д. …