联系表格获胜';t在本地主机上发送电子邮件


Contact Form won't send email on localhost

我正在尝试创建一个联系人表单,该表单位于右手边的一个粘性按钮下。

我的表格似乎根本没有提交。我尝试使用action="contactus.php"将代码放在单独的文件中,但没有任何结果。我也在同一页上尝试过,但仍然没有成功。有人能给我这个建议吗?

HEAD部分的PHP:

<?php
define("EMAIL", "my@email.com");
if(isset($_POST['submit'])) {
  include('validate.class.php');
  //assign post data to variables 
  $name = trim(mysql_real_escape_string($_POST['name']));
  $email = trim(mysql_real_escape_string($_POST['email']));
  $message = trim(mysql_real_escape_string($_POST['message']));
  //start validating our form
  $v = new validate();
  $v->validateStr($name, "name", 3, 75);
  $v->validateEmail($email, "email");
  $v->validateStr($message, "message", 5, 1000);  
  if(!$v->hasErrors()) {
        $header = "From: $email'n" . "Reply-To: $email'n";
        $subject = "Contact Form Subject";
        $email_to = EMAIL;
        $emailMessage = "Name: " . $name . "'n";    
        $emailMessage .= "Email: " . $email . "'n'n";
        $emailMessage .= $message;
    //use php's mail function to send the email
        @mail($email_to, $subject, $emailMessage, $header );  
    //grab the current url, append ?sent=yes to it and then redirect to that url
        $url = "http". ((!empty($_SERVER['HTTPS'])) ? "s" : "") . "://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
        header('Location: '.$url."?sent=yes");
    } else {
    //set the number of errors message
    $message_text = $v->errorNumMessage();       
    //store the errors list in a variable
    $errors = $v->displayErrors();
    //get the individual error messages
    $nameErr = $v->getError("name");
    $emailErr = $v->getError("email");
    $messageErr = $v->getError("message");
  }//end error check
}// end isset
?>

HTML格式的联系表格:

<div class="slide-out-div">
                <a class="handle">Content</a>
                <h3>Leave your details and we will get back to you asap!</h3>
                <br>
                <form id="contact_form" method="post" action="">
                    Name <br /><input type="text" name="name" required>
                    <br /><br />
                    Email <br /><input type="email" name="email" required>
                    <br /><br />
                    Message <br /><textarea name="message" class="textarea" cols="30" rows="5" required></textarea>
                    <br /><br />
                    <p><input type="submit" name="submit" class="button" value="Submit" /></p>
                </form>
            </div>

validate.class.php文件:

<?php
class validate {
  // ---------------------------------------------------------------------------
  //  paramaters
  // ---------------------------------------------------------------------------
  /**
  * Array to hold the errors
  *
  * @access public
  * @var array
  */
  public $errors = array();
  // ---------------------------------------------------------------------------
  //  validation methods
  // ---------------------------------------------------------------------------
  /**
  * Validates a string
  *
  * @access public
  * @param $postVal - the value of the $_POST request
  * @param $postName - the name of the form element being validated
  * @param $min - minimum string length
  * @param $max - maximum string length
  * @return void
  */
  public function validateStr($postVal, $postName, $min = 5, $max = 500) {
    if(strlen($postVal) < intval($min)) {
      $this->setError($postName, ucfirst($postName)." must be at least {$min} characters long.");
    } else if(strlen($postVal) > intval($max)) {
      $this->setError($postName, ucfirst($postName)." must be less than {$max} characters long.");
    }
  }// end validateStr
  /**
  * Validates an email address
  *
  * @access public
  * @param $emailVal - the value of the $_POST request
  * @param $emailName - the name of the email form element being validated
  * @return void
  */
  public function validateEmail($emailVal, $emailName) {
    if(strlen($emailVal) <= 0) {
      $this->setError($emailName, "Please enter an Email Address");
    } else if (!preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $emailVal)) {
      $this->setError($emailName, "Please enter a Valid Email Address");
        }
  }// end validateEmail
  // ---------------------------------------------------------------------------
  //  error handling methods
  // ---------------------------------------------------------------------------
  /**
  * sets an error message for a form element
  *
  * @access private
  * @param string $element - name of the form element
  * @param string $message - error message to be displayed
  * @return void
  */
  private function setError($element, $message) {
    $this->errors[$element] = $message;
  }// end logError
  /**
  * returns the error of a single form element
  *
  * @access public
  * @param string $elementName - name of the form element
  * @return string
  */
  public function getError($elementName) {
    if($this->errors[$elementName]) {
      return $this->errors[$elementName];
    } else {
      return false;
    }
  }// end getError
  /**
  * displays the errors as an html un-ordered list
  *
  * @access public
  * @return string: A html list of the forms errors
  */
  public function displayErrors() {
    $errorsList = "<ul class='"errors'">'n";
    foreach($this->errors as $value) {
      $errorsList .= "<li>". $value . "</li>'n";
    }
    $errorsList .= "</ul>'n";
    return $errorsList;
  }// end displayErrors
  /**
  * returns whether the form has errors
  *
  * @access public
  * @return boolean
  */
  public function hasErrors() {
    if(count($this->errors) > 0) {
      return true;
    } else {
      return false;
    }
  }// end hasErrors
  /**
  * returns a string stating how many errors there were
  *
  * @access public
  * @return void
  */
  public function errorNumMessage() {
    if(count($this->errors) > 1) {
            $message = "There were " . count($this->errors) . " errors sending your message!'n";
        } else {
            $message = "There was an error sending your message!'n";
        }
    return $message;
  }// end hasErrors
}// end class
?>

当我在FireBug中看到POST数据时,我会看到我填写的实际数据。这可能是因为我在LocalHost上而不起作用吗?

问候

比约恩

除非安装像Mercury这样的电子邮件服务器,否则mail函数将无法在localhost上工作。

这是Windows机器上的情况(正如@Marc B所指出的)。