Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Извлечение прикрепленных файлов из письма

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Извлечение и передача файлов "attachements" при помощи mailparse
EuGen Администратор
Отправлено: 26 Июня, 2007 - 16:23:06
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. //$full_email можно брать, к примеру, из БД (как это было у меня); этот код я тут не привожу
  4. //$filename можно брать, например, из GET или POST параметров. Здесь POST
  5. $filename=$_POST["fname"];
  6. $content_type="text/plain"; // тип содержимого(контента) по умолчанию
  7. $mail = mailparse_msg_create();
  8. mailparse_msg_parse($mail, $full_email);//$mail имеет тип: resource rfc2045
  9. $struct = mailparse_msg_get_structure($mail); //$struct - массив
  10. foreach($struct as $st) //можно while но так, по моему, нагляднее
  11. {
  12.         $section = mailparse_msg_get_part($mail, $st);
  13.         $data = mailparse_msg_get_part_data($section); //$data - массив
  14.         if (($data['content-disposition']=='attachment')&&($data['disposition-filename']==$filename))
  15.         {
  16.                 ob_start();
  17.                 mailparse_msg_extract_part($section,$full_email);
  18.                 $str_content = ob_get_contents();
  19.                 ob_end_clean();
  20.                 $content_type=$data['content_type'];           
  21.                 break; 
  22.         };
  23. };
  24.  
  25. mailparse_msg_free($mail);
  26. header("Content-Type: $content_type");//устанавливаем тип контента
  27. header("Content-Disposition: attachment");
  28. header("Pragma: no-cache");
  29. header("Cache-control: no-cache");
  30. echo $str_content; //выводим содержимое
  31. ?>
  32.  

Приведенный листинг предполагает, что уже есть список файлов, которые были прикреплены к письму, так как мы должны знать, какие имена передавать скрипту через GET/POST параметры. Как получить этот список - выложу функцию в эту же ветку. (Тоже с использованием mailparse функций)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
EuGen Администратор
Отправлено: 27 Июня, 2007 - 13:59:09
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Добавлю: если прикрепленные файлы имеют имя на русском языке, то ничего работать не будет. Так же не будет корректно работать если есть несколько аттачей с одинаковым именем. Для этого я дописал следующие вещи в сравнение:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $current_count=1;
  4. if (($data['content-disposition']=='attachment')
  5.           &&($data['disposition-filename']==$filename || decode_mime($data['disposition-filename'],"koi8-r")==$filename))
  6.    {
  7.         if ($file_num==$current_count)
  8.         {
  9.                 ob_start();
  10.                 mailparse_msg_extract_part($section,$info[full_email]);
  11.                 $str_content = ob_get_contents();
  12.                 ob_end_clean();
  13.                 $content_type=$data['content-type'];   
  14.                 break; 
  15.         }
  16.         else
  17.         {
  18.                 $current_count++;
  19.         };
  20. };
  21. ?>
  22.  

$file_num у меня берется из параметров скрипта (например, можно GET/POST) и это число есть номер файла, больший, чем 1, если есть несколько файлов с таким именем. Этот номер генерирует скрипт, показывающий список аттачей (этот список есть список ссылок).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
EuGen Администратор
Отправлено: 28 Июня, 2007 - 09:54:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Теперь функция decode_mime:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. function decode_mime($mime, $default_cs='koi8-r')
  4. {
  5.         $fulltext='';
  6.         $arr=imap_mime_header_decode($mime);
  7.         foreach ($arr as $chunk)
  8.         {
  9.                 $cs=strtolower($chunk->charset);
  10.                 if ($cs=='default')
  11.                         $cs=$default_cs;
  12.                 $text=$chunk->text;
  13.                 $text=iconv($cs, 'UTF-8', $text);
  14.                 $fulltext.=$text;
  15.         }
  16.         return $fulltext;
  17. }
  18. ?>
  19.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
valenok Модератор
Отправлено: 12 Ноября, 2008 - 20:33:27
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Для сохранения файла
вместо вывода в браузер
PHP:
скопировать код в буфер обмена
  1. <?
  2. header("Content-Type: $content_type");//устанавливаем тип контента
  3. header("Content-Disposition: attachment");
  4. header("Pragma: no-cache");
  5. header("Cache-control: no-cache");
  6. echo $str_content; //выводим содержимое
  7.  


Делаем сохранение.
( Открываем файл для записи, записываем содержимое [попробуйте сами
догадаться в какой переменной оно находится], закрываем файл. )

Если у вас ничего не получится, то руководствуясь статьей http://phpfaq[dot]ru/debug
обращайтесь в форум программирования на php.


-----
Truly yours, Sasha.
 
My status
 Top
EuGen Администратор
Отправлено: 21 Ноября, 2008 - 16:53:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Да, так, пожалуй, будет универсальнее


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB