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
Форумы портала PHP.SU :: Версия для печати :: Извлечение прикрепленных файлов из письма
Форумы портала PHP.SU » PHP » Пользовательские функции » Извлечение прикрепленных файлов из письма

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

1. EuGen - 26 Июня, 2007 - 16:23:06 - перейти к сообщению
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 функций)
2. EuGen - 27 Июня, 2007 - 13:59:09 - перейти к сообщению
Добавлю: если прикрепленные файлы имеют имя на русском языке, то ничего работать не будет. Так же не будет корректно работать если есть несколько аттачей с одинаковым именем. Для этого я дописал следующие вещи в сравнение:
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, если есть несколько файлов с таким именем. Этот номер генерирует скрипт, показывающий список аттачей (этот список есть список ссылок).
3. EuGen - 28 Июня, 2007 - 09:54:41 - перейти к сообщению
Теперь функция 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.  
4. valenok - 12 Ноября, 2008 - 20:33:27 - перейти к сообщению
Для сохранения файла
вместо вывода в браузер
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.
5. EuGen - 21 Ноября, 2008 - 16:53:34 - перейти к сообщению
Да, так, пожалуй, будет универсальнее

 

Powered by ExBB FM 1.0 RC1