За последние 24 часа нас посетили 17954 программиста и 1699 роботов. Сейчас ищет 1551 программист ...

Письма попадают в спам

Тема в разделе "Работа с почтой", создана пользователем Freakmeister, 25 май 2016.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Письма попадают в спам. Чего-то не хватает в заголовках?

    PHP:
    1. function send_email($to, $msg, $subject) {
    2.     $EOL = "\r\n";
    3.  
    4.     $headers = "MIME-Version: 1.0;$EOL";
    5.     $headers.= "Content-Type: text/html; charset=utf-8$EOL";
    6.     $headers.= 'From: Говнокодер <noreply@example.com>'.$EOL;
    7.     $headers.= "Reply-To: noreply@example.com$EOL";
    8.     $headers.= "X-Mailer: PHP/".phpversion().$EOL;
    9.  
    10.     return mail($to, $subject, $msg, $headers);
    11. }
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Возможно ты отправляешь с IP который в базе спамеров.
    Домен не подтверждён DKIM или чем-то похожим.
    Сервер с которого отправляешь, может не правильно настроен.

    Если используешь хостинг, попробуй отправить через SMTP с помощью PHPMailer.
     
  3. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Переименуйте тему в "Письма попадают в спам". Тут не в функции дело походу.
    Нашёл сервис mail-tester.com, проверился на нём и вот результат. Не понятно что ему в заголовке From и Subject не нравится. Там можно использовать кириллицу вообще? Или может кодировка должна быть Windows 1251? У меня UTF-8.

    [​IMG]
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Возможно ты оформил не по стандарту, отправь через PHPMailer посмотри как правильнее или почитай стандарт.
    В почтовом клиенте посмотри заголовки, в гмаил и яндексе смотри свойство письма или оригинал.
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    В порядке появления:
    1. поле from не кодировано по стандарту и содержит недопустимые (для 7-битной кодировки) символы. Кодировать.
    2. поле "от" и техническое поле "от" ссылаются на разные домены второго уровня. Исправить поле "от" в скрипте или сменить настройки почтового сервера.
    3. тело письма - гипертекстовое, но не содержит обязательного тега <html>. Оформить валидный XML-документ для HTML.
    4. письмо имеет только гипертекстовую версию, простой текст пропущен. Лучше добавить альтернативное тело.
    5. в распределенной системе спам-контроля Pyzor письмо с подобным содержимым считается спамом. Придумать свой текст или оформить заявку на включение в белые списки.
    6. айпишник отправителя замечен в рассылке спама. Улучшать репутацию своего сервера (если свой) или менять провайдера почты.
    7. SPF-запись на процедуре рукопожатия - в порядке.
    8. SPF-запись в процессе обмена заголовками - в порядке.
    9. поле темы не кодировано по стандарту и бла-бла-бла. См п1.
    10. См п1.
    11. в теле письма отношение пробельных символов к непробельным - недопустимо большое. Отказаться от красивого форматирования HTML-исходника. В идеале вообще в одну строку фигачить. Но кодировать и на чанки делить.
    12. добавка к пункту 2 - использован релей недопустимый для данного отправителя, или пытающийся подделаться под допустимый. Ну тут уже настройкой почтового сервера попахивает...

    В общем, присоединюсь к @denis01: пользуйтесь PHPMailer. Ну или тонко настраивайте почтовый стек.

    нельзя кириллицу. Локальная кодировка не влияет - все строки должны быть "упакованы" (кодированы) в транспортную кодировку. Делается это легко через тот же base64.
     
    denis01 нравится это.
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Вот про SPF я забыл, хорошо что Ganzal помнит
     
  7. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    А в PHPMailer это надо делать? Или там само всё закодирует?
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @Freakmeister там можно указать кодировку, а заголовки он уже правильно сгенирирует
     
  9. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Поставил PHPMailer. Точнее, оказалось что он уже стоит в Wordpress. Пытаюсь сейчас отправлять письма с SMTP mail.ru. Пишет "Message sent!", но мне ничего не приходит ни на мейл, ни на гмейл. Посмотрите что не так? Отправляю с Windows пока. На сколько я понимаю, никакого дополнительного софта при отправке через сторонний SMTP ставить не нужно.

    PHP:
    1. function send_email_smtp($to, $subject, $html) {
    2.    require_once($this->site_dir.'wp-includes/class-phpmailer.php');
    3.    require_once($this->site_dir.'wp-includes/class-smtp.php');
    4.  
    5.    //SMTP needs accurate times, and the PHP time zone MUST be set
    6.    //This should be done in your php.ini, but this is how to do it if you don't have access to that
    7.    date_default_timezone_set('Etc/UTC');
    8.    $from = 'noreply@example.com';
    9.  
    10.    //Create a new PHPMailer instance
    11.    $mail = new PHPMailer;
    12.    //Tell PHPMailer to use SMTP
    13.    //$mail->isSMTP(); // с этой хренью скрипт вообще висит
    14.    //Enable SMTP debugging
    15.    // 0 = off (for production use)
    16.    // 1 = client messages
    17.    // 2 = client and server messages
    18.    $mail->SMTPDebug = 2;
    19.    //Ask for HTML-friendly debug output
    20.    $mail->Debugoutput = 'html';
    21.    //Set the hostname of the mail server
    22.    $mail->Host = "smtp.mail.ru";
    23.    //Set the SMTP port number - likely to be 25, 465 or 587
    24.    $mail->Port = 465;
    25.    //Whether to use SMTP authentication
    26.    $mail->SMTPAuth = true;
    27.    //Username to use for SMTP authentication
    28.    $mail->Username = $from;
    29.    //Password to use for SMTP authentication
    30.    $mail->Password = "my_password";
    31.    //Set who the message is to be sent from
    32.    $mail->setFrom($from, 'Freakmeister');
    33.    //Set an alternative reply-to address
    34.    $mail->addReplyTo($from, 'Freakmeister');
    35.    //Set who the message is to be sent to
    36.    $mail->addAddress($to);
    37.    //Set the subject line
    38.    $mail->Subject = $subject;
    39.    //Read an HTML message body from an external file, convert referenced images to embedded,
    40.    //convert HTML into a basic plain-text alternative body
    41.    $mail->msgHTML($html);
    42.    //Replace the plain text body with one created manually
    43.    //$mail->AltBody = strip_tags($html);
    44.    //Attach an image file
    45.    //$mail->addAttachment('images/phpmailer_mini.png');
    46.  
    47.    //send the message, check for errors
    48.    if (!$mail->send()) {
    49.       echo "Mailer Error: " . $mail->ErrorInfo;
    50.    } else {
    51.       echo "Message sent!";
    52.    }
    53.  
    54. }
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Очень странно, попробуй с smtp gmail, smtp yandex отправить, если и с них не уходит, то будет странно.
     
  11. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    А вот эта штука точно не нужна?
    PHP:
    1. $mail->isSMTP();
    У меня с ней отправка просто вешалась. Тут писали, что её можно вырубить, но я не уверен.
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Нужна, чтобы не отправлял через PHP функцию mail(), то есть не через mail.ru, а локальный sendmail который настроен на сервере.
     
  13. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Хрень какая-то. Добавил "ssl://" перед хостом и заработало. Теперь другая проблема - кириллица в setFrom и addReplyTo:

    [​IMG]


    //add
    Сейчас бы не юзать utf-8 по-умолчанию в 2016м...
    PHP:
    1. $mail->CharSet = 'utf-8';
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Что имеешь ввиду?
     
  15. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Имею в виду, что UTF-8 надо выставлять вручную строчкой, которую я привёл.

    Тут ещё с mail.ru проблема какая-то:
    Код (Text):
    1. SMTP -> FROM SERVER:451 Ratelimit exceeded for mailbox <noreply@example.com>. Try again later.
    Даже хз с чем это связано - с "почтой для бизнеса" или в их SMTP стоит какой-то минимальный временной промежуток, через который можно отправлять письма.
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Возможно, например в gmail что-то 500 писем в день можно отправить, надо читать документацию, ещё у yandex есть pdd.yandex можно через него если нужен свой домен