简体   繁体   中英

Contact Form won't send email on localhost

I'm trying to create a contactform which is placed under a sticky button on the right hand side.

It seems my form isn't submitting at all. I tried to put the code on seperate files using action="contactus.php" without any result. I also tried it on the same page, but still no luck. Can someone give me advise on this one please?

PHP in the HEAD-section:

<?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
?>

Contact form in 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>

The validate.class.php file:

<?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
?>

When I see what the POST-data is in FireBug I see the actual data which I filled in. Is it possible this isn't working because I'm on LocalHost?

Kind regards

Bjorn

The mail function won't work on localhost unless you install an email server like Mercury .

Which is the case on a Windows machine (as pointed out by @Marc B).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM