Php contact form with html email


#1

I am trying to style the outgoing email to table format but having lots of problems. I have looked through stack overflow, css trick and lots of others but still cannot get any of them to style the email. The form works and sends ok but cannot get i to style. the working form is this.

<?php
 
if(isset($_POST['email'])) {
 
     
 
    // EDIT THE 2 LINES BELOW AS REQUIRED
 
    $email_to = "my@email.com";
 
    $email_subject = "Website Form Enquires";
 
      
 
    function died($error) {
 
        // your error code can go here
 
        echo "We are very sorry, but there were error(s) found with the form you submitted. ";
 
        echo "These errors appear below.<br /><br />";
 
        echo $error."<br /><br />";
 
        echo "Please go back and fix these errors.<br /><br />";
 
        die();
 
    }
 
     
 
    // validation expected data exists
 
    if(!isset($_POST['first_name']) ||
 
        !isset($_POST['last_name']) ||
 
        !isset($_POST['email']) ||
 
        !isset($_POST['telephone']) ||
		
	    !isset($_POST['postcode']) ||
		
	    !isset($_POST['service']) ||
		
	    !isset($_POST['property_type']) ||

        !isset($_POST['comments'])) {
 
        died('We are sorry, but there appears to be a problem with the form you submitted.');      
 
    }
 
    $first_name = $_POST['first_name']; // required
 
    $last_name = $_POST['last_name']; // required
 
    $email_from = $_POST['email']; // required
 
    $telephone = $_POST['telephone']; // required
	
    $postcode = $_POST['postcode']; // required
	
    $service = $_POST['service']; // required
	
    $property_type = $_POST['property_type']; // required
 
    $comments = $_POST['comments']; // required
 
     
 
    $error_message = "";
 
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
 
  if(!preg_match($email_exp,$email_from)) {
 
    $error_message .= 'The Email Address you entered does not appear to be valid.<br />';
 
  }
 
    $string_exp = "/^[A-Za-z .'-]+$/";
 
  if(!preg_match($string_exp,$first_name)) {
 
    $error_message .= 'The First Name you entered does not appear to be valid.<br />';
 
  }
 
  if(!preg_match($string_exp,$last_name)) {
 
    $error_message .= 'The Last Name you entered does not appear to be valid.<br />';
 
  }
 
  if(strlen($telephone) < 6) {
 
    $error_message .= 'Please enter a valid telephone number.<br />';
 
  } 
 
  if(strlen($postcode) < 4) {
 
    $error_message .= 'Please enter your post code.<br />';
 
  }  
 
  if(strlen($comments) < 2) {
 
    $error_message .= 'The Comments you entered do not appear to be valid.<br />';
 
  }
 
  if(strlen($error_message) > 0) {
 
    died($error_message);
 
  }
 
    $email_message = "Form details below.\n\n";
 
     
 
    function clean_string($string) {
 
      $bad = array("content-type","bcc:","to:","cc:","href");
 
      return str_replace($bad,"",$string);
 
    }
	
    $email_message .= "First Name: ".clean_string($first_name)."\n";
 
    $email_message .= "Last Name: ".clean_string($last_name)."\n";
 
    $email_message .= "Email: ".clean_string($email_from)."\n";
 
    $email_message .= "Telephone: ".clean_string($telephone)."\n";
	
    $email_message .= "Postcode: ".clean_string($postcode)."\n";
	
	$email_message .= "service: ".clean_string($service)."\n";
	
	$email_message .= "Property Type: ".clean_string($property_type)."\n";

    $email_message .= "Comments: ".clean_string($comments)."\n";
 
     
 
     
 
// create email headers
 
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
 
'X-Mailer: PHP/' . phpversion();
 
@mail($email_to, $email_subject, $email_message, $headers); 
 
?>
 
 
 
<!-- include your own success html here -->
 
 
 
Thank you for contacting us
 
 
 
<?php
 
}
 
?>

I have tried this to style it…

    $email_message = "<table style='width:100%' cellpadding='5'>";
    $email_message .= "<tr>";
    $email_message .= "<td>First Name</td>";
    $email_message .= "<td>$first_name</td>";
    $email_message .= "</tr>";
    $email_message .= "<tr>";
    $email_message .= "<td>Last Name</td>";
    $email_message .= "<td>$last_name</td>";
    $email_message .= "</tr>";
    $email_message .= "<tr>";
    $email_message .= "<td>Email</td>";
    $email_message .= "<td>$email_from</td>";
    $email_message .= "</tr>";
    $email_message .= "<tr>";
    $email_message .= "<td>Telephone</td>";
    $email_message .= "<td>$telephone</td>";
    $email_message .= "</tr>";
    $email_message .= "<tr>";
    $email_message .= "<td>Postcode</td>";
    $email_message .= "<td>$postcode</td>";
    $mailBody .= "</tr>";
    $mailBody .= "<tr>";
    $mailBody .= "<td>Service Required</td>";
    $mailBody .= "<td>$service</td>";
    $mailBody .= "</tr>";
    $mailBody .= "<tr>";
    $mailBody .= "<td>Property Type</td>";
    $mailBody .= "<td>$property_type</td>";
    $mailBody .= "</tr>";
    $mailBody .= "<tr>";
    $mailBody .= "<td>Comments</td>";
    $mailBody .= "<td>$comments</td>";
    $mailBody .= "</tr>";
    $mailBody .= "</table>";

and the headers too

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

when i get the email all i see is all the code

and but it does put th entries in. …where am I going wrong. I am new to php and struggling with getting this form styled. been looking for a solution for over a month now but nothing works…please help

#2

I personally would use Swiftmailer https://swiftmailer.symfony.com/ which is what I use or PHPMailer https://github.com/PHPMailer/PHPMailer. It’ll make your life easier doing the hefty lifting for you. However, most important don’t use Tables for HTML and I don’t think you can stylize Tables in an Email? Anyways Swiftmailer or PHPMailer allows HTML/CSS to be used and is also pretty easy to do so. I personally don’t like using HTML/CSS when it comes to emails for a lot of people don’t bother with it and/or it’s treated like junk mail.

Here’s my PHP ->

$submit = filter_input(INPUT_POST, 'submit', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if (isset($submit) && $submit === 'submit') {
    $token = filter_input(INPUT_POST, 'token', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    if (!empty($token)) {
        if (hash_equals($_SESSION['token'], $token)) {
            /* The Following to get response back from Google recaptcha */
            $url = "https://www.google.com/recaptcha/api/siteverify";

            $remoteServer = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_SANITIZE_URL);
            $response = file_get_contents($url . "?secret=" . PRIVATE_KEY . "&response=" . \htmlspecialchars($_POST['g-recaptcha-response']) . "&remoteip=" . $remoteServer);
            $recaptcha_data = json_decode($response);
            /* The actual check of the recaptcha */
            if (isset($recaptcha_data->success) && $recaptcha_data->success === TRUE) {
                $data['name'] = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                $data['email'] = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                $data['phone'] = filter_input(INPUT_POST, 'phone', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                $data['website'] = filter_input(INPUT_POST, 'website', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                $data['reason'] = filter_input(INPUT_POST, 'reason', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                $data['comments'] = filter_input(INPUT_POST, 'comments', FILTER_SANITIZE_FULL_SPECIAL_CHARS);

                $send = new Email($data);
            } else {
                $success = "You're not a human!"; // Not of a production server:
            }
        } else {
            // Log this as a warning and keep an eye on these attempts
        }
    }
}

Here’s my class:

class Email {

    public $result = \NULL;

    public function __construct(array $data) {
        $this->result = $this->email($data);
    }

    private function email(array $data) {
        /* Setup swiftmailer using your email server information */
        if (filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_URL) == "localhost") {
            $transport = Swift_SmtpTransport::newInstance(EMAIL_HOST, EMAIL_PORT); // 25 for remote server 587 for localhost:
        } else {
            $transport = Swift_SmtpTransport::newInstance(EMAIL_HOST, 25);
        }

        $transport->setUsername(EMAIL_USERNAME);
        $transport->setPassword(EMAIL_PASSWORD);

        /* Setup To, From, Subject and Message */
        $message = Swift_Message::newInstance();

        $name = $data['name'];
        $email_from = $data['email'];
        $subject = $data['reason'] . ' email address ' . $data['email'];
        $comments = $data['phone'] . ' ' . $data['website'] . ' ' . $data['comments'];

        /*
         * Email Address message is going to
         */
        $message->setTo([
           example@email.com' => 'John Doe' // Email Address / Real Name
        ]);

        $message->setSubject($subject); // Subject:
        $message->setBody($comments); // Message:
        $message->setFrom($email_from, $name); // From and Name:

        $mailer = Swift_Mailer::newInstance($transport); // Setting up mailer using transport info that was provided:
        $result = $mailer->send($message, $failedRecipients);

        if ($result) {
            return TRUE;
        } else {
            echo "<pre>" . print_r($failedRecipients, 1) . "</pre>";
            return FALSE;
        }
    }

}

I just wanted to show it’s easy to set it up and Swiftmailer has documentation on how to incorporate HTML/CSS into the email.


#3

Ive been to swiftmailer and cannot find the so called library. The whole thing looks soo complicated and I cant even find a way to get to email with github so unless I want to give another month trying to understand and self learn again I will give them a miss. I am not a professional website developer so lots of it dosent make sense anyway, i am self taught and all i want to do is style the email which will go no where else but back to me. i just want it to look better. is there any way I can style my own as it took me forever to do that one??