2

I have a contact form on my website, which actually works :D The problem is, that the email ends up in the spam folder. I have tried to do stuff with the header section, but nothing seems to work.

Can anyone help me with this?

thanks

<?php
    ini_set("display_errors", "0");
    $post_data = filter_input_array( INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS );

    $name = $post_data["name"];
    $email = $post_data["email"];
    $phone = $post_data["phone"];
    $website = $post_data["website"];
    $message = $post_data["message"];



    # select data that needs validation
    $validate = array(
        'required'  => array($name,$email,$message),
        'validEmail'    => array($email),
        'validNumber'   => array($phone),
        'validAlpha'    => array($name)
    );
    $formcontent = "Name: $name \nE-Mail: $email \nPhone: $phone \nWebsite: $website \nMessage: $message \n";
    $formcontent = wordwrap($formcontent, 70, "\n", true);

    $recipient = "thomas.teilmann@gmail.com"; 
    $subject = "Contact Messenbrink.eu"; 

    /*$mailheader = "From: $email \r\n";**/

    $mailheader .= "Reply-To: $name <$email>\r\n"; 
    $mailheader .= "Return-Path: $name <$email>\r\n"; 
    $mailheader .= "Content-Type: text/plain\r\n"; 
    $mailheader .= "Organization: Sender Organization\r\n";
    $mailheader .= "MIME-Version: 1.0\r\n";
    $mailheader .= "Content-type: text/plain; charset=iso-8859-1\r\n";
    $mailheader .= "X-Priority: 3\r\n";
    $mailheader .= "X-Mailer: PHP". phpversion() ."\r\n";
    $mailheader .= "From: $name <$email>\r\n";  

    function sendMail() {
        global $formcontent, $recipient, $subject, $mailheader;
        mail($recipient, $subject, $formcontent, $mailheader);
    }

    # error messages
    $errorsMsgs = array(
        'required'  => 'Please fill out all required fields.',
        'validEmail'    => 'is an invalid email address.',
        'validNumber'   => 'is an invalid number.',
        'validAlpha'    => 'contains invalid characters. This field only accepts letters and spaces.'
    );

    $errorMarkup    = "<h1>We found a few errors :-(</h1><h2>Please fix these errors and try again</h2><ol>";
    $errorMarkupEnd = "</ol>";
    $successMarkup  = "<h1>Success!</h1><h2>Your form was sent successfully.</h2>";
    $backMarkup     = "<a href=\"" . $_SERVER['HTTP_REFERER'] . "\">Back to form</a>";

    # begin state
    $valid = true;

    # loop through fields of error types
    foreach ($validate as $type => $fields) {
        # loop through values of fields to be tested
        foreach ($fields as $value) {
            # throw error if value is required and not entered
            if ($type === 'required' && strlen($value) === 0) {
                $errorMarkup .= "<li>$errorsMsgs[$type]</li>";
                $valid = false;
                break;
            }
            else if (
                $type === 'validEmail'  && !filter_var($value, FILTER_VALIDATE_EMAIL) ||
                $type === 'validNumber' && !preg_match('/^[0-9 ]+$/', $value) ||
                $type === 'validAlpha'  && !preg_match('/^[a-zA-Z ]+$/', $value)
            ) {
                if (strlen($value) === 0) {break;} # skip check if value is not entered
                $errorMarkup .= "<li>\"$value\" $errorsMsgs[$type]</li>";
                $valid = false;
                continue;
            }
        }
    }

    if ($valid) {
        sendMail();
        $body = $successMarkup . $backMarkup;
        $title = "Form sent";
    } else {
        $body = $errorMarkup . $errorMarkupEnd . $backMarkup;
        $title = "Form errors";
    }

    # write html ouput
    echo "<!DOCTYPE html><head><title>$title</title><style type=\"text/css\">body{margin:100px;font:16px/1.5 sans-serif;color:#111}h1{font-size:32px;margin:0;font-weight:bold}h2{font-size:18px;margin:0 0 20px 0}ol,li{list-style-position:inside;padding-left:0;margin-left:0}</style></head><body>$body</body></html>";
?>
paddotk
  • 1,359
  • 17
  • 31
Teilmann
  • 2,146
  • 7
  • 28
  • 57

6 Answers6

6

It has nothing to do with the PHP code but make sure that the email are being sent from a domain that is hosted on the server. That means it would be a bad idea to use your gmail address for sending though PHP. Every email that leaves the server needs to be signed and needs to have SPF records

This is usually because in the DNS a correct SPF record has not been setup. This can be easily done depending on the software you use. If you use cPanel then this is pretty much a two step process.

Some links: http://www.emailquestions.com/help-desk/2418-why-do-my-own-emails-go-into-spam.html http://www.google.co.uk/search?sourceid=chrome&ie=UTF-8&q=spf+records http://www.techtalkpoint.com/articles/setting-up-spf-records-in-cpanel-whm-and-namecheap/

umarsa
  • 135
  • 9
  • also the reputation of the SMTP matters. So each time your email bounces or if you dont clean up your maillist then the reputation of your IP address plummets. And more likely your email will end up in Spam (its especially valid with the big three - hot,yahoo, gmail) – Khuram Dec 19 '12 at 19:51
1

Ensure the message source is valid. Other than that, there isn't a lot you can do in PHP. The rest is down to your message contents, your mail server and the recipient server's spam filter.

Try to ensure that the data in your headers matches what would normally appear in a normal message. For instance, it is best that your From and Return-Path domain name match the server you are sending from.

I notice you just use \n as a line delimiter in the body. It should be \r\n irrespective of the OS you are using.

Ideally, study RFC 2822. If you don't have time to do that, at the very least, compare your headers with other emails that you believe to be valid. Where possible, match the order of headers, including placing the same number of blank lines in the appropriate places.

SimonMayer
  • 4,719
  • 4
  • 33
  • 45
0

I was having a similar problem with Gmail, I just selected the email and set to "Not Spam" now all emails sent by my server, when someone uses the contact form on my site end up on Inbox folder. Hope this helps.

Tasos
  • 1,622
  • 4
  • 28
  • 47
0

It's probably the smtp being used that is not valid.

If the contact form is just used to send emails to one mailfolder, I would just set up a rule there to not mark it as spam. Either that or actually validate your smtp.

Wesley van Opdorp
  • 14,888
  • 4
  • 41
  • 59
Snowflow
  • 149
  • 9
0

Spam isn't filtered by some setting, it's filtered by your word choice and how the message looks and also how well known the sender email address is. If you want to avoid the spam list, you have to word it in a way that does not sound spammy.

Brian Leishman
  • 8,155
  • 11
  • 57
  • 93
0

My one suggestion would be to have the email's From address be the email address of the actual mail account you're using to send these rather than the customer's email account. Your email provider may think they're spoofing if the email comes from their email address but not from a server on that domain.

You could instea put the customer's email address in the body of the email so you know who it's from.

itsmequinn
  • 1,054
  • 1
  • 8
  • 21