• Что не так в этом коде: $headers .= "From: ". $email. "\r\n";?

    @MikhailNsk Автор вопроса
    Да, вы всё правильно пишете.
    Указал в "Reply-To" емэйл клиента.
    У меня хостинг reg.ru, по-моему там SPF и DKIM настраиваются автоматически. Сайт запускал "с нуля" и когда настраивал почту, настройки уже стояли (то ли SPF, то ли DKIM, сейчас уже забыл). Короче, со своими адресами проблем нет.
  • Что не так в этом коде: $headers .= "From: ". $email. "\r\n";?

    @MikhailNsk Автор вопроса
    Там обычный емэйл адрес из

    print_r($email) выводит электронный адрес

    В том то и дело, что всё вроде в порядке, никаких ошибок скрипт не выдаёт. Как написал ранее, скрипт два года работал вообще без проблем, никто ничего в нём не менял, и вдруг перестал...

    При этом, если добавить символ ">" в

    $headers .= "From: " . $email . ">\r\n";

    то всё снова работает (и ещё пара примеров в первом сообщении)

    Возможно, это связано с обработкой заголовков почтовыми сервиса (письма не приходят ни на Яндекс, ни на Mail.ru). А может, я не вижу какой-то очевидной мелочи... Но похоже никто пока не увидел.
  • Что не так в этом коде: $headers .= "From: ". $email. "\r\n";?

    @MikhailNsk Автор вопроса
    Валидация у меня есть. Я использую HTML5

    <input type="text" maxlength="40" name="name" autocomplete="on" placeholder="Иван Васильевич" required /><
    <input type="email" maxlength="40" name="email" autocomplete="on" placeholder="ivan@mail.ru" required />
    <input type="tel" maxlength="20" name="phone" autocomplete="on" placeholder="8-913-987-1234" required />
  • Что не так в этом коде: $headers .= "From: ". $email. "\r\n";?

    @MikhailNsk Автор вопроса
    Спасибо за ответ.

    И аргументы просматривал, и смотрел выдаёт ли ошибки функция mail(). Ошибок не обнаружил.

    Пробовал переставлять код (конкретно "header") местами - не помогает.

    Ниже вложил весь код скрипта. Это форма обратной связи с возможностью прикрепить несколько файлов. Может, что подскажете...

    (лирическое отступление) В основном я программирую на C# и JS, и там таких проблем у меня нет. А вот когда касаюсь PHP, у меня начинается "боль"... :) Часто решение ищешь тупо методом перебора, не понимая, почему предыдущий способ не работает, а этот вдруг заработал. Понятно, что есть какая-то логика, но чёт для меня она часто неочевидна, например как сейчас. :)

    ***

    <?php
    
    if (isset ($_POST['email']))
    {
    
      $to = "site@mail.ru";
      $email = $_POST['email'];
      $name = $_POST['name'];
      $phone = $_POST['phone'];
      $msg = $_POST['message'];
      
      $subject  = "Запрос с нашего сайта";
      
      $headers  = "MIME-Version: 1.0\r\n";
      $headers .= "From: admin@site.ru\r\n";
      
      $message = "<html><body style='font-family:Tahoma;'>
                  <h2 style='font-weight:bold; padding-bottom:10px;'>Запрос с нашего сайта</h2>\r\n
                  <p><b>Имя:</b> ".$name."</p>\r\n
                  <p><b>E-mail:</b> ".$email."</p>\r\n
                  <p><b>Телефон:</b> ".$phone."</p>\r\n
                  <p><b>Сообщение:</b> ".$msg."</p>\r\n
                  </body></html>";
    		 
      $filesize = '';
      $boundary = md5(date('r', time()));
      $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
      $message  = "
    
    Content-Type: multipart/mixed; boundary=\"$boundary\"
    
    --$boundary
    Content-Type: text/html; charset=\"utf-8\"
    Content-Transfer-Encoding: 7bit
    
    $message";
      for($i=0;$i<count($_FILES['file']['name']);$i++) {
          if(is_uploaded_file($_FILES['file']['tmp_name'][$i])) {
             $attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'][$i])));
             $filename = $_FILES['file']['name'][$i];
             $filetype = $_FILES['file']['type'][$i];
             $filesize += $_FILES['file']['size'][$i];
             $message.="
    
    --$boundary
    Content-Type: \"$filetype\"; name=\"$filename\"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename=\"$filename\"
    
    $attachment";
         }
       }
       $message.="
    --$boundary--";
    
      $allowed = array('image/jpg', 'image/jpeg', 'image/bmp', 'image/gif', 'image/png', 'application/pdf', 'application/msword', 'application/rtf', 'application/xls', 'application/dwg', 'application/pln', 'application/pla');
      
      if ($filesize < 15000000)
      {
        if (in_array($filetype, $allowed) === true || $filesize < 100)
        {
          mail($to, $subject, $message, $headers);
          
          echo "<div class=\"fixed-overlay\" style=\"display:block\" id=\"div1\"><div class=\"modal\" style=\"margin-left:-160px; top:42%\">
    	          <div class=\"modal_container green\"><a onclick=\"hidetxt('div1'); return false;\" href=\"#\" title=\"Закрыть\" class=\"close\">X</a>
    		        <b style=\"font-size:16px; padding:50px 20px 50px 20px\">Ваш запрос успешно отправлен!</b></div></div></div>";
        }
        
    	  else echo "<div class=\"fixed-overlay\" style=\"display:block\" id=\"div2\"><div class=\"modal\" style=\"margin-left:-280px; top:42%\">
    	             <div class=\"modal_container red\"><a onclick=\"hidetxt('div2'); return false;\" href=\"#\" title=\"Закрыть\" class=\"close\">X</a>
    				       <b>Ошибка, неправильный тип файла(ов).</b> <br><br> (допустимые типы: jpg, jpeg, bmp, gif, png, pdf, msword, rtf, xls, dwg, pln) <br><br> 
    				       <b>Попробуйте отправить запрос ещё раз, добавив файлы допустимых типов.</b></div></div></div>";
      }
      
      else echo "<div class=\"fixed-overlay\" style=\"display:block\" id=\"div3\"><div class=\"modal\" style=\"margin-left:-320px; top:42%\">
    	           <div class=\"modal_container red\"><a onclick=\"hidetxt('div3'); return false;\" href=\"#\" title=\"Закрыть\" class=\"close\">X</a>
    				     <b>Ошибка, размер файла(ов) превышает 15 Мб. <br><br> Попробуйте отправить запрос ещё раз, уменьшив количество файлов или их размер.</b></div></div></div>";
    }
    
    ?>
  • "Лоадер" во время выполнения js-скрипта?

    @MikhailNsk Автор вопроса
    Спасибо за ответ.

    Я таки нашёл способ.

    Использовал вот такую конструкцию:

    $('div.region').on("mousedown", function (e) { $('div.loader').show(); }).on('mouseup', function (e) { ... }

    При нажатии мышки запускается "loader", а при отпускании запускается скрипт. Так как клик происходит быстро, то человеку незаметно, а машина уже успела обработать первую функцию и запустить вторую.

    "web worker" - это, так понимаю, создать отдельный поток. Будут изучать, в параллельных вычислениях пока не так силён.