Письма попадают в спам. Чего-то не хватает в заголовках? PHP: function send_email($to, $msg, $subject) { $EOL = "\r\n"; $headers = "MIME-Version: 1.0;$EOL"; $headers.= "Content-Type: text/html; charset=utf-8$EOL"; $headers.= 'From: Говнокодер <noreply@example.com>'.$EOL; $headers.= "Reply-To: noreply@example.com$EOL"; $headers.= "X-Mailer: PHP/".phpversion().$EOL; return mail($to, $subject, $msg, $headers); }
Возможно ты отправляешь с IP который в базе спамеров. Домен не подтверждён DKIM или чем-то похожим. Сервер с которого отправляешь, может не правильно настроен. Если используешь хостинг, попробуй отправить через SMTP с помощью PHPMailer.
Переименуйте тему в "Письма попадают в спам". Тут не в функции дело походу. Нашёл сервис mail-tester.com, проверился на нём и вот результат. Не понятно что ему в заголовке From и Subject не нравится. Там можно использовать кириллицу вообще? Или может кодировка должна быть Windows 1251? У меня UTF-8.
Возможно ты оформил не по стандарту, отправь через PHPMailer посмотри как правильнее или почитай стандарт. В почтовом клиенте посмотри заголовки, в гмаил и яндексе смотри свойство письма или оригинал.
В порядке появления: 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.
Поставил PHPMailer. Точнее, оказалось что он уже стоит в Wordpress. Пытаюсь сейчас отправлять письма с SMTP mail.ru. Пишет "Message sent!", но мне ничего не приходит ни на мейл, ни на гмейл. Посмотрите что не так? Отправляю с Windows пока. На сколько я понимаю, никакого дополнительного софта при отправке через сторонний SMTP ставить не нужно. PHP: function send_email_smtp($to, $subject, $html) { require_once($this->site_dir.'wp-includes/class-phpmailer.php'); require_once($this->site_dir.'wp-includes/class-smtp.php'); //SMTP needs accurate times, and the PHP time zone MUST be set //This should be done in your php.ini, but this is how to do it if you don't have access to that date_default_timezone_set('Etc/UTC'); $from = 'noreply@example.com'; //Create a new PHPMailer instance $mail = new PHPMailer; //Tell PHPMailer to use SMTP //$mail->isSMTP(); // с этой хренью скрипт вообще висит //Enable SMTP debugging // 0 = off (for production use) // 1 = client messages // 2 = client and server messages $mail->SMTPDebug = 2; //Ask for HTML-friendly debug output $mail->Debugoutput = 'html'; //Set the hostname of the mail server $mail->Host = "smtp.mail.ru"; //Set the SMTP port number - likely to be 25, 465 or 587 $mail->Port = 465; //Whether to use SMTP authentication $mail->SMTPAuth = true; //Username to use for SMTP authentication $mail->Username = $from; //Password to use for SMTP authentication $mail->Password = "my_password"; //Set who the message is to be sent from $mail->setFrom($from, 'Freakmeister'); //Set an alternative reply-to address $mail->addReplyTo($from, 'Freakmeister'); //Set who the message is to be sent to $mail->addAddress($to); //Set the subject line $mail->Subject = $subject; //Read an HTML message body from an external file, convert referenced images to embedded, //convert HTML into a basic plain-text alternative body $mail->msgHTML($html); //Replace the plain text body with one created manually //$mail->AltBody = strip_tags($html); //Attach an image file //$mail->addAttachment('images/phpmailer_mini.png'); //send the message, check for errors if (!$mail->send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message sent!"; } }
Очень странно, попробуй с smtp gmail, smtp yandex отправить, если и с них не уходит, то будет странно.
А вот эта штука точно не нужна? PHP: $mail->isSMTP(); У меня с ней отправка просто вешалась. Тут писали, что её можно вырубить, но я не уверен.
Нужна, чтобы не отправлял через PHP функцию mail(), то есть не через mail.ru, а локальный sendmail который настроен на сервере.
Хрень какая-то. Добавил "ssl://" перед хостом и заработало. Теперь другая проблема - кириллица в setFrom и addReplyTo: //add Сейчас бы не юзать utf-8 по-умолчанию в 2016м... PHP: $mail->CharSet = 'utf-8';
Имею в виду, что UTF-8 надо выставлять вручную строчкой, которую я привёл. Тут ещё с mail.ru проблема какая-то: Код (Text): SMTP -> FROM SERVER:451 Ratelimit exceeded for mailbox <noreply@example.com>. Try again later. Даже хз с чем это связано - с "почтой для бизнеса" или в их SMTP стоит какой-то минимальный временной промежуток, через который можно отправлять письма.
Возможно, например в gmail что-то 500 писем в день можно отправить, надо читать документацию, ещё у yandex есть pdd.yandex можно через него если нужен свой домен