php mail()函数导致找不到404文件页面

Tim*_*Gee 3 php email

我有一个简单的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);
}
?>
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Fun*_*ner 5

这里有一些问题.

让我们从顶部开始,并使用条件语句(并按下工作).

if (isset($_POST['submit'])){...}
Run Code Online (Sandbox Code Playgroud)

您的提交按钮<input type="submit" value="submit" id="submit">没有名称属性.

  • 您可能单独依赖"id",这将无效,它需要"name"属性.

修改它,使其读作:

<input type="submit" name="submit" value="submit" id="submit">
Run Code Online (Sandbox Code Playgroud)
  • 由于它没有命名,因此条件语句中的任何内容都不会执行.

然后你正在使用mysqli_real_escape_string()理论上要求将连接传递给该函数.

即:

$Name = mysqli_real_escape_string($connection,$Name);
Run Code Online (Sandbox Code Playgroud)

并为其他人做同样的事; 假设您正在与数据库交互.

但是,目前还不清楚您是否确实在与数据库进行交互,因此如果您没有与它进行交互,请mysqli_real_escape_string从POST阵列中删除所有这些内容.

即:

$Name = $_POST['Name'];
Run Code Online (Sandbox Code Playgroud)

并为其他人做同样的事情.

您还缺少POST作为表单中的方法:

<form action="action_page.php" name="myform">
Run Code Online (Sandbox Code Playgroud)

省略时默认为GET.因此,将其更改为:

<form action="action_page.php" name="myform" method="post">
Run Code Online (Sandbox Code Playgroud)

然后检查邮件是否已发送,更改

mail($webEmail,$email_subject,$email_body,$headers);
Run Code Online (Sandbox Code Playgroud)

if(mail($webEmail,$email_subject,$email_body,$headers)){
echo "Sent";
}
Run Code Online (Sandbox Code Playgroud)

如果您看到"已发送",则邮件将完成其工作.如果没有收到邮件,请检查您的垃圾邮件.或者,您的服务器可能会被列入黑名单.

确保您有权使用mail().

您还应确保使用条件填充所有输入empty().

即:

if(!empty($_POST['Name'])){
// $Name = mysqli_real_escape_string($Name);
   $Name = $_POST['Name'];
   }
Run Code Online (Sandbox Code Playgroud)

错误报告添加到文件的顶部,这将有助于查找错误.

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code
Run Code Online (Sandbox Code Playgroud)

旁注:错误报告应该只在暂存中完成,而不是生产.


脚注:

我不知道这些用途是什么onfocus="this.value='';",如果你在某个地方发生了一些JS/Ajax,你需要检查它们.

  • 如果他们没有用于任何东西,你可以删除它们.

你也应该尝试删除value="Name"和其他人,以防万一.

边注:

如果您仍然收到404错误,请尝试将PHP放在最上面,将HTML表单放在下面,并在带有.php扩展名的同一文件中,并执行以下操作:

<form action="" name="myform" method="post">
Run Code Online (Sandbox Code Playgroud)

使用action=""作为要采取的动作在同一页上的地方.


附加脚注:

我在评论中注意到你提出了另一个答案:

"我添加了标题('Location:lizbethmcgee.com/pages/Contact.php';);"

首先,确保你没有在标题之前输出.

此外,您还应该包括一个完整的http://电话exit;:

header("Location: http://www.lizbethmcgee.com/pages/Contact.php");
exit;
Run Code Online (Sandbox Code Playgroud)

为了避免进一步执行可能存在的代码,如果包含任何代码.


正如AdamT在评论中所述:

使用php mail命令发送邮件时,无法保证邮件将到达您发送给它的收件箱.如前所述,有很多垃圾邮件发送者,不幸的是,垃圾邮件过滤程度很高.如果您真的希望有更好的机会获得邮件,您应该联系GoDaddy并询问他们如何为您的帐户设置SMTP电子邮件.