PHP mail() 函数导致 404 文件未找到页面


php mail() function leading to a 404 file not found page

我有一个简单的 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);

并对其余部分执行相同的操作;假设您正在与数据库交互。

但是,目前还不清楚您是否确实在与数据库交互,因此,如果您不与数据库交互,请从 POST 数组中删除所有这些mysqli_real_escape_string

即:

$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

旁注:错误报告只应在暂存中完成,而不应在生产环境中完成。


脚注:

我不知道这些是用来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"否则您的if (isset($_POST['submit'])){...将无法正常工作。 然而,我最近遇到了这个确切的问题,不知何故偶然发现了<input name="name">应该受到指责的提及。 在您的情况下,<input name="Name">. 一旦我将 name 属性更新为"用户名",表单就运行良好。 虽然我无法找到这个怪癖的确切原因,但它确实提高了人们对我命名的属性、选择器、变量等的认识......