Функция php mail (), приводящая к 404 файлам не найденной странице

У меня есть простая 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"> не имеет для этого атрибута имени.

  • Вы можете полагаться только на «id», который не будет работать, ему нужен атрибут «name».

Измените его так, чтобы он читался как:

 <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», форма функционировала отлично. Хотя я не смог найти точных аргументов в пользу этой причуды, он определенно поднял осознание того, что я назвал моими атрибутами, селекторами, переменными и т. Д. …