【问题标题】:HTML/PHP email form not workingHTML/PHP 电子邮件表单不起作用
【发布时间】:2013-12-25 10:12:45
【问题描述】:

我用 HTML 制作了一个非常简单的电子邮件表单,它应该运行一个 php 脚本来向我的电子邮件地址发送电子邮件:

<form id="emailForm" action="sendMail.php" method="post">
    Name:<br>
    <input type="text" name="name" value="your name"><br>
    E-mail:<br>
    <input type="text" name="email" value="your email"><br>
    Message:<br>
    <textarea cols="40" rows="5" name="message">your message</textarea><br>
    <input type="submit" value="Send">
    <input type="reset" value="Reset">
</form>

我的 php 脚本如下所示:

<?php
// This function checks for email injection. Specifically, it checks for carriage returns - typically used by spammers to inject a CC list.
function isInjected($str) {
    $injections = array('(\n+)',
    '(\r+)',
    '(\t+)',
    '(%0A+)',
    '(%0D+)',
    '(%08+)',
    '(%09+)'
    );
    $inject = join('|', $injections);
    $inject = "/$inject/i";
    if(preg_match($inject,$str)) {
        return true;
    }
    else {
        return false;
    }
}

// Load form field data into variables.
$name = $_REQUEST['name'] ;
$email_address = $_REQUEST['email'] ;
$comments = $_REQUEST['message'] ;

// If the user tries to access this script directly, redirect them to feedback form,
if (!isset($_REQUEST['email'])) {
header( "Location: contact.html" );
}

// If the form fields are empty, redirect to the error page.
elseif (empty($email_address) || empty($comments) || empty($name)) {
header( "Location: error_message.html" );
}

// If email injection is detected, redirect to the error page.
elseif ( isInjected($email_address) ) {
header( "Location: error_message.html" );
}

// If we passed all previous tests, send the email!
else {
mail( "r.krishnan1@umiami.edu", "Message From Your Website!",
  $comments, "From: $email_address" );
header( "Location: thank_you.html" );
}
?>

由于我对脚本很陌生,所以这个脚本主要取自示例代码,但对我来说似乎都很有意义。表单所在的html页面和php文件都上传到服务器的同一个目录下。然而,当我按下表单上的“提交”按钮时,我只是在浏览器中被带到 php 文件本身的文本版本(即我只是转到我目录中的 php 文件)并且没有发送电子邮件。为什么会发生这种情况?

【问题讨论】:

  • 也许这是一个转储问题,但是您是否为您的项目配置了 Web 服务器?
  • 您的联系表单对邮件标头注入开放,垃圾邮件发送者很容易添加额外标头,并且您的 isInjected 函数包含不良做法:您应该 white-list 邮件地址,不过滤掉可能被恶意使用的字符。

标签: php html forms email


【解决方案1】:

您需要通过让您的浏览器访问由支持 PHP 的 Web 服务器提供的 HTTP(S) URL 来运行您的 PHP 程序,并配置为针对您放置 PHP 代码的文件执行它。

要么:

  • 您是直接从文件系统加载文件,而不是通过网络服务器
  • 您没有为您正在加载的文件配置 PHP 的服务器(默认的 PHP 配置将要求代码位于具有 .php 扩展名的文件中)

【讨论】:

  • 我使用 Nearfreespeech.net 作为我的服务器。我网站的所有 .html 文件都上传到我的服务器帐户的主目录中。这也是我放置 .php 文件 (sendMail.php) 的位置。所以看起来浏览器正在访问该 URL,但实际上并没有运行脚本?据我所知,我所在的服务器是为 PHP 配置的,所以我仍然不确定为什么会这样。
【解决方案2】:

你可以试试这个,

$headers = 'From: '.$email_address . "\r\n" .
'Reply-To: '.$email_address . "\r\n" ;

mail( "r.krishnan1@umiami.edu", "Message From Your Website!", $comments,  $headers);

【讨论】:

  • 不要鼓励人们添加那个臭名昭著的X-Mailer: PHP 标头:它没有用,甚至很危险,因为它可能会吸引黑客。
  • @Marcel Korpel 谢谢!删除了该标题
猜你喜欢
  • 2013-04-28
  • 2012-09-27
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2014-05-01
  • 2018-11-05
相关资源
最近更新 更多