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 :: Версия для печати :: Собрать почту Gmail не только из INBOX
Форумы портала PHP.SU » » Работа с сетью » Собрать почту Gmail не только из INBOX

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

1. l_2001 - 26 Мая, 2016 - 13:47:42 - перейти к сообщению
Здравствуйте! Есть скрипт сборщика почты, он без проблем собирает её, но только из INBOX, а в этой папке есть ещё и ярлыки. Если просматривать содержимое входящих
$list = imap_getmailboxes($mbox, "{imap.gmail.com:993/imap/ssl}", "*");
то var_dump мне показывает такое:
array(18) {
[0] =>
class stdClass#1 (3) {
public $name =>
string(34) "{imap.gmail.com:993/imap/ssl}INBOX"
public $attributes =>
int(64)
public $delimiter =>
string(1) "/"
}
[1] =>
class stdClass#2 (3) {
public $name =>
string(31) "{imap.gmail.com:993/imap/ssl}PL"
public $attributes =>
int(32)
public $delimiter =>
string(1) "/"
}
[2] =>
class stdClass#3 (3) {
public $name =>
string(36) "{imap.gmail.com:993/imap/ssl}PL/PLC0"
public $attributes =>
int(32)
public $delimiter =>
string(1) "/"
}
[3] =>
class stdClass#4 (3) {
public $name =>
string(147) "{imap.gmail.com:993/imap/ssl}PL/PLC0/&BCMEHwQhBBcEHQ- &BBwEGAQgBBMEHgQgBB4EFAQhBCwEGgQeBBMEHg- &BCA--&BB0EIw- &BB8EHgQbBCI-.&BB4EEQQb-. 12B14000867"
public $attributes =>
int(64)
public $delimiter =>
string(1) "/"
}
Перепробовал разные варианты, но выбирать из этих вот папок (PLC0 в частности) скрипт никак не желает... Подскажите пожалуйста, как можно заставить скрипт читать и из ярлыков Gmail, если это вообще реально...
Спасибо заранее!
2. Viper - 26 Мая, 2016 - 15:24:28 - перейти к сообщению
Ярлыки это не папки. Т.е. физически их нет на сервере. Можно только из INBOX по ALL получить всё сразу и отфильтровать.
3. l_2001 - 27 Мая, 2016 - 08:53:50 - перейти к сообщению
Viper пишет:
Ярлыки это не папки. Т.е. физически их нет на сервере. Можно только из INBOX по ALL получить всё сразу и отфильтровать.


Вы правы, прочитал вчера где-то, но всё-же вопрос остался... Строка коннекта такая:
$mail = imap_open("{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX", $user, $password);
Как-бы ничего военного, обычная, но почему она не вычитывает всё содержимое из INBOXа? Может быть нужно ещё что-то?
4. Viper - 27 Мая, 2016 - 11:05:45 - перейти к сообщению
l_2001 пишет:
Как-бы ничего военного, обычная, но почему она не вычитывает всё содержимое из INBOXа? Может быть нужно ещё что-то?
код приведите.
5. l_2001 - 27 Мая, 2016 - 11:16:59 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once "func.php";//подключаем функции
  3. require_once "connect.php";//подключаем настройки к MySQL
  4.  
  5. wr("\n=============================\n");
  6.  
  7. $lock = "reader.lock";
  8.  
  9. $aborted = file_exists($lock) ? filemtime($lock) : false;
  10.  
  11. $fp = fopen($lock,'w');//открывает файл с возможностью записи
  12.  
  13. register_shutdown_function(function() use ($fp, $lock) {
  14.         wr("shutdown");
  15.         flock($fp, LOCK_UN);//снимаем блокировку с файла
  16.         fclose($fp);//закрываем файл
  17.         unlink( __DIR__ . DIRECTORY_SEPARATOR . $lock);//удаляем файл
  18. });
  19.  
  20. if(!flock($fp,LOCK_EX|LOCK_NB)){
  21.         wr("busy\n");//пишем в лог, что занято
  22. }else{
  23.         if($aborted){
  24.                 wr("Aborted\n");
  25.         }
  26.        
  27.         mysql_query("SET AUTOCOMMIT=0");
  28.         mysql_query("START TRANSACTION");//стартуем транзацию
  29.        
  30.         $sql = "SELECT * FROM mailboxes WHERE is_deleted = false";
  31.         $res = mysql_query($sql);
  32.        
  33.         while($row = mysql_fetch_array($res)){
  34.                 $mailbox_id = $row['id'];
  35.                 $host = $row['host'];//адрес почтового сервера
  36.                 $port = $row['port'];//порт почтового сервера
  37.                 $user = $row['email'];//имя пользователя (почтовый ящик)
  38.                 $password = $row['password'];//пароль к почтовому ящику
  39.                 $last_uid = $row['last_message_uid'];//uid последнего считанного сообщения
  40.                 $ssl = $row['is_ssl'] ? "/ssl" : "";
  41.                
  42. $mail_user_name, $mail_passport);
  43.                 $conn = "{{$host}:{$port}{$ssl}/novalidate-cert}";
  44.                 wr("Read $user, conn = $conn");
  45.                
  46.                 $mail = imap_open("{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX", $user, $password);
  47.                 if(!$mail){            
  48.                         wr("Error opening IMAP. " . imap_last_error());
  49.                         continue;//переходим к следующему ящику
  50.                 }
  51.                 $uid_from = $last_uid + 1;
  52.                 $uid_to = 2147483647;          
  53.                 $range = "$uid_from:$uid_to";          
  54.                 $arr = imap_fetch_overview($mail,$range,FT_UID);               
  55.                 $message_uid = -1;
  56.                 //перебираем сообщения
  57.                 foreach($arr as $obj){
  58.                         $message_uid = $obj->uid;
  59.                         wr("add message $message_uid");
  60.  
  61.                         $sql = "INSERT INTO messages(mailbox_id,uid,create_date,is_ready)
  62.                                         VALUES($mailbox_id,$message_uid,now(),0)";
  63.                         mysql_query($sql) or die(mysql_error());
  64.                 }
  65.                
  66.                 if($message_uid != - 1){
  67.                         wr("last message uid = $message_uid");
  68.                         $sql = "UPDATE mailboxes
  69.                                         SET last_message_uid = $message_uid
  70.                                         WHERE id = $mailbox_id";
  71.                         mysql_query($sql) or die(mysql_error());
  72.                 }else{
  73.                         //нет новых сообщений
  74.                         wr("no new messages");
  75.                 }
  76.         }
  77.        
  78.         mysql_query("COMMIT");//завершаем транзакцию
  79.         imap_close($mail);
  80. }
  81. ?>
  82.  
6. Viper - 27 Мая, 2016 - 13:19:16 - перейти к сообщению
7. l_2001 - 27 Мая, 2016 - 14:19:01 - перейти к сообщению
Viper пишет:
http://php.net/manual/en/function.imap-search.php


Вы понимаете, imap-search всё-равно берёт лишь те сообщения, которые лежать непосредственно в инбоксе... А вот такая конструкция:
PHP:
скопировать код в буфер обмена
  1. $mbox=imap_open("{imap.gmail.com:993/imap/ssl/novalidate-cert}", $user, $pass);
  2. $list = imap_getmailboxes($mbox, "{imap.gmail.com:993/imap/ssl}", "*");
  3. for ($i = 0; $i < count($list); $i++) {
  4.     print_r($list[$i]->name."\n");
  5. }

показывает вот такое:
{imap.gmail.com:993/imap/ssl}INBOX
{imap.gmail.com:993/imap/ssl}PL
{imap.gmail.com:993/imap/ssl}PL/PLC0
{imap.gmail.com:993/imap/ssl}PL/PLC0/&BCMEHwQhBBcEHQ- &BBwEGAQgBBMEHgQgBB4EFAQhBCwEGgQeBBMEHg- &BCA--&BB0EIw- &BB8EHgQbBCI-.&BB4EEQQb-. 12B14000867
{imap.gmail.com:993/imap/ssl}PL/PLP0
{imap.gmail.com:993/imap/ssl}PL/PLP0/&BCYEFw- &BB8EGAQgBC8EIgQYBB0EIQQsBBoEGAQZ- &BCAEEAQZBB4EHQQdBBgEGQ- &BB8EHgQbBCI-. &BB4EEQQb-. 12B14000933
{imap.gmail.com:993/imap/ssl}PL/PLQ0
{imap.gmail.com:993/imap/ssl}PL/PLQ0/&BCQEIQQh- &BBI- &BBMEEAQUBC8EJgQsBBoEHgQcBCM- &BCAEEAQZBB4EHQ-I &BB8EHgQbBCI-.&BB4EEQQb-. 12B14000960
{imap.gmail.com:993/imap/ssl}PL/PLW0
{imap.gmail.com:993/imap/ssl}PL/PLW0/&BCYEFw- &BCgEGAQoBBAEJgQsBBoEGAQZ- &BCAEEAQZBB4EHQQdBBgEGQ- &BB8EHgQbBCI-. &BB4EEQQb-.12B14000951
{imap.gmail.com:993/imap/ssl}[Gmail]
{imap.gmail.com:993/imap/ssl}[Gmail]/&BBIEMAQ2BD0EPgQ1-
{imap.gmail.com:993/imap/ssl}[Gmail]/&BBIEQQRP- &BD8EPgRHBEIEMA-
{imap.gmail.com:993/imap/ssl}[Gmail]/&BBoEPgRABDcEOAQ9BDA-
{imap.gmail.com:993/imap/ssl}[Gmail]/&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-
{imap.gmail.com:993/imap/ssl}[Gmail]/&BB8EPgQ8BDUERwQ1BD0EPQRLBDU-
{imap.gmail.com:993/imap/ssl}[Gmail]/&BCEEPwQwBDw-
{imap.gmail.com:993/imap/ssl}[Gmail]/&BCcENQRABD0EPgQyBDgEOgQ4-

Видны все сообщения и проч., но вот как это заставить работать, я так и не понял Недовольство, огорчение
8. Viper - 28 Мая, 2016 - 11:25:08 - перейти к сообщению
l_2001 пишет:
показывает вот такое:
это и указывайте первым параметром в imap_open

PHP:
скопировать код в буфер обмена
  1. $hostname = "{imap.gmail.com:993/imap/ssl}PL/PLC0/&BCMEHwQhBBcEHQ- &BBwEGAQgBBMEHgQgBB4EFAQhBCwEGgQeBBMEHg- &BCA--&BB0EIw- &BB8EHgQbBCI-.&BB4EEQQb-. 12B14000867";
  2. $inbox = imap_open($hostname, $username, $password) or die('Cannot connect to Gmail: ' . imap_last_error());


Далее есть imap_search($inbox, 'ALL');

Проверил на своем почтовике на гмыле. Показывает всё что есть в папке.
(Добавление)
И да не стоит забывать что
Цитата:
Deleted messages aren't physically deleted until the folder is compacted; they are merely hidden from view and marked for deletion.
9. l_2001 - 30 Мая, 2016 - 14:39:22 - перейти к сообщению
Спасибо за отличную подсказку! Всё получилось! Теперь остались мелочи...
Только почему-то не могу Вам сказать "спасибо" в форуме... Говорит мне, что у меня мало сообщений для этого действия... Обидно Недовольство, огорчение Я Вам очень благодарен!

 

Powered by ExBB FM 1.0 RC1