Здравствуйте. Несколько лет назад один человек мне помог с формой отправки файлов на почту. Выглядела она довольно просто: PHP: $subject = "Заг"; $mailto = "exam@gmail.com"; // кому отправляем $message = "Текст сообщения"; $separator = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$separator}x"; $eol = PHP_EOL; $filesize = ''; // Заголовки $headers = 'From: от кого example@m.ru' . $eol; $headers .= 'MIME-Version: 1.0' . $eol; $headers .= 'Content-Type: multipart/mixed; boundary=' . $separator . $eol . $eol; $headers .= 'Content-Transfer-Encoding: 7bit' . $eol; $headers .= 'This is a MIME encoded message.' . $eol . $eol; // Сообщение $headers .= '--' . $separator . $eol; $headers .= 'Content-Type: text/plain; charset=utf-8' . $eol; $headers .= 'Content-Transfer-Encoding: 8bit' . $eol . $eol; $headers .= $message . $eol . $eol; // Прикрепляем файлы $files = $_FILES['fileFF']; for($i = 0; $i < count($files['name']); $i++) { if(is_uploaded_file($files['tmp_name'][$i])) { $file = $files['tmp_name'][$i]; $filename = $files['name'][$i]; $filetype = $files['type'][$i]; $filesize += $files['size'][$i]; $content = chunk_split(base64_encode(file_get_contents($file))); $headers .= '--' . $separator . $eol; $headers .= 'Content-Type: '.$filetype.'; name=' . $filename . $eol; $headers .= 'Content-Transfer-Encoding: base64' . $eol; $headers .= 'Content-Disposition: attachment; filename=' . $filename . $eol . $eol; $headers .= $content . $eol . $eol; $headers .= '--' . $mime_boundary . $eol; } } // Отправка сообщения if (mail($mailto, $subject, '', $headers)){ echo 'ok'; } else { echo 'error'; } И всё это работало до пары, до времени, пока не обновился php. Теперь в новых php использовать $eol нельзя (и еще много чего нельзя), ибо ничего не отправиться. Так как я прикреплении файлов в последнее время особо не нуждался, я просто нашел где-то простую форму, которая работала на последних php. PHP: $to = 'komu'; $subject = 'zag'; $message = "text"; $headers = 'From: exam@example.com' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); if(mail($to, $subject, $message, $headers)){ echo "ok"; } else { echo "error"; } Теперь у меня вновь появилась нужда в отправке файлов. Поискав в сети простых форм, я был удивлён, так как одна форма была "лучше" другой. Какие-то велосипеды, какие-то лишние php файлы, какой-то php mail'er. зачем всё? - непонятно. Подскажите, что к моей простой форме нужно дописать, чтобы работала функция отправки файлов на почту?
вы смеётесь или вы меня действительно не поняли? У меня была форма, которая работала без PHPmailer и swiftmailer. Она меня устраивала. Потом обновляется php и хана форме. Как сделать то же самое, чтобы работало на последних версиях Php без phpmailer?
Что не работает? Должна быть причина. Не знаешь? Почитай книгу для новичков по HTML и PHP. Особенно отладку. --- Добавлено --- @Fell-x27 а мой ответ ироничный?
Warning: mail(): Multiple or malformed newlines found in additional_header inE:\openserver\OpenServer\domains\tor.real\forma2.php on line 75 ok
Отправка почты c файлами без велосипедов, смс и регистрации с помощью компонента ZendMail (весь Zend Framework 2.0 тащить не обязательно) PHP: <?php require 'Zend/Config.php'; require 'Zend/Mail.php'; require 'Zend/Config/Ini.php'; require 'Zend/Mail/Transport/Smtp.php'; $transport = new Zend_Mail_Transport_Smtp($server, ['port' => $port, 'auth' => 'login', 'username' => $login, 'password' => $password]); Zend_Mail::setDefaultTransport($transport); $mail = new Zend_Mail('windows-1251'); $mail->setFrom($login, $from_name); $mail->addTo($to_email, $to_name); $mail->setSubject($subject); $mail->setBodyText($text); foreach ($files as $name => $path) { $data = file_get_contents($path); $attachment = new Zend_Mime_Part($data); $attachment->filename = $name; $attachment->type = 'application/octet-stream'; $attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT; $attachment->encoding = Zend_Mime::ENCODING_BASE64; $mail->addAttachment($attachment); } $mail->send();
Это и был "велосипед". Слово "велосипед" происходит из выражения "изобрести велосипед" - сделать то, что давно сделано за нас. Поэтому "без велосипедов" означает использовать правильные проверенные решения (PHPMailer, Swiftmailer, ZendMail и т.д.) Чтобы ваша старая форма работала, нужна не только определенная версия PHP, но еще и удачная конфигурация хостинга. Это был "велосипед". Да, в php есть функция mail(). Предложенные решения даже используют её. Но она не позволяет отправлять файлы простым способом. И здесь можно использовать готовую библиотеку, точно реализующую RFC 1341/7.2, или реализовать его самостоятельно, или написать минимальное временное решение для текущей конфигурации.
улыбнулся))) Да. Мой грешок. Мой грешок использовать слова не по назначению. Сам презираю такие качества у людей... Не велосипед, а костыль. Да да, именно костыль. phpmailer - костыль. Чтобы отправить пару файлов на почту нужно использовать phpmailer... Всё могло быть проще, но мне приходится сувать какую-то библиотеку php файлов себе на хостинг. Ну не бред? Ведь можно обойтись одним файлом, как в моём старом случае, но приходится загружать over до*уя файлов. Это маразм, товарищи.
@drkrol, просто замени PHP: $eol= PHP_EOL; на PHP: $eol= "\r\n"; на винде PHP_EOL это "\r\n", на юниксах это "\n". а почтовые заголовки полюбому должны разделяться CRLF, то есть "\r\n" ! https://tools.ietf.org/html/rfc5322
Сам подумай, тебе главное чтобы был один файл, можно и PHPMailer в один файл засунуть. Зачем вообще использовать PHP? Пиши всё на нулях и единицах. Всё по тому что RFC для почты довольно объёмный, и пока ты тратишь дни своей жизни на нытьё, я написал за пол минуты это сообщение и первое про PHPmailer, чтобы сэкономить его тебе, но видимо тебе интереснее спорить о фигне и ничего не делать. Так можно дойти и до жизни в пещере без огня.
Я не нашел толковой инструкции на русском с использованием phpmailer. Там, где не надо было разжевывать они разжевали, а там где нужно было разложить всё по полочкам, они забили на это болт. Это я про инструкции...
google translate, словарь, заплатить переводчику там три с половины метода в классе PHPMailer, ну и всегда можно прочитать исходный код, на крайний случай можно было задать вопрос на форуме, что конкретно не понятно
@drkrol @artoodetoo https://bugs.php.net/bug.php?id=68776 Короче запретили стартовать тело сообщения (писать два CRLF подряд) через заголовки, как теперь в принципе отправить файл через mail() - наверное использовать аргумент $message для boundary и данных...
@drkrol тут хорошее обсуждение, как правильно отправлять почту, так что пусть будет, если нужно личные данные удалить которых я не вижу, то пиши, сделаем