За последние 24 часа нас посетили 21576 программистов и 1621 робот. Сейчас ищут 2008 программистов ...

Отправка файлов на почту без велосипедов

Тема в разделе "Сделайте за меня", создана пользователем drkrol, 25 авг 2016.

  1. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    Здравствуйте. Несколько лет назад один человек мне помог с формой отправки файлов на почту. Выглядела она довольно просто:
    PHP:
    1.     $subject = "Заг";
    2.     $mailto = "exam@gmail.com"; // кому отправляем
    3.     $message = "Текст сообщения";
    4.     $separator = md5(time());
    5.     $mime_boundary = "==Multipart_Boundary_x{$separator}x";
    6.     $eol = PHP_EOL;
    7.     $filesize = '';
    8.  
    9.    
    10.     // Заголовки
    11.     $headers = 'From: от кого example@m.ru' . $eol;
    12.     $headers .= 'MIME-Version: 1.0' . $eol;
    13.     $headers .= 'Content-Type: multipart/mixed; boundary=' . $separator . $eol . $eol;
    14.     $headers .= 'Content-Transfer-Encoding: 7bit' . $eol;
    15.     $headers .= 'This is a MIME encoded message.' . $eol . $eol;
    16.    
    17.     // Сообщение
    18.     $headers .= '--' . $separator . $eol;
    19.     $headers .= 'Content-Type: text/plain; charset=utf-8' . $eol;
    20.     $headers .= 'Content-Transfer-Encoding: 8bit' . $eol . $eol;
    21.     $headers .= $message . $eol . $eol;
    22.    
    23.     // Прикрепляем файлы
    24.     $files = $_FILES['fileFF'];
    25.     for($i = 0; $i < count($files['name']); $i++) {
    26.         if(is_uploaded_file($files['tmp_name'][$i])) {
    27.             $file = $files['tmp_name'][$i];
    28.             $filename = $files['name'][$i];
    29.             $filetype = $files['type'][$i];
    30.             $filesize += $files['size'][$i];
    31.            
    32.             $content = chunk_split(base64_encode(file_get_contents($file)));
    33.             $headers .= '--' . $separator . $eol;
    34.             $headers .= 'Content-Type: '.$filetype.'; name=' . $filename . $eol;
    35.             $headers .= 'Content-Transfer-Encoding: base64' . $eol;
    36.             $headers .= 'Content-Disposition: attachment; filename=' . $filename . $eol . $eol;
    37.             $headers .= $content . $eol . $eol;
    38.             $headers .= '--' . $mime_boundary . $eol;
    39.            
    40.         }
    41.     }  
    42.     // Отправка сообщения
    43. if (mail($mailto, $subject, '', $headers)){
    44. echo 'ok';
    45. } else {
    46. echo 'error';
    47. }
    И всё это работало до пары, до времени, пока не обновился php. Теперь в новых php использовать $eol нельзя (и еще много чего нельзя), ибо ничего не отправиться. Так как я прикреплении файлов в последнее время особо не нуждался, я просто нашел где-то простую форму, которая работала на последних php.

    PHP:
    1. $to      = 'komu';
    2. $subject = 'zag';
    3. $message = "text";
    4. $headers = 'From: exam@example.com' . "\r\n" .
    5.     'X-Mailer: PHP/' . phpversion();
    6.  
    7. if(mail($to, $subject, $message, $headers)){
    8.     echo "ok";
    9. } else {
    10.     echo "error";
    11. }
    Теперь у меня вновь появилась нужда в отправке файлов. Поискав в сети простых форм, я был удивлён, так как одна форма была "лучше" другой. Какие-то велосипеды, какие-то лишние php файлы, какой-то php mail'er. зачем всё? - непонятно. Подскажите, что к моей простой форме нужно дописать, чтобы работала функция отправки файлов на почту?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Fell-x27 нравится это.
  3. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    вы смеётесь или вы меня действительно не поняли? У меня была форма, которая работала без PHPmailer и swiftmailer. Она меня устраивала. Потом обновляется php и хана форме. Как сделать то же самое, чтобы работало на последних версиях Php без phpmailer?
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это самый ироничный пост, за всю мою форумную жизнь во всем интернете, а не только тут. Чесслово.
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Что не работает? Должна быть причина. Не знаешь? Почитай книгу для новичков по HTML и PHP. Особенно отладку.
    --- Добавлено ---
    @Fell-x27 а мой ответ ироничный? :rolleyes:
     
  6. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    Warning: mail(): Multiple or malformed newlines found in additional_header inE:\openserver\OpenServer\domains\tor.real\forma2.php on line 75
    ok
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Отправка почты c файлами без велосипедов, смс и регистрации с помощью компонента ZendMail (весь Zend Framework 2.0 тащить не обязательно)
    PHP:
    1. <?php
    2.  
    3. require 'Zend/Config.php';
    4. require 'Zend/Mail.php';
    5. require 'Zend/Config/Ini.php';
    6. require 'Zend/Mail/Transport/Smtp.php';
    7.  
    8. $transport = new Zend_Mail_Transport_Smtp($server, ['port' => $port,
    9.     'auth' => 'login',
    10.     'username' => $login,
    11.     'password' => $password]);
    12. Zend_Mail::setDefaultTransport($transport);
    13.  
    14. $mail = new Zend_Mail('windows-1251');
    15. $mail->setFrom($login, $from_name);
    16. $mail->addTo($to_email, $to_name);
    17. $mail->setSubject($subject);
    18. $mail->setBodyText($text);
    19.  
    20. foreach ($files as $name => $path) {
    21.   $data = file_get_contents($path);
    22.   $attachment = new Zend_Mime_Part($data);
    23.   $attachment->filename = $name;
    24.   $attachment->type = 'application/octet-stream';
    25.   $attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
    26.   $attachment->encoding = Zend_Mime::ENCODING_BASE64;
    27.   $mail->addAttachment($attachment);
    28. }
    29.  
    30. $mail->send();
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @[vs] автор же дал понять, что подозревает всех кто предлагает решения не с помощью его кода в смехе
     
    drkrol нравится это.
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это и был "велосипед". Слово "велосипед" происходит из выражения "изобрести велосипед" - сделать то, что давно сделано за нас. Поэтому "без велосипедов" означает использовать правильные проверенные решения (PHPMailer, Swiftmailer, ZendMail и т.д.) Чтобы ваша старая форма работала, нужна не только определенная версия PHP, но еще и удачная конфигурация хостинга. Это был "велосипед". Да, в php есть функция mail(). Предложенные решения даже используют её. Но она не позволяет отправлять файлы простым способом. И здесь можно использовать готовую библиотеку, точно реализующую RFC 1341/7.2, или реализовать его самостоятельно, или написать минимальное временное решение для текущей конфигурации.
     
    denis01 нравится это.
  11. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    улыбнулся)))

    Да. Мой грешок. Мой грешок использовать слова не по назначению. Сам презираю такие качества у людей...

    Не велосипед, а костыль. Да да, именно костыль. phpmailer - костыль. Чтобы отправить пару файлов на почту нужно использовать phpmailer... Всё могло быть проще, но мне приходится сувать какую-то библиотеку php файлов себе на хостинг. Ну не бред? Ведь можно обойтись одним файлом, как в моём старом случае, но приходится загружать over до*уя файлов. Это маразм, товарищи.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    @drkrol, просто замени
    PHP:
    1. $eol= PHP_EOL;
    на
    PHP:
    1. $eol= "\r\n";
    на винде PHP_EOL это "\r\n", на юниксах это "\n". а почтовые заголовки полюбому должны разделяться CRLF, то есть "\r\n" !
    https://tools.ietf.org/html/rfc5322
     
  13. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    первым делом я как раз это и сделал, но успехом не увенчался. ошибка та же
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Сам подумай, тебе главное чтобы был один файл, можно и PHPMailer в один файл засунуть.
    Зачем вообще использовать PHP? Пиши всё на нулях и единицах.

    Всё по тому что RFC для почты довольно объёмный, и пока ты тратишь дни своей жизни на нытьё, я написал за пол минуты это сообщение и первое про PHPmailer, чтобы сэкономить его тебе, но видимо тебе интереснее спорить о фигне и ничего не делать. Так можно дойти и до жизни в пещере без огня.
     
  15. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    Я не нашел толковой инструкции на русском с использованием phpmailer. Там, где не надо было разжевывать они разжевали, а там где нужно было разложить всё по полочкам, они забили на это болт. Это я про инструкции...
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    google translate, словарь, заплатить переводчику

    там три с половины метода в классе PHPMailer, ну и всегда можно прочитать исходный код, на крайний случай можно было задать вопрос на форуме, что конкретно не понятно
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @drkrol @artoodetoo
    https://bugs.php.net/bug.php?id=68776

    Короче запретили стартовать тело сообщения (писать два CRLF подряд) через заголовки, как теперь в принципе отправить файл через mail() - наверное использовать аргумент $message для boundary и данных...
     
    artoodetoo нравится это.
  18. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    Вы бы не могли удалить эту тему? Я создам новую по вопросам phpmailer. они у меня уже есть
     
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @drkrol тут хорошее обсуждение, как правильно отправлять почту, так что пусть будет, если нужно личные данные удалить которых я не вижу, то пиши, сделаем
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    @[vs] спасибо! видимо да, только в теле.