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

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

1. soulner - 29 Августа, 2012 - 21:27:20 - перейти к сообщению
Доброго времени суток! Очень банальный вопрос. Как принять письмо с gmail, вытащить оттуда файл Excel и положить в папочку для последующей разработки. Ни разу в жизни не сталкивался с таким вопросов, а в инете есть много статей, как отправить письмо и нет, как получить.
Пока написал так, подключаюсь, читаю заголовок, и... мысль прерывается.
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo "подключаемся к почтовому серверу $mail_imap<br />";
  2. $ml = imap_open("{".$mail_imap.":993/imap/ssl}INBOX", $mail_user_name, $mail_passport);
  3. if ($ml === false)
  4.         die ('<font color="red">ошибка подключения к почтовому серверу, работа остановлена</font>');
  5. $n = imap_num_msg($ml);
  6. if ($n > 0) {
  7.     echo "обнаружено $n писем, начинаем обработку<br />";
  8.     for ($i=0;$i<$n;$i++) {
  9.        $h = imap_header($ml, $i);
  10.             $h = $h->from;
  11.             foreach ($h as $k => $v) {
  12.                         $mailbox = $v->mailbox;
  13.                         $host = $v->host;
  14.                         $personal = $v->personal;
  15.                         $email = $mailbox . '@' . $host;
  16.                 }
  17.                 echo "&nbsp;&nbsp;получено письмо от $email, начинаю обрабатывать...</br>";
  18.                 if ($email == 'ххх@gmail.com') {
  19.             $s = imap_fetch_overview($ml, $i);
  20.                         foreach ($s as $k => $v) {
  21.                                 $subj = $v->subject;
  22.                         }
  23.                         $subj = imap_utf8($subj);
  24.                         echo "&nbsp;&nbsp;&nbsp;&nbsp;тема письма $subj<br />";
  25.  
  26.                 } else {
  27.                         echo '&nbsp;&nbsp;<font color="#2B2BFF">не тот адрес, пропускаем письмо</font><br />';
  28.                 }
  29.     }
  30. } else {
  31.         echo "новых писем нет, прекращаем работу<br />";
  32. }
2. soulner - 25 Сентября, 2012 - 10:33:24 - перейти к сообщению
Классно, никто не знает ответа на такой простой вопрос Огорчение Ладно, разберусь сам и напишу здесь, чтобы все знали.
3. armancho7777777 - 25 Сентября, 2012 - 11:28:02 - перейти к сообщению
Из мануала:
PHP:
скопировать код в буфер обмена
  1.  
  2. // goggle with pop3 or imap
  3.  
  4. // $authhost = "{pop.gmail.com:995/pop3/ssl/novalidate-cert}";
  5.  
  6. $authhost = "{imap.gmail.com:993/imap/ssl/novalidate-cert}";
  7. $user="username@gmail.com";
  8.  
  9. $user = "username like above";
  10. $pass = "yourpass";
  11.  
  12. $mbox = imap_open($authhost, $user, $pass);
  13.  

(Добавление)
soulner пишет:
и... мысль прерывается.

Как понять ?
(Добавление)
И что в переменных ?
PHP:
скопировать код в буфер обмена
  1.  
  2. $mail_imap           ?
  3. $mail_user_name      ?
  4. $mail_passport       ?
  5.  
4. armancho7777777 - 25 Сентября, 2012 - 13:32:36 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $structure = imap_fetchstructure($ml, $email_number);
  3. if(isset($structure->parts[1]->subtype))
  4. {
  5.         // Mime тип файла
  6.         $structure->parts[1]->subtype;
  7.        
  8.         // Имя файла
  9.         echo imap_utf8($structure->parts[1]->dparameters[0]->value);
  10.            
  11.              // Сам файл
  12.              $attach = imap_fetchbody($ml, $email_number, 2);
  13.              $attach = imap_base64($attach);
  14. }
  15.  
  16.  
  17.  
  18.  
5. soulner - 27 Сентября, 2012 - 12:24:16 - перейти к сообщению
Ура! Есть добрый человек!
В переменных соответственно почтовый адрес, имя пользователя и пароль. Спасибо за отклик, пойду пробовать. По результату отпишусь.
6. soulner - 29 Сентября, 2012 - 18:32:07 - перейти к сообщению
Процесс пошел, но к сожалению сохраняемые файлы не открываются Excelем.
PHP:
скопировать код в буфер обмена
  1.  
  2. $structure = imap_fetchstructure($ml, $i); // $i - номер сообщения
  3. $parts = 1; // количество вложений
  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.   // проверяем тип файла, мне нужны только файлы MS Excel
  12.   if (($att_type == 'X-EXCEL') ||
  13.     ($att_type == 'VND.OPENXMLFORMATS-OFFICEDOCUMENT.SPREADSHEETML.SHEET') ||
  14.     ($att_type == 'VND.MS-EXCEL')) {
  15.         $save_error = false; // признак нормального сохранения файла
  16.         // какой-то Excel, сохраняем файл
  17.         if (file_exists($dir) === false) { // значение переменной $dir задается выше
  18.           // создаем каталог
  19.           if (!mkdir($dir)) {
  20.              $save_error = true;
  21.              echo '<font color="red">не могу создать каталого под выгрузку файла.</font><br />';
  22.            }
  23.         }
  24.         // получаем содержимое вложения
  25.         $attach = imap_fetchbody($ml, $i, $parts+1); // почему $parts+1 не понимаю, но у всех в примерах именно так
  26.         $attach = imap_base64($attach);
  27.         $fp = fopen(iconv('UTF-8','cp1251',$dir.$file_name), 'wt'); // имя перевожу в виндовую кодировку
  28.         if (!fwrite($fp, $attach)) { // сохраняю файл
  29.           $save_error = true;
  30.           echo '<font color="red">не могу сохранить файл</font><br />';
  31.         }
  32.         fclose($fp);
  33.         if (!$save_error) {
  34.           echo "вложение успешно сохранено<br />\n";
  35.         }
  36.   }
  37.   $parts++;
  38. }

Файлы сохраняются, имеют не нулевой размер, чувствую, что ошибаюсь в какой-то мелочи.
7. armancho7777777 - 29 Сентября, 2012 - 18:36:08 - перейти к сообщению

Ну, если бы Вы ещё заглядывали бы сюда по чаще, может уже решили бы задачку )
8. soulner - 29 Сентября, 2012 - 18:49:27 - перейти к сообщению
Посмотрел в двоичном редакторе файл сохраненный моим скриптом и оригинальный, первый 626 байт одинаковые, а потом все разное. Вообще ничего не понимаю Огорчение
P.S. к сожалению дофига других задач, помимо скрипта приема почты.
9. armancho7777777 - 29 Сентября, 2012 - 18:54:03 - перейти к сообщению
А так:
PHP:
скопировать код в буфер обмена
  1. file_put_contents($dir.iconv('UTF-8', 'cp1251', $file_name), $attach);

И попробуйте imap_base64() заменить на base64_decode()
10. soulner - 29 Сентября, 2012 - 19:01:16 - перейти к сообщению
Мистика! Через file_put_contents все работает Радость но не понятно почему.
Блин!!! Не могу спасибо сказать Нахмурился
11. armancho7777777 - 29 Сентября, 2012 - 20:54:24 - перейти к сообщению
soulner пишет:
Не могу спасибо сказать

Сказать можешь, кликнуть не можешь Подмигивание
Не за что )
12. MiraMaX166 - 12 Ноября, 2014 - 10:12:58 - перейти к сообщению
Приветствую. Нет готового решения? Попытался собрать скрипт из того, что тут есть, но результата нет Огорчение Подскажите, пожалуйста.
13. soulner - 12 Ноября, 2014 - 13:01:27 - перейти к сообщению
MiraMaX166 пишет:
Приветствую. Нет готового решения? Попытался собрать скрипт из того, что тут есть, но результата нет Огорчение Подскажите, пожалуйста.


Добрый день! Готовое решение есть и работает у меня с GMail.
Для начала у нас есть переменные (в моём случае берутся из БД):
PHP:
скопировать код в буфер обмена
  1.  
  2. $mail_name      = $idata['E_NAME']; // имя почты
  3. $mail_adress    = $idata['ADRESS']; // адрес
  4. $mail_imap      = $idata['IMAP']; // имя imap-сервера
  5. $mail_smtp      = $idata['SMTP']; // smtp-сервер (нам не нужен)
  6. $mail_user_name = $idata['USER_NAME']; // имя пользователя
  7. $mail_passport  = $idata['PASSWORD']; // пароль
  8. $mail_in_folder = $idata['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.  
14. MiraMaX166 - 12 Ноября, 2014 - 13:13:13 - перейти к сообщению
Спасибо огромное, сэкономлена куча времени! Радость
15. Sesil - 14 Января, 2015 - 17:08:36 - перейти к сообщению
Доброго время суток жители php.su, какрас нужен код которым можно читать письма с gmail а после их удалять, при попытке воспользоваться кодом soulner у меня возникает ошибка Warning: imap_open() [function.imap-open]: Couldn't open stream {IMAP:993/imap/ssl/}INBOX in Z:\home\localhost\www\1.php on line 13 подскажите пожалуйста, что могу делать не так?

 

Powered by ExBB FM 1.0 RC1