PHP.SU

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

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

> Найдено сообщений: 1
killer67 Отправлено: 19 Февраля, 2015 - 22:09:51 • Тема: прием письма с вложенным файлом Excel • Форум: Вопросы новичков

Ответов: 28
Просмотров: 7247
Всем привет.

Сори за фтопик Был приятно удивлен что тема вроде как жарко обсуждается уже 3 года.

help Теперь к делу:
Почитав тему, обратил внимание что тут получают почту, разворачивают ее и не читая самого тела вытаскивают вложение.

Вот Может кто поделится (если есть) куском кода для расшифровки самого письма?
У меня дальше этого дело не идет:

http://dev[dot]western-soft[dot]com/?module=mail

А для получения данного текста использовал код из первых сообщений:
PHP:
скопировать код в буфер обмена
  1.  
  2. $user  = 'test@western-soft.com';
  3. $pass = 'test';
  4. echo "<hr>";
  5. $ml = imap_open('{western-soft.com:143/novalidate-cert}INBOX',$user, $pass);
  6. $n = imap_num_msg($ml);
  7. echo "$n";
  8.  
  9. // Получаем темы всех писем
  10. if ($n > 0) {
  11.  for ($i=0;$i<=$n;$i++) {
  12.   $h = imap_header($ml, $i);
  13.   $h = $h->from;
  14.  
  15.   foreach ($h as $k => $v) {
  16.    $mailbox = $v->mailbox;
  17.    $host = $v->host;
  18.    $personal = $v->personal;
  19.    $email = $mailbox . '@' . $host;
  20.   }
  21.  
  22.   $s = imap_fetch_overview($ml, $i);
  23.   foreach ($s as $k => $v) { $subj = "$v->subject"; }
  24.   $subj = imap_utf8($subj);
  25.  
  26.   echo "<pre>";
  27.   print_r($subj);
  28.   echo "</pre><hr>";
  29.  }
  30. }
  31.  
  32. $b = imap_body($ml, 4);
  33. print_r($b);
  34.  
  35. $email_number = "4";
  36.  
  37. $structure = imap_fetchstructure($ml, $email_number);
  38. while (isset($structure->parts[$parts]->subtype)) {
  39.   $att_type  = $structure->parts[$parts]->subtype;
  40.   if ($structure->parts[$parts]->ifdparameters == 1) {
  41.    $file_name = imap_utf8($structure->parts[$parts]->dparameters[0]->value);
  42.    print_r($file_name);
  43.   }
  44. }
  45.  


Расшифровку тем нашел в инете, где получали письмо по протоколу pop3:
PHP:
скопировать код в буфер обмена
  1.  
  2. // При отправке почты, все не латинские символы в заголовках кодируется,
  3. // например тема письма может выглядеть так =?windows-1251?B?7/Du4uXw6uA=?=
  4. // вот такие тексты и будет преобразовывать эта функция
  5. function decode_mime_string($subject) {
  6.     $string = $subject;
  7.     if(($pos = strpos($string,"=?")) === false) return $string;
  8.     while(!($pos === false)) {
  9.         $newresult .= substr($string,0,$pos);
  10.         $string = substr($string,$pos+2,strlen($string));
  11.         $intpos = strpos($string,"?");
  12.         $charset = substr($string,0,$intpos);
  13.         $enctype = strtolower(substr($string,$intpos+1,1));
  14.         $string = substr($string,$intpos+3,strlen($string));
  15.         $endpos = strpos($string,"?=");
  16.         $mystring = substr($string,0,$endpos);
  17.         $string = substr($string,$endpos+2,strlen($string));
  18.         if($enctype == "q") $mystring = quoted_printable_decode(ereg_replace("_"," ",$mystring));
  19.         else if ($enctype == "b") $mystring = base64_decode($mystring);
  20.         $newresult .= $mystring;
  21.         $pos = strpos($string,"=?");
  22.     }
  23.  


Может кому пригодится, там же аттачи расшифровывают таким образом:
PHP:
скопировать код в буфер обмена
  1.  
  2. // перекодировщик тела письма.
  3. // Само письмо может быть закодировано и данная функция приводит тело письма в нормальный вид.
  4. // Так же и вложенные файлы будут перекодироваться этой функцией.
  5. function compile_body($body,$enctype,$ctype) {
  6.     $enctype = explode(" ",$enctype); $enctype = $enctype[0];
  7.     if(strtolower($enctype) == "base64")
  8.     $body = base64_decode($body);
  9.     elseif(strtolower($enctype) == "quoted-printable")
  10.     $body = quoted_printable_decode($body);
  11.     if(preg_match("/koi8/", $ctype)) $body = convert_cyr_string($body, "k", "w");
  12.     return $body;
  13. }
  14.  
  15. // Функция для выдергивания метки boundary из заголовка Content-Type
  16. // boundary это разделитель между разным содержимым в письме,
  17. // например, чтобы отделить файл от текста письма
  18. function get_boundary($ctype){
  19.     if(preg_match('/boundary[ ]?=[ ]?(["]?.*)/i',$ctype,$regs)) {
  20.         $boundary = preg_replace('/^\"(.*)\"$/', "\1", $regs[1]);
  21.         return trim("--$boundary");
  22.     }
  23. }
  24.  
  25. // если письмо будет состоять из нескольких частей (текст, файлы и т.д.)
  26. // то эта функция разобьет такое письмо на части (в массив), согласно разделителю boundary
  27. function explode_parts($boundary,$body) {
  28.     $startpos = strpos($body,$boundary)+strlen($boundary)+2;
  29.     $lenbody = strpos($body,"\r\n$boundary--") - $startpos;
  30.     $body = substr($body,$startpos,$lenbody);
  31.     return explode($boundary."\r\n",$body);
  32. }
  33.  


Вернемся к моему вопросу, как получить сам текст письма в читабельном виде?
1. Если письмо не шифровано то получаем все довольно просто, выводим текст и все путем.
2. Если письмо шифровано, то иногда справляется декодер (тот что я показал немного выше)
3. Попытка отправить почту с gmail и/или с мобильного клиента mail.ru получил текст такого вида:

Под спойлер убрал полученное письмо дабы не гадить на форуме, тоже самое (только полностью) можно увидеть на моем сайте, адрес показал выше: dev.we.....com

Спойлер (Отобразить)


PS. Забыл сказать, что pop3 протокол не подходит, так как не дает возможности отмечать письмо прочтенным, а фиксировать прочтение в БД как то не красиво что ли... т.к. сейчас пользователь прочитал письмо через web, а потом через imap клиентом зацепился (например с телефона)...

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB