Hi everyone,

I am still quite new to HTML and PHP. I have a form in HTML pointing to a PHP script that sends an email. But it doesn't work - please tell me where I am going wrong!

The HTML is:

 <div class="main-content three-fourths">
                    <h1>Get in touch</h1>
                    <p class="lead">We'd love to hear from you.</p>                       

                    <!-- Start Form -->
                    <form id="contactform" action="php/processForm.php" method="post">
                        <table class="tableless">
                            <tr><td><input type="text" id="name" name="name" placeholder="What's your name" /></td></tr>
                            <tr><td><input type="email" id="email" name="email" placeholder="Email goes here" /></td></tr>
                            <tr><td><textarea id="message" name="message" rows="5" cols="20" placeholder="Whats this about?"></textarea></td></tr>

                            <tr><td>
                            <input name="button" class="btn" type="submit" value="Send Message" id="send" /><br/></td></tr>
                        </table>
                    </form>
                    <div id="response"></div>

And the PHP script:

<?php

// Clean up the input values
foreach($_POST as $key => $value) {
    if(ini_get('magic_quotes_gpc'))
        $_POST[$key] = stripslashes($_POST[$key]);

    $_POST[$key] = htmlspecialchars(strip_tags($_POST[$key]));
}

// Assign the input values to variables for easy reference
$name = $_POST["name"];
$email = $_POST["email"];
$message = $_POST["message"];

// Test input values for errors
$errors = array();
if(strlen($name) < 2) {
    if(!$name) {
        $errors[] = "You must enter a name.";
    } else {
        $errors[] = "Name must be at least 2 characters.";
    }
}
if(!$email) {
    $errors[] = "You must enter an email.";
} else if(!validEmail($email)) {
    $errors[] = "You must enter a valid email.";
}
if(strlen($message) < 10) {
    if(!$message) {
        $errors[] = "You must enter a message.";
    } else {
        $errors[] = "Message must be at least 10 characters.";
    }
}

if($errors) {
    // Output errors and die with a failure message
    $errortext = "";
    foreach($errors as $error) {
        $errortext .= "<li>".$error."</li>";
    }
    die("<span class='failure'><h3>Sorry, The following errors occured:</h3><ol>". $errortext ."</ol><a href='contact.html' class='more'>Refresh Form</a></span>");
}


// --------------------------------------//
// Send the email // INSERT YOUR EMAIL HERE
$to = "james@strong-links.org";
// --------------------------------------//


$subject = "Contact Form: $name";
$message = "$message";
$headers = "From: $email";

mail($to, $subject, $message, $headers);

// Die with a success message
die("<hr/><span class='success'><h3>Successfully Sent!</h3> Your message is on its way, we will respond to you shortly.</span><div title='SPACER' style='height: 200px;'></div>");

// A function that checks to see if
// an email is valid
function validEmail($email)
{
   $isValid = true;
   $atIndex = strrpos($email, "@");
   if (is_bool($atIndex) && !$atIndex)
   {
      $isValid = false;
   }
   else
   {
      $domain = substr($email, $atIndex+1);
      $local = substr($email, 0, $atIndex);
      $localLen = strlen($local);
      $domainLen = strlen($domain);
      if ($localLen < 1 || $localLen > 64)
      {
         // local part length exceeded
         $isValid = false;
      }
      else if ($domainLen < 1 || $domainLen > 255)
      {
         // domain part length exceeded
         $isValid = false;
      }
      else if ($local[0] == '.' || $local[$localLen-1] == '.')
      {
         // local part starts or ends with '.'
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $local))
      {
         // local part has two consecutive dots
         $isValid = false;
      }
      else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
      {
         // character not valid in domain part
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $domain))
      {
         // domain part has two consecutive dots
         $isValid = false;
      }
      else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
                 str_replace("\\\\","",$local)))
      {
         // character not valid in local part unless 
         // local part is quoted
         if (!preg_match('/^"(\\\\"|[^"])+"$/',
             str_replace("\\\\","",$local)))
         {
            $isValid = false;
         }
      }
      if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A")))
      {
         // domain not found in DNS
         $isValid = false;
      }
   }
   return $isValid;
}

?>

I got this from the web and changed the fields to suit the form. What I don't understand is how this can send a mail without an outgoing SMTP??

You are correct in your suspicion, you do need an SMTP server. If you are running in a Windows environment, the 'mail' function might use a built in Windows SMTP (which might need to be configured).

Here is the PHP documentation.
More specifically, the runtime configuration

Also, are you getting any specific error message? If not, what is your output? Do you have any PHP Ini settings for mail?

Thanks, I am using Debian. I am not getting any error messages, in fact it says sent successfully.

Where would I specify the outgoing SMTP server?

Ah, not quite as familiar with linux specific email details. However - if it is your own server, you'll probably want to setup sendmail (apt-get install sendmail). The settings are INI settings, they can be set at run time, or directly in the php.ini file. To find what settings are currently in place, add a new .php file to your web server and add this line to it: <?php phpinfo(); ?>. You'll be able to pull this up in the browser to see your current settings and the .INI location.

Additionally, based on the mail() documentation and possibly more relevant to your code example; what do you get by checking the return of calling 'mail'?

$wasAcceptedForDelivery = mail(...);
if (!$wasAcceptedForDelivery)
{
    die("<span class='failure'><h3>Sorry, Server not configured for e-mail.</h3></span>");
}

Okay so I've done some more research, and what I am trying to do is send mail through an external SMTP (which in this case is Gmail).

My understanding is that this is impossible for PHP, unless you have a localised email server, which I think will be too complicated.

Is there any other way? I really just want a contact form on our website.

commented: Good information. That does change the context of the original question. +2

Hi all,

James you can send an email to Gmail SMTP, you don't need sendmail to do this because you're going to connect directly to the SMTP server. Check this example:

Which makes uses of PHPMailer library:

You can do it without: you need to use PHP sockets and you have to create a script that listens to the replies of the SMTP server, otherwise it will not work. Using a library like PHPMailer is probably the best solution. Bye!

commented: Great post! +2

Thanks everyone. That's quite helpful. For the meantime I'm now using a free template to manage this, but will try as Kyle suggested.

Thanks!

James, if you could mark the thread as resolved, that would be great! (Any future questions could easily fit their own thread)

Thank-you, Kyle

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.