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

 PHP.SU

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


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

> Без описания
soulner
Отправлено: 29 Августа, 2012 - 21:27:20
Post Id



Новичок


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


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




Доброго времени суток! Очень банальный вопрос. Как принять письмо с 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. }
 
 Top
soulner
Отправлено: 25 Сентября, 2012 - 10:33:24
Post Id



Новичок


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


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




Классно, никто не знает ответа на такой простой вопрос Огорчение Ладно, разберусь сам и напишу здесь, чтобы все знали.
 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Сентября, 2012 - 11:28:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Из мануала:
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.  

(Отредактировано автором: 25 Сентября, 2012 - 11:45:47)

 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Сентября, 2012 - 13:32:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




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.  
 
 Top
soulner
Отправлено: 27 Сентября, 2012 - 12:24:16
Post Id



Новичок


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


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




Ура! Есть добрый человек!
В переменных соответственно почтовый адрес, имя пользователя и пароль. Спасибо за отклик, пойду пробовать. По результату отпишусь.
 
 Top
soulner
Отправлено: 29 Сентября, 2012 - 18:32:07
Post Id



Новичок


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


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




Процесс пошел, но к сожалению сохраняемые файлы не открываются 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. }

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



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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





Ну, если бы Вы ещё заглядывали бы сюда по чаще, может уже решили бы задачку )
 
 Top
soulner
Отправлено: 29 Сентября, 2012 - 18:49:27
Post Id



Новичок


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


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




Посмотрел в двоичном редакторе файл сохраненный моим скриптом и оригинальный, первый 626 байт одинаковые, а потом все разное. Вообще ничего не понимаю Огорчение
P.S. к сожалению дофига других задач, помимо скрипта приема почты.

(Отредактировано автором: 29 Сентября, 2012 - 18:53:50)

 
 Top
armancho7777777 Супермодератор
Отправлено: 29 Сентября, 2012 - 18:54:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




А так:
PHP:
скопировать код в буфер обмена
  1. file_put_contents($dir.iconv('UTF-8', 'cp1251', $file_name), $attach);

И попробуйте imap_base64() заменить на base64_decode()
 
 Top
soulner
Отправлено: 29 Сентября, 2012 - 19:01:16
Post Id



Новичок


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


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




Мистика! Через file_put_contents все работает Радость но не понятно почему.
Блин!!! Не могу спасибо сказать Нахмурился
 
 Top
armancho7777777 Супермодератор
Отправлено: 29 Сентября, 2012 - 20:54:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




soulner пишет:
Не могу спасибо сказать

Сказать можешь, кликнуть не можешь Подмигивание
Не за что )
 
 Top
MiraMaX166
Отправлено: 12 Ноября, 2014 - 10:12:58
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Нояб. 2014  


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




Приветствую. Нет готового решения? Попытался собрать скрипт из того, что тут есть, но результата нет Огорчение Подскажите, пожалуйста.

(Отредактировано автором: 12 Ноября, 2014 - 10:14:05)

 
 Top
soulner
Отправлено: 12 Ноября, 2014 - 13:01:27
Post Id



Новичок


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


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




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.  
 
 Top
MiraMaX166
Отправлено: 12 Ноября, 2014 - 13:13:13
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Нояб. 2014  


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




Спасибо огромное, сэкономлена куча времени! Радость
 
 Top
Sesil
Отправлено: 14 Января, 2015 - 17:08:36
Post Id


Новичок


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


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




Доброго время суток жители 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 подскажите пожалуйста, что могу делать не так?
 
 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