Задать вопрос
7unikum
@7unikum
начинаю познавать php

PHP отправка нескольких файлов на почту. Неправильный цикл?

Люди добрые, гуру php помогите девушке. Бьюсь 4-ый день над проблемой. Имеется самописная форма, с формы все данные отправляются на мыло. Все то хорошо, но столкнулась с проблемой, при прикреплении нескольких файлов на почту приходит только один, сделала цикл, mail вне цикла, все равно приходит один файл, если саму функцию mail переношу в цикл, то при отправке например 4-ех файлов, приходит 4 письма и в каждом письме отдельный файл, как собрать все это воедино. Из за проверки while ($i <= 3) письма приходят только тогда когда вложений 3 и более. Я думаю нужно как то вместо цифры вставить переменную в которой будет храниться число прикрепленных файлов.
Ну а основной вопрос это как в $multipart добавить все прикрепленные файлы чтобы они пришли в одном письме.
Вот форму переместила в отдельный файл, все лишнее вырезала, проверки итд, чтобы не было куча кода.
Ссылка на форму
Заранее спасибо.
<input class="upload-link__inp" name="mail_file[]" type="file" multiple/>


function sendMail($mailTo, $title, $html, $file)
    {
        
        if (empty($file)) { // если файла нет, то отправляем обычно письмо
            $headers = "From: Robot\r\n";
            $headers .= "MIME-Version: 1.0;\r\n";
            $headers .= "Content-type: text/html; charset=UTF-8\r\n";
            mail($mailTo, $title, $html, $headers);
        } else {  // если есть вложение к почте, то изобретаем велосипед :)
            
            $i = 0;
            while ($i <= 3){
            
            $fp = fopen($file["tmp_name"][$i], "rb");
            if (!$fp) {
                echo "Cannot open file";
                exit();
            }
            $data = fread($fp, filesize($file["tmp_name"][$i]));
            fclose($fp);
            
            $name = $file["name"][$i];
            
            $boundary = "--" . md5(uniqid(time()));

            $headers = "MIME-Version: 1.0;\r\n";
            $headers .= "From: Robot\r\n";
            $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
                 
            $multipart = "--$boundary\r\n";
            $multipart .= "Content-Type: text/html; charset=UTF-8\r\n";
            $multipart .= "Content-Transfer-Encoding: base64\r\n";
            $multipart .= "\r\n";
            $multipart .= chunk_split(base64_encode($html));

            $multipart .= "\r\n\r\n--$boundary\r\n";
            $multipart .= "Content-Type: " . $file["type"][$i] . "; name=\"$name\"\r\n";
            $multipart .= "Content-Transfer-Encoding: base64 \r\n";
            $multipart .= "Content-Disposition: attachment; filename=\"$name\"\r\n";
            $multipart .= "\r\n";
            $multipart .= chunk_split(base64_encode($data));
            $multipart .= "\r\n--$boundary--\r\n";
			
                $i++;
                
            }
            mail($mailTo, $title, $multipart, $headers);
        }

    }
    
        if (!empty($_FILES["mail_file"])) {
                    $file = array();
                    $file = $_FILES["mail_file"];
        }

   sendMail($mailTo, $title, $html, $file);
  • Вопрос задан
  • 3482 просмотра
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Вы в цикле меняете boundary, а он должен быть одинаковым между всеми частями. HTML-часть тоже должно быть только одна. Чтобы исправить, вот эту часть
$boundary = "--" . md5(uniqid(time()));

            $headers = "MIME-Version: 1.0;\r\n";
            $headers .= "From: Robot\r\n";
            $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
                 
            $multipart = "--$boundary\r\n";
            $multipart .= "Content-Type: text/html; charset=UTF-8\r\n";
            $multipart .= "Content-Transfer-Encoding: base64\r\n";
            $multipart .= "\r\n";
            $multipart .= chunk_split(base64_encode($html));

надо поднять выше, оставить внутри else но вынести из цикла по файлам, т.к. она должна выполняться только один раз.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
uniqid не совсем уникальный
такой код даст следующий вывод
for ($i=0; $i<10; $i++) {
	echo uniqid(''), PHP_EOL;
}

результат
56af220bd338b
56af220bd338b
56af220bd338b
56af220bd338b
56af220bd3773
56af220bd3773
56af220bd3773
56af220bd3773
56af220bd3773
56af220bd3773
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽