Справочники, инструменты, документация

PHP: Как предотвратить попадание писем в спам, отправленных через mail()

Используя функцию PHP mail() для отправки электронных писем, случается что письма могут попадать в спам, несколько вариантов решения.

Исправить заголовки

$headers = "From: myplace@example.com\r\n";
$headers .= "Reply-To: myplace2@example.com\r\n";
$headers .= "Return-Path: myplace@example.com\r\n";
$headers .= "CC: sombodyelse@example.com\r\n";
$headers .= "BCC: hidden@example.com\r\n";

if (mail($to,$subject,$message,$headers)) {
  echo "The email has been sent!";
} else {
  echo "The email has failed!";
}

Отправляйте письма через SMTP сервер, например с помощью PHPMailer

<?php
// Подключение библиотеки phpmailer
require 'php-mailer/PHPMailer.php';
require 'php-mailer/SMTP.php';
require 'php-mailer/Exception.php';

if(isset($_POST['name'])&& isset ($_POST['phone'])){

// Переменные, которые отправляет пользователь
$name = $_POST['name'];
$phone = $_POST['phone'];

$mail = new PHPMailer\PHPMailer\PHPMailer();
try {
  $msg = "ok";
  $mail->isSMTP();  
  $mail->CharSet = "UTF-8";                     
  $mail->SMTPAuth  = true;

  // Настройки вашей почты
  $mail->Host = 'smtp.yandex.ru'; // SMTP сервера GMAIL
  $mail->Username = 'mymail@yandex.by'; // Логин на почте
  $mail->Password = 'pass'; // Пароль на почте
  $mail->SMTPSecure = 'ssl';
  $mail->Port = 465;
  $mail->setFrom('examplemail@yandex.by', 'Bio RenGen'); // Адрес самой почты и имя отправителя

  // Получатель письма
  $mail->addAddress('example@yandex.by'); 
  $mail->addAddress('example@rambler.ru'); // Ещё один, если нужен
  $mail->addAddress('example@gmail.com'); // Ещё один, если нужен

  // Прикрепление файлов к письму, пока не надо

if (!empty($_FILES['myfile']['name'][0])) {
  for ($ct = 0; $ct < count($_FILES['myfile']['tmp_name']); $ct++) {
    $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['myfile']['name'][$ct]));
    $filename = $_FILES['myfile']['name'][$ct];
    if (move_uploaded_file($_FILES['myfile']['tmp_name'][$ct], $uploadfile)) {
      $mail->addAttachment($uploadfile, $filename);
    } else {
      $msg .= 'Не удалось прикрепить файл ' . $uploadfile;
    }
  }  

}

// -----------------------
// Само письмо
// -----------------------
$mail->isHTML(true);

$mail->Subject = 'Новая заявка на звонок!';
$mail->Body  = "<b>Имя:</b> $name <br>
<b>Тел:</b><br>$phone";

// Проверяем статус отправки сообщения
if ($mail->send()) {
  echo "Ожидайте звонка, спасибо!";
} else {
  echo "Сообщение не было отправлено. Неверно указаны настройки вашей почты";
}

} catch (Exception $e) {
  echo "Сообщение не было отправлено. Причина ошибки: {$mail->ErrorInfo}";
}

} else {
   echo "Сообщение не было отправлено. Пустые поля не допустимы!";
}