Задать вопрос
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);
  • Вопрос задан
  • 3479 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы