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 :: прием письма с вложенным файлом Excel [2]

 PHP.SU

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


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

> Без описания
soulner
Отправлено: 14 Января, 2015 - 18:40:09
Post Id



Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2012  
Откуда: Россия, Питер


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




Добрый вечер. Код приложения приведите? У меня плохо обстоят дела с чтением мыслей...
 
 Top
Sesil
Отправлено: 17 Января, 2015 - 13:40:42
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Янв. 2015  


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




Использую вот этот код:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $mail_name      = "Gmail"; // имя почты
  3. $mail_adress    = "myemail@gmail.com"; // адрес
  4. $mail_imap      = "imap.gmail.com"; // имя imap-сервера
  5. $mail_smtp      = "smtp.gmail.com"; // smtp-сервер (нам не нужен)
  6. $mail_user_name = "myemail@gmail.com"; // имя пользователя
  7. $mail_passport  = "mypass"; // пароль
  8. $mail_in_folder = "INBOX"; // папка imap (INBOX-входящие, TRASH-корзина, и др. )
  9. $ml = imap_open("{".$mail_imap.":993/imap/ssl}".mail_in_folder, $mail_user_name, $mail_passport);
  10. if ($ml) {
  11.         $n = imap_num_msg($ml);
  12.         if ($n > 0) {
  13.             // формируем массив полученных писем
  14.         $uids = array();
  15.         $mails = array();
  16.         for ($i=1;$i<=$n;$i++) {
  17.                 $h = imap_header($ml, $i);
  18.                     $h = $h->from;
  19.                     foreach ($h as $k => $v) {
  20.                                 $mailbox = $v->mailbox;
  21.                                 $host = $v->host;
  22.                                 $personal = $v->personal;
  23.                                 $email = $mailbox . '@' . $host;
  24.                         }
  25.                         $headerArr = imap_headerinfo($ml, $i);
  26.                         $uid = imap_uid($ml, $headerArr->Msgno);
  27.                         $mails[] = $email;
  28.                         $uids[] = $uid;
  29.         }
  30.         // на выходе имеем 2 массива $mails - адресаты (можно использовать для лога), $uids - уникальные идентификаторы писем
  31.         for ($i=0;$i<count($mails);$i++) {
  32.                 $uid = $uids[$i];
  33.                         $email = $mails[$i];
  34.                         $s = imap_fetch_overview($ml, $uid, FT_UID);
  35.                         foreach ($s as $k => $v) {
  36.                                 $subj = $v->subject;
  37.                         }
  38.                         $subj = imap_utf8($subj);
  39.                         // тема письма (тоже для лога)
  40.                         $subj = str_replace("'",'',$subj);
  41.                         // получаем структуру вложения
  42.             $structure = imap_fetchstructure($ml, $uid, FT_UID);
  43.             $parts = 1; // количество вложений (если ожидаем больше одного, по делаем цикл)
  44.             while (isset($structure->parts[$parts]->subtype)) {
  45.                 $att_type  = $structure->parts[$parts]->subtype;
  46.                 if ($structure->parts[$parts]->ifdparameters == 1) {
  47.                         $file_name = imap_utf8($structure->parts[$parts]->dparameters[0]->value);
  48.                 } else {
  49.                         $file_name = imap_utf8($structure->parts[$parts]->parameters[0]->value);
  50.                 }
  51.                 // удаляем кавычки
  52.                 $file_name = str_replace("'",'',$file_name);
  53.                 // удаляем странный символ, заменяющий Й (т.к. Й заменяется на И возврат назад и `)
  54.                 $file_name = iconv('UTF-8','cp1251//ignore',$file_name);
  55.                 $file_name = iconv('cp1251','UTF-8',$file_name); // из хитрой й получается и, что не есть хорошо, но пока сойдет
  56.                 // проверяем тип файла, естественно можно сделать свой фильтр
  57.                 if (($att_type == 'X-EXCEL') ||  ($att_type == 'VND.OPENXMLFORMATS-OFFICEDOCUMENT.SPREADSHEETML.SHEET') ||
  58.                         ($att_type == 'VND.MS-EXCEL') || ($att_type == 'X-MSEXCEL') || ($att_type == 'VND.MS-EXCEL.12')) {
  59.                         // получаем содержимое вложения
  60.                     $attach = imap_fetchbody($ml, $uid, $parts+1, FT_UID);
  61.                     $attach = imap_base64($attach);
  62.                     if (file_put_contents('c:\путь для сохранения', $file_name, $attach) == 0) {
  63.                                         // файл сохранён, обрабатываем дальше
  64.                                 }
  65.                         }
  66.                     }
  67.                     // тут можно письмо удалить
  68.                     if (imap_delete($ml,$uid,FT_UID)) {
  69.                                 // удалили
  70.                         }
  71.                 }              
  72.         }
  73. }      
  74. ?>

При попытке открыть пишет ниже указанную ошибку.

Цитата:
502 Bad Gateway

nginx/1.6.2


А в журнале ошибок пишет
[17-Jan-2015 14:38:51 Europe/Moscow] PHP Notice: Undefined property: stdClass::$personal in /home/public_html/gmail.php on line 22
Вот 22 строчка на которую он жалуется
PHP:
скопировать код в буфер обмена
  1.                                 $personal = $v->personal;


В чем может быть проблема?
(Добавление)
Через Var_dump и Die удалось открывать одно из писем, но письма все ровно не удаляются даже если die я ставлю после первого цикла. в чем может быть загвоздка?

(Отредактировано автором: 17 Января, 2015 - 13:54:59)

 
 Top
soulner
Отправлено: 17 Января, 2015 - 15:30:58
Post Id



Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2012  
Откуда: Россия, Питер


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




У меня этот же код работает с той лишь разницей, что имя сервера imap.googlemail.com. Попробуйте...

(Отредактировано автором: 19 Января, 2015 - 08:23:18)

 
 Top
Sesil
Отправлено: 26 Января, 2015 - 06:13:16
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Янв. 2015  


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




Да все получилось, спасибо большое. а подскажите пожалуйста, как узнать дату и время письма?
 
 Top
soulner
Отправлено: 26 Января, 2015 - 08:44:50
Post Id



Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2012  
Откуда: Россия, Питер


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




Sesil пишет:
Да все получилось, спасибо большое. а подскажите пожалуйста, как узнать дату и время письма?

Тут можно и самостоятельно вопрос решить. Даю направление:
после $h = imap_header($ml, $i); нужно посмотреть что внутри $h, например

и там поискать переменную, похожую на date

Закатив глазки
 
 Top
Sesil
Отправлено: 26 Января, 2015 - 09:57:26
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Янв. 2015  


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




PHP:
скопировать код в буфер обмена
  1. (
  2.     [0] => stdClass Object
  3.         (
  4.             [mailbox] => my-mail
  5.             [host] => gmail
  6.         )
  7.  
  8. )

Нету в масиве =( попытался распечатать дальше, тоже без результатно.
(Добавление)
Переменная Date а как передать ее в массив? что то не получается =(
(Добавление)
После переменной он не весь массив показывает а только 2 стрчки, с чем это может быть связано? не понимаю =(
(Добавление)
Ммм, даже не date а MailDate в массиве отвечает за дату письма.
(Добавление)
Я так понимаю можно использовать да?
(Добавление)
Хотя нет =( че то не могу определится с нужной мне переменной. подскажите пожалуйста что мне необходимо использовать. ???
 
 Top
soulner
Отправлено: 26 Января, 2015 - 12:04:44
Post Id



Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2012  
Откуда: Россия, Питер


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




Я сам не проверял, но люди пишут вот что (http://blog[dot]cyllene[dot]net/2012/12/imap-php-mysql/ ). Там есть такая строка
Посмотрите как человек получает $pheaders, очень грамотный парсинг заголовка. У меня готового решения нет.

P.S. если ссылка не работает, надо [dot] заменить на "." (без ковычек)

P.P.S. Мысль про $headerArr->MailDate может быть верной...

(Отредактировано автором: 26 Января, 2015 - 12:11:45)

 
 Top
Sesil
Отправлено: 12 Февраля, 2015 - 03:16:37
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Янв. 2015  


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




Большое спасибо, все просто супер. А подскажите пожалуйста как реализовать с новым кодом получение файлов?
(Добавление)
Код который я использую
PHP:
скопировать код в буфер обмена
  1. <?
  2.         echo "Запуск системы...\n";
  3.  
  4.         $messages_to_process = 0;
  5.  
  6.         $tocontinue = 0;
  7.         if(isset($argv[1]))
  8.     {
  9.         $tocontinue = $argv[1];
  10.     }
  11.  
  12.         imap_timeout(IMAP_READTIMEOUT, 360);
  13.         imap_timeout(IMAP_OPENTIMEOUT, 360);
  14.  
  15.         $inbox = imap_open($imap_hostname, $imap_username, $imap_password, OP_SHORTCACHE) or die('Cannot connect to imap: ' . imap_last_error());
  16.  
  17.     imap_expunge($inbox);
  18.  
  19.         $dblink = mysqli_connect($db_hostname, $db_username, $db_password, $db_base);
  20.         if (mysqli_connect_errno()) {
  21.                 printf("MySQL connect failed: %s\n", mysqli_connect_error());
  22.                 exit();
  23.         }
  24.  
  25.         if (!mysqli_set_charset($dblink, "utf8"))
  26.         {
  27.                 printf("Error loading character set utf8: %s\n", mysqli_error($dblink));
  28.         }
  29.     else
  30.         {
  31.                 printf("Кодировка системы: %s\n", mysqli_character_set_name($dblink));
  32.         }
  33.  
  34.         echo "Подключено!\n";
  35.  
  36.         $num_mgs = imap_num_msg($inbox);
  37.         $messages_to_process = $num_mgs;
  38.         echo "$num_mgs сообщений для обработки скриптом\n";
  39.  
  40.         $emails = imap_search($inbox,'ALL', SE_UID);
  41.         if($emails === false)
  42.         {
  43.                 die('Существующие ошибки?: '. imap_last_error());
  44.         }
  45.  
  46.         if($tocontinue != 0)
  47.         {
  48.                 $tocontinue = array_search($tocontinue, $emails);
  49.                 $messages_to_process = $num_mgs - $tocontinue;
  50.         }
  51.  
  52.     for($curid = $tocontinue; $curid < sizeof($emails); $curid++)
  53.     {
  54.         if(version_compare(PHP_VERSION, '5.3.0', '>=') && $curid % 15 == 0)
  55.         {
  56.             imap_gc($inbox, IMAP_GC_ELT);
  57.         }
  58.  
  59.         $email_number = $emails[$curid];
  60.  
  61.         if($curid % 90 == 0 && !imap_ping ($inbox))
  62.         {
  63.             die("Imap is dead");
  64.         }
  65.  
  66.         $messages_to_process--;
  67.  
  68.         print "-------------------------------------------------\n";
  69.  
  70.         //$overview = imap_fetch_overview($inbox,$email_number,0);
  71.         //$struct = imap_fetchstructure($inbox,$email_number);
  72.  
  73.         $rheaders = imap_fetchheader($inbox, $email_number, FT_UID);
  74.         $pheaders = imap_rfc822_parse_headers($rheaders);
  75.  
  76.         // FIXME: wtf?!
  77.         if(empty($pheaders->sender) && empty($pheaders->to))
  78.         {
  79.             echo "rh: "; print_r($rheaders); echo "\n";
  80.             echo "ph: "; print_r($pheaders); echo "\n";
  81.             echo "ib: "; print_r($inbox); echo "\n";
  82.             printf("FAILURE: %d!\n", $email_number);
  83.             continue;
  84.         }
  85.  
  86.         printf("UID процесс: %s\n", $email_number);
  87.  
  88.         $ft_subj = decodeHeader(imap_utf8($pheaders->subject));
  89.         //$ft_subj = imap_utf8($pheaders->subject);
  90.  
  91.         print 'subj: ' . $ft_subj . "\n";
  92.  
  93.         $ft_date = $pheaders->date;
  94.         print 'date: ' . $ft_date . "\n";
  95.  
  96.         if (!is_array($pheaders->sender) || count($pheaders->sender) < 1)
  97.         {
  98.             print_r($pheaders);
  99.             printf("\n");
  100.             die("Something is wrong with SENDER address\n");
  101.         }
  102.  
  103.         $ft_sender = $pheaders->sender[0]->mailbox . "@" . $pheaders->sender[0]->host;
  104.         print ' sender: ' . $ft_sender . "\n";
  105.  
  106.         $receivers = array();
  107.         if (!is_array($pheaders->to) || count($pheaders->to) < 1)
  108.         {
  109.             print_r($pheaders);
  110.             printf("\n");
  111.             // die("Something is totally wrong with TO addresses\n"); // may happen when there's only CC address
  112.         }
  113.         if(is_array($pheaders->to))
  114.         {
  115.             $receivers = $pheaders->to;
  116.         }
  117.  
  118.         if (isset($pheaders->cc) && is_array($pheaders->cc) && count($pheaders->cc) > 0)
  119.         {
  120.             $receivers = array_merge($receivers, $pheaders->cc);
  121.         }
  122.         if (isset($pheaders->bcc) && is_array($pheaders->bcc) && count($pheaders->bcc) > 0)
  123.         {
  124.             $receivers = array_merge($receivers, $pheaders->bcc);
  125.         }
  126.  
  127.         foreach ($receivers as $id => $val)
  128.         {
  129.             // echo " to: " . $val->mailbox . "@" . $val->host . "\n";
  130.             $receivers[$id] = $val->mailbox . "@" . $val->host;
  131.         }
  132.  
  133.         /* make comma-separated list of recipients */
  134.         $ft_receivers = implode(', ', $receivers);
  135.         print "to: " . $ft_receivers . "\n";
  136.  
  137.         /* email body */
  138.         $ft_data = $rheaders . imap_body($inbox,$email_number, FT_UID | FT_PEEK | FT_INTERNAL);
  139.  
  140.         $ft_date_converted = date("Y-m-d H:i:s", strtotime($ft_date) + 25200);
  141.         //$ft_date_converted = date("Y-m-d g:i:s", strtotime($ft_date) + 125000);
  142.                        
  143.                 //$tt=$db->getQuery();
  144.                 //var_dump($tt);
  145.                 //die();
  146.  
  147.         imap_delete($inbox, $email_number, FT_UID);
  148.  
  149.     }
  150.  
  151.         imap_close($inbox);
  152.         exit('Закончено!');
  153.  
  154.         function decodeHeader($hdr, $cset = 'UTF8')
  155.         {
  156.                 // Copied nearly intact from PEAR's Mail_mimeDecode.
  157.                 $hdr = preg_replace('/(=\?[^?]+\?(q|b)\?[^?]*\?=)(\s)+=\?/i', '\1=?', $hdr);
  158.                 $m = array();
  159.                 if(is_array($hdr))
  160.                         $hdr = $hdr[0];
  161.                 while(preg_match('/(=\?([^?]+)\?(q|b)\?([^?]*)\?=)/i', $hdr, $m))
  162.                 {
  163.                         $encoded  = $m[1];
  164.                         $charset  = strtoupper($m[2]);
  165.                         $encoding = strtolower($m[3]);
  166.                         $text     = $m[4];
  167.  
  168.                         switch($encoding)
  169.                         {
  170.                                 case 'b':
  171.                                         $text = base64_decode($text);
  172.                                         break;
  173.                                 case 'q':
  174.                                         $text = str_replace('_', ' ', $text);
  175.                                         preg_match_all('/=([a-f0-9]{2})/i', $text, $m);
  176.                                         foreach($m[1] as $value)
  177.                     $text = str_replace('=' . $value, chr(hexdec($value)), $text);
  178.                                         break;
  179.                         }
  180.                         if($charset !== $cset)
  181.                                 $text = charconv($charset, $cset, $text);
  182.                         $hdr = str_replace($encoded, $text, $hdr);
  183.                 }
  184.                 return $hdr;
  185.         }
  186.  
  187.     /* workaround to make most of headers to parse properly */
  188.         function charconv($enc_from, $enc_to, $text)
  189.         {
  190.                 if(function_exists('iconv'))
  191.                         return iconv($enc_from, $enc_to, $text);
  192.                 elseif(function_exists('recode_string'))
  193.         return recode_string("$enc_from..$enc_to", $text);
  194.                 elseif(function_exists('mb_convert_encoding'))
  195.         return mb_convert_encoding($text, $enc_to, $enc_from);
  196.                 return $text;
  197.         }
  198.  

(Добавление)
Добавил строки
PHP:
скопировать код в буфер обмена
  1.         $structure = imap_fetchstructure($inbox, $email_number, FT_UID);
  2.         var_dump($structure);die();
  3.  


Цитата:
[1]=>
object(stdClass)#130 (13) {
["type"]=>
int(3)
["encoding"]=>
int(3)
["ifsubtype"]=>
int(1)
["subtype"]=>
string(3) "ZIP"
["ifdescription"]=>
int(0)
["ifid"]=>
int(0)
["bytes"]=>
int(10364)
["ifdisposition"]=>
int(1)
["disposition"]=>
string(10) "ATTACHMENT"
["ifdparameters"]=>
int(1)
["dparameters"]=>
array(1) {
[0]=>
object(stdClass)#131 (2) {
["attribute"]=>
string(8) "FILENAME"
["value"]=>
string(8) "logs.zip"
}
}
["ifparameters"]=>
int(1)
["parameters"]=>
array(1) {
[0]=>
object(stdClass)#132 (2) {
["attribute"]=>
string(4) "NAME"
["value"]=>
string(8) "logs.zip"
}
}

Не понимаю как указать что здесь файл и что нужно сохранить?
(Добавление)
Сделал вот так, но почему то не работает =(
PHP:
скопировать код в буфер обмена
  1.         $structure = imap_fetchstructure($inbox, $email_number, FT_UID);
  2.         $parts = 1;
  3.  
  4.             while (isset($structure->parts[$parts]->subtype)) {
  5.                 $att_type  = $structure->parts[$parts]->subtype;
  6.                 if ($structure->parts[$parts]->ifdparameters == 1) {
  7.                         $file_name = imap_utf8($structure->parts[$parts]->dparameters[0]->value);
  8.                 } else {
  9.                         $file_name = imap_utf8($structure->parts[$parts]->parameters[0]->value);
  10.                 }
  11.                 if (($att_type == 'zip') || ($att_type == 'TXT')) {
  12.                     // получаем содержимое вложения
  13.                     $attach = imap_fetchbody($ml, $uid, $parts+1, FT_UID);
  14.                     $attach = imap_base64($attach);
  15.                     if (file_put_contents('/srv/www/garant.itsdv.ru/htdocs/logs/garant/', $file_name, $attach) == 0) {
  16.                                         // файл сохранён, обрабатываем дальше
  17.                                 }
  18.                         }
  19.                     }
  20.  

Подскажите пожалуйста в чем моя ошибка? ну или хотя бы направьте в нужном направлении.
(Добавление)
Жалуется Fatal error: Maximum execution time of 30 seconds exceeded in
На вот эту строчку
PHP:
скопировать код в буфер обмена
  1.                 if ($att_type == 'zip') {
  2.  

(Отредактировано автором: 12 Февраля, 2015 - 03:20:38)

 
 Top
Sesil
Отправлено: 12 Февраля, 2015 - 05:27:02
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Янв. 2015  


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




Вот мой конечный вариант который почему то не хочет работать.

PHP:
скопировать код в буфер обмена
  1.         $structure = imap_fetchstructure($inbox, $email_number, FT_UID);
  2.         $parts = 1;
  3.  
  4.             while (isset($structure->parts[$parts]->subtype)) {
  5.                 $att_type  = $structure->parts[$parts]->subtype;
  6.                 if ($structure->parts[$parts]->ifdparameters == 1) {
  7.                         $file_name = imap_utf8($structure->parts[$parts]->dparameters[0]->value);
  8.                 } else {
  9.                         $file_name = imap_utf8($structure->parts[$parts]->parameters[0]->value);
  10.                 }
  11.                 if (($att_type == 'zip') || ($att_type == 'txt')) {                      
  12.                     // получаем содержимое вложения
  13.                     $attach = imap_fetchbody($inbox, $email_number, $parts+1, FT_UID);
  14.                     $attach = imap_base64($attach);
  15.                     if (file_put_contents('/htdocs/logs/', $file_name, $attach) == 0) {
  16.                                         // файл сохранён, обрабатываем дальше
  17.                                         echo "ok?";
  18.                                 }
  19.                         }
  20.                     }
  21.  
 
 Top
soulner
Отправлено: 12 Февраля, 2015 - 08:25:19
Post Id



Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2012  
Откуда: Россия, Питер


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




С новым кодом я вам не помогу, но сразу бросается в глаза ошибка в использовании оператора

Это мой косяк, прошу прощения Растерялся
Читаем мануал и видим, что там 2 параметра - куда писать и что писать, и возвращается количество записанных байт. Привожу кусок своего кода без изменений:

PHP:
скопировать код в буфер обмена
  1. // получаем содержимое вложения
  2. $attach = imap_fetchbody($ml, $uid, $parts+1, FT_UID);
  3. $attach = imap_base64($attach);
  4. if (file_put_contents('ResImport/'.iconv('UTF-8', 'cp1251', $file_name), $attach) == 0) {
  5. $save_error = true;
  6. }


Т.е. когда количество записанных байт равно 0, т.е. ничего не записали, то ставим признак ошибки.
 
 Top
Sesil
Отправлено: 12 Февраля, 2015 - 10:01:06
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Янв. 2015  


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




Вот так выглядит мой кусок кода сейчас

PHP:
скопировать код в буфер обмена
  1.                 if (($att_type == 'ZIP') || ($att_type == 'TXT')) {                      
  2.  
  3.                     // получаем содержимое вложения                                                  
  4.                     $attach = imap_fetchbody($inbox, $email_number, $parts+1, FT_UID);
  5.                     $attach = imap_base64($attach);
  6.  
  7.                     if (file_put_contents('/htdocs/logs/', $file_name, $attach)) {
  8.                                         // файл сохранён, обрабатываем дальше
  9.                                         echo "ok?";
  10.                                 }
  11.                         }
  12.  


Вроде бы все же должно работать. а почему то не работает =(
 
 Top
soulner
Отправлено: 19 Февраля, 2015 - 08:01:18
Post Id



Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2012  
Откуда: Россия, Питер


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




Sesil пишет:
Вот так выглядит мой кусок кода сейчас

PHP:
скопировать код в буфер обмена
  1.                 if (($att_type == 'ZIP') || ($att_type == 'TXT')) {                      
  2.  
  3.                     // получаем содержимое вложения                                                  
  4.                     $attach = imap_fetchbody($inbox, $email_number, $parts+1, FT_UID);
  5.                     $attach = imap_base64($attach);
  6.  
  7.                     if (file_put_contents('/htdocs/logs/', $file_name, $attach)) {
  8.                                         // файл сохранён, обрабатываем дальше
  9.                                         echo "ok?";
  10.                                 }
  11.                         }
  12.  


Вроде бы все же должно работать. а почему то не работает =(


Ошибка в file_put_contents. Наверное должно быть
 
 Top
killer67
Отправлено: 19 Февраля, 2015 - 22:09:51
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2015  


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




Всем привет.

Сори за фтопик Был приятно удивлен что тема вроде как жарко обсуждается уже 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 клиентом зацепился (например с телефона)...

(Отредактировано автором: 19 Февраля, 2015 - 22:13:06)

 
 Top
aman1792
Отправлено: 08 Июня, 2015 - 15:22:25
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Июнь 2015  


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




Идеальная статья =) спасибо soulner
чуть добавлю своего =)) если не против вариант обработчика если кому интересно

PHP:
скопировать код в буфер обмена
  1.   if (($att_type == 'vnd.ms-excel') || ($att_type == 'VND.OPENXMLFORMATS-OFFICEDOCUMENT.SPREADSHEETML.SHEET')) {
  2.                 $attach = imap_fetchbody($mbox, $uid, $parts + 1, FT_UID);
  3.                 $attach = imap_base64($attach);
  4.                 $file_name = iconv('UTF-8','cp1251//ignore',$file_name);// требуется для нормальной кодировки файла (если он на русском)
  5.                 $path = 'D://xampp//tmp//test//' . $file_name;
  6.                 $fp = fopen($path, 'w+');
  7.                 fwrite($fp, $attach);
  8.                 fclose($fp);

И русскую буковки нормально воспринимает =)) если есть у кого с zip ариховами обработчик буду очень рад увидеть ваш вариант реализации , по скок у меня получается получить его из вложения , но приходится его сохранить во временную директорию там распаковать и потом приходится удалить, есть варианты на лету это делать?

(Отредактировано автором: 08 Июня, 2015 - 15:23:03)

 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB