php email - как избежать попадания почты в ящик для спама - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть контактная форма на моем сайте, которая на самом деле работает: D Проблема в том, что письмо попадает в папку со спамом. Я пытался что-то сделать с заголовком, но ничего не получается.

Может ли кто-нибудь помочь мне с этим?

спасибо

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

Ответы [ 6 ]

6 голосов
/ 13 февраля 2012

Это не имеет ничего общего с кодом PHP, но убедитесь, что электронная почта отправляется с домена, размещенного на сервере. Это означает, что было бы плохой идеей использовать ваш адрес Gmail для отправки через PHP. Каждое письмо, которое покидает сервер, должно быть подписано и должно иметь записи SPF

Обычно это происходит потому, что в DNS не настроена правильная запись SPF. Это может быть легко сделано в зависимости от программного обеспечения, которое вы используете. Если вы используете cPanel, то это в значительной степени двухэтапный процесс.

Некоторые ссылки: 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/

1 голос
/ 13 февраля 2012

Убедитесь, что источник сообщения действителен. Кроме этого, в PHP мало что можно сделать. Остальное зависит от содержимого вашего сообщения, вашего почтового сервера и спам-фильтра сервера получателя.

Постарайтесь убедиться, что данные в ваших заголовках соответствуют тому, что обычно отображается в обычном сообщении. Например, лучше, чтобы ваше доменное имя From и Return-Path соответствовало серверу, с которого вы отправляете.

Я заметил, что вы просто используете \n в качестве разделителя строк в теле. Это должно быть \r\n независимо от используемой ОС.

В идеале, учеба RFC 2822 . Если у вас нет времени, по крайней мере, сравните ваши заголовки с другими электронными письмами, которые вы считаете действительными. По возможности, сопоставляйте порядок заголовков, включая размещение одинакового количества пустых строк в соответствующих местах.

0 голосов
/ 19 декабря 2012

У меня была похожая проблема с Gmail, я просто выбрал электронное письмо и установил «Не спам», теперь все письма, отправленные моим сервером, когда кто-то использует контактную форму на моем сайте, попадают в папку «Входящие». Надеюсь, это поможет.

0 голосов
/ 13 февраля 2012

Единственное, что я могу предложить, - это, чтобы адрес электронной почты отправителя был адресом электронной почты действительной учетной записи, которую вы используете для отправки, а не учетной записи электронной почты клиента.Ваш провайдер электронной почты может подумать, что он подделывает, если электронная почта приходит с их адреса электронной почты, а не с сервера в этом домене.

Вы можете указать адрес электронной почты клиента в теле письма, чтобы вы знали, откуда он.

0 голосов
/ 13 февраля 2012

Спам не фильтруется какими-либо настройками, он фильтруется по вашему выбору слова и тому, как выглядит сообщение, а также насколько известен адрес электронной почты отправителя.Если вы хотите избежать списка спама, вы должны произнести его так, чтобы это не звучало как спам.

0 голосов
/ 13 февраля 2012

Вероятно, используется используемый SMTP-файл, который недопустим.

Если контактная форма используется только для отправки писем в одну почтовую папку, я бы просто установил там правило, чтобы не отмечать ее как спам.Либо так, либо фактически подтвердите ваш SMTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...