powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / imap. cокеты. молчание после соединения
3 сообщений из 3, страница 1 из 1
imap. cокеты. молчание после соединения
    #38169455
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Пишу компонент для соединения с почтовым сервером по протоколу imap. И столкнулся с такой проблемой, с моего локального сервера соединение проходит без проблем, но стоит мне залить всё на сервер - как всё рушиться. Просто почтовый сервер позволяет к себе соединиться, но при этом молчит. На сервере это происходит при подключении как через порт 143, так и через 993. На локальном я наблюдаю ту же реакцию при подключении через порт 993, но на 143 всё ок.

Интересен тот факт, что когда я соединяюсь с помощью openssl к этому же почтовому серверу, то он мне отвечает что соединён успешно, потом думает около минуты в полном молчании, а только потом выдаёт приветствие и начинает общение. Если это имеет значение, сам сервер imap.yandex.ru

Возможно я просто чего-то не доделываю как надо? может ещё какие запросы сервисные надо делать. Итак, сам код...

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
<?php

define("IMAP_HTML", 1);
define("IMAP_UID",  2);

/**
 * Description of EMail
 *
 * @author programer19
 */
class Imap{
  
  /** @var string Строка имени сервера imap */
  private $_server;
  /** @var integer Номер порта сервера imap */
  private $_port;
  /** @var string Логин пользователя сервера imap */
  private $_user;
  /** @var string Пароль пользователя сервера imap */
  private $_pass;
  /** @var handle Идентификатор сокета imap */
  private $_socket;
  /** @var integer Номер команды imap для вставки при общении с сервером */
  private $_commandNum = 0;
  /** @var boolean Флаг соединения с сервером */
  private $_connected = false;
  /** @var string Кодировка текста на выходе из класса */
  private $_encoding;
  /** @var string Активная директория imap сервера */
  private $_dir;
  
  /** @var string Результат выполнения последней команды */
  private $_result;
  /** @var string Текст предыдущей ошибки */
  private $_error;
  /** @var string Текст статуса предыдущей команды */
  private $_status;
  
  /**
   * 
   * @param string $server Имя сервера
   * @param integer $port Порт сервера
   * @param string $user Логин пользователя
   * @param string $pass Пароль пользователя
   * @param string $encoding Кодировка текста на выходе из класса
   */
  public function __construct($server, $port, $user, $pass, $encoding = 'UTF-8'){
    $this->_encoding = $encoding;
    $this->connect($server, $port);
    $this->login($user, $pass);
  }
  
  public function __destruct() {
    $this->logout();
    fclose($this->_socket);
  }
  
  /**
   * Функция возвращает текст предыдущей ошибки
   * 
   * @return string Текст ошибки
   */
  public function getLastError(){
    return $this->_error;
  }
  
  /**
   * Функция возвращает текст статуса предыдущей команды
   * 
   * @return string Текст статуса
   */
  public function getLastStatus(){
    return $this->_status;
  }
  
  /**
   * 
   * @param string $dir Переход на сервере imap в указаную директорию
   * @return boolean False при недуачном выполнении, True - при удачном
   */
  public function select($dir){
    $this->_dir = $this->encode7bit($dir);
    return $this->sendCommand("SELECT {$this->_dir}");
  }
  
  /**
   * Функция возвращает тело письма (без вложений)
   * 
   * @param integer $messageNo Номер письма
   * @param integer $flags Флаги-модификаторы
   * IMAP_UID - вместо номера письма будет взят UID
   * IMAP_HTML - Предпочтительно читать text/html разделы, если таковые отсутствуют -
   * будет возвращён текст из разделов с типом text/plain
   * @return string Тело письма. False при неудаче
   */
  public function getBody($messageNo, $flags = 0){
    $res = $this->_getBody($messageNo, $flags);
    return ($res!==false ? $res["body"] : false);
  }
  
  /**
   * Функция возвращает тело письма (без вложений)
   * 
   * @param integer $messageNo Номер письма
   * @param integer $flags Флаги-модификаторы
   * IMAP_UID - вместо номера письма будет взят UID
   * IMAP_HTML - Предпочтительно читать text/html разделы, если таковые отсутствуют -
   * будет возвращён текст из разделов с типом text/plain
   * @param string $part Часть письма, которую надо прочитать (по стандарту RFC-822)
   * @return string Тело нужной части письма. False при неудаче
   */
  private function _getBody($messageNo, $flags = 0, $part = ''){
    $headers = $this->getHeaders($messageNo, $flags & IMAP_UID, $part);
    
    //если не указан тип контента - эта часть нас явно не интересует
    if(empty($headers["content-type"])){
      return false;
    }
    
    //вытягиваю тип и подтип контента
    $contentTypeLines = explode("\n", $headers["content-type"]);
    $contentType = explode(";", str_replace(" ", "", $contentTypeLines[0]));
    $contentType[0] = mb_strtolower($contentType[0], $this->_encoding);
    
    if($contentType[0]!='multipart/mixed' 
    && $contentType[0]!='multipart/alternative'
    && $contentType[0]!='text/plain' 
    && $contentType[0]!='text/html'
    ){
      return false;
    }
    
    //обработка мультипартовых писем
    if($contentType[0]=='multipart/mixed' || $contentType[0]=='multipart/alternative'){
      $subPart = 1;
      
      //заголовки и тип контента мы укажем из данной части письма
      $res["headers"]=$headers;
      $res["contentType"]=$contentType[0];
      
      //а тело письма возьмём из подчастей
      do{
        $rs = $this->_getBody($messageNo, $flags, $part=="" ? strval($subPart) : $part.'.'.strval($subPart));
        if ($rs!==false) $res["body"][$rs["contentType"]] .= $rs["body"];
        $subPart++;
      }while($rs !== false);
      
      if (($flags & IMAP_HTML) && !empty($res["body"]["text/html"])){
        return array(
            "headers"=>$res["headers"],
            "contentType"=>$res["contentType"],
            "body"=>$res["body"]["text/html"]
        );
      }else{
        return array(
            "headers"=>$res["headers"],
            "contentType"=>$res["contentType"],
            "body"=>$res["body"]["text/plain"]
        );
      }
    //обработка обычных текстовых (и html) писем
    }elseif ($contentType[0]=='text/plain' || $contentType[0]=='text/html'){
      
      //читаем нужную часть письма
      $bodyPart = $part=='' ? 'TEXT' : $part;
      if (!$this->sendCommand("FETCH {$messageNo} BODY[$bodyPart]")){
        return false;
      }else{
        
        //вырезаем сервисные строки из ответа
        $body = str_replace("\r\n", "\n", $this->_result);
        $body = preg_replace(array("#^[^\n]*\n#is", "#\n[^\n]*\n$#is"), "", $body);

        //раскодируем тело части письма
        switch($headers["content-transfer-encoding"]){
          case "base64":
            $body = base64_decode($body);
            break;
          case "8bit":
            break;
          case "7bit":
            break;
          case "quoted-printable":
            $body = quoted_printable_decode($body);
            break;
        }

        //переводим тело в нужную кодировку
        preg_match("#charset=\"?([a-zA-Z0-9\\-]+)\"?#is", $contentType[1], $charset);
        $body = mb_convert_encoding($body, $this->_encoding, ($charset[1]=='') ? 'koi8-r' : $charset[1]);

        return array(
            "headers"=>$headers,
            "body"=>$body,
            "contentType"=>$contentType[0]
        );
      }
    }
    
  }
  
  /**
   * Функция возвращает заголовок нужной части письма (без вложений)
   * 
   * @param string $messageNo Номер письма в ящике.
   * доступна комбинаци читать_с:читать_до
   * @param integer $flags Флаги-модификаторы
   * IMAP_UID - вместо номера письма будет взят UID
   * IMAP_HTML - Предпочтительно читать text/html разделы, если таковые отсутствуют -
   * будет возвращён текст из разделов с типом text/plain
   * @param string $part Часть письма, которую надо прочитать (по стандарту RFC-822)
   * @return array Заголовок нужной части письма. False при неудаче или отсутсвии заголовка (части)
   * При считывании массива заголовков каждый набор параметров помещается в элемент массива
   * с номером соответствующего сообщения
   */
  public function getHeaders($num, $flags = 0, $part = '', $field = ""){
    $prefix = ($flags & IMAP_UID)!=0 ? "UID " : "";
    $answer_prefix = ($flags & IMAP_UID)!=0 ? "UID (\\d+) " : "";
    $oneMessage = is_numeric($num);
    
    $partHeader = $part==''   ? "HEADER" : "{$part}.HEADER";
    $partHeader = $field==''  ? $partHeader : "{$partHeader}.FIELDS ({$field})";
    
    $answerPartHeader = preg_quote($partHeader, "#");
    
    if (!$this->sendCommand("{$prefix}FETCH {$num} BODY[{$partHeader}]")){
      return false;
    }else{
      //удаляем из ответа первую и последние строки (стандартное обрамление серверого ответа)
      preg_match_all(
              "#(\\d+) FETCH \\({$answer_prefix}BODY\\[{$answerPartHeader}\\] \\{\\d+\\}[^\n]*\n"
              ."(.*?)\n\n\\)#si", 
              $this->_result,
              $headersMatches,
              PREG_SET_ORDER
      );
              
      $result = array();
      
      foreach($headersMatches as $headersMatch){
        
        $res = array();
        
        $headers = preg_replace(
                "#(\n\t+|\n +)#si", 
                " ", 
                ($flags & IMAP_UID)!=0 ? $headersMatch[3] : $headersMatch[2]
        );

        //распарсиваем заголвоки и заталкиваем в массив
        preg_match_all("#^([^:]+):[ \t]*([^\n]+)$#ims", $headers, $matches, PREG_SET_ORDER);
        foreach($matches as $match){
          $key = mb_strtolower($match[1], $this->_encoding);
          if (!isset($res[$key])){
            $res[$key]=preg_replace("#\n$#si", "", $match[2]);
          }else{
            $res[$key].="\n".preg_replace("#\n$#si", "", $match[2]);
          }
        }
        
        $messageNum = ($flags & IMAP_UID)!=0 ? $headersMatch[2] : $headersMatch[1];
        if(!$oneMessage) $result[$messageNum] = $res;
        
      }
      
      if ($oneMessage) $result = $res;
      
      return $result;
    }
  }
  
  /**
   * 
   * @return integer Количество писем в ящике. False при ошибке выполнения
   */
  public function getMessagesNum(){
    if(!$this->sendCommand("STATUS {$this->_dir} (MESSAGES)")){
      return false;
    }else{
      preg_match("#STATUS \"?{$this->_dir}\"? \\(MESSAGES (\d+)\\)#i", $this->_result, $status);
      return $status[1];
    }
  }
  
  /**
   * Функция возвращает идентификатор письма по его номеру в ящике
   * 
   * @param string $num Номер письма в ящике
   * доступна комбинаци читать_с:читать_до
   * @param integer $flags Флаги-модификаторы
   * IMAP_UID - вместо номера письма будет взят UID
   * @return mixed Возвращает массив, в котором ключ - номер письма в ящике,
   * а значение - идентификатор письма
   * False при ошибке выполнения
   */
  public function getIdByNum($num, $flags = 0){
    $prefix = ($flags & IMAP_UID)!=0 ? "UID " : "";
    $answer_prefix = ($flags & IMAP_UID)!=0 ? "UID (\\d+) " : "";
    
    if(!$this->sendCommand("{$prefix}FETCH {$num} BODY[HEADER.FIELDS (Message-ID)]")){
      return false;
    }else{
      
      preg_match_all(
              "#(\\d+) FETCH \\({$answer_prefix}BODY\\[HEADER\\.FIELDS \\(Message\\-ID\\)\\] \\{\\d+\\}[^\n]*\n"
              ."message\\-id: *<([^>]+)>[^\n]*\n\n"
              ."\\)#is", 
              $this->_result, 
              $idMatches,
              PREG_SET_ORDER
      );
      
      $res = array();
      $keyNum     = ($flags & IMAP_UID)!=0 ? 2 : 1;
      $valueNum   = ($flags & IMAP_UID)!=0 ? 3 : 2;
      
      foreach($idMatches as $idMatch){
        $res[$idMatch[$keyNum]]=$idMatch[$valueNum];
      }
      return $res;
    }
  }
  
  /**
   * Функция возвращает номер письма в ящике по его идентификатору
   * 
   * 
   * @param string $id Идентификатор письма
   * @param integer $flags Флаги-модификаторы
   * IMAP_UID - вместо номера письма будет возвращён UID
   * @return integer Номер письма в ящике.
   * False при неудаче или ошибке выполнения
   */
  public function getNumById($id, $flags = 0){

    if(($flags & IMAP_UID)==0){
      $messagesLastNum = $this->getMessagesNum();
    }else{
      $messagesLastNum = $this->getUID($this->getMessagesNum());
      if($messagesLastNum===false) return false;
    }
    
    $prefix =         ($flags & IMAP_UID)!=0 ? "UID "         : "";
    $answer_prefix =  ($flags & IMAP_UID)!=0 ? "UID (\\d+) "  : "";
    
    if(!$this->sendCommand("{$prefix}FETCH 1:{$messagesLastNum} BODY[HEADER.FIELDS (Message-ID)]")){
      return false;
    }else{
      
      $preg_id = preg_quote($id, "#");
      preg_match(
              "#(\\d+) FETCH \\({$answer_prefix}BODY\\[HEADER\\.FIELDS \\(Message\\-ID\\)\\] \\{\\d+\\}[^\n]*\n"
              ."message\\-id: *<{$preg_id}>[^\n]*\n\n"
              ."\\)#is", 
              $this->_result, 
              $idMatches
      );
      return ($flags & IMAP_UID)!=0 ? $idMatches[2] : $idMatches[1];
    }
  }
  
  /**
   * Функция возвращает UID письма по его номеру в ящике
   * 
   * 
   * @param integer $num Номер письма в ящике
   * @return integer Номер письма в ящике.
   * False при неудаче или ошибке выполнения
   */
  public function getUID($num){
    
    if(!$this->sendCommand("UID SEARCH {$num}")){
      return false;
    }else{
      
      preg_match(
              "#SEARCH (\\d+)#is", 
              $this->_result, 
              $idMatches
      );
      return $idMatches[1];
    }
  }
  public function getNumByUID($uid){
    
    if(!$this->sendCommand("SEARCH UID {$uid}")){
      return false;
    }else{
      
      preg_match(
              "#SEARCH (\\d+)#is", 
              $this->_result, 
              $idMatches
      );
      return $idMatches[1];
    }
  }
  
  /**
   * Функция удаления письма из ящика по его номеру
   * 
   * @param string $num Номер письма в ящике
   * @param integer $flags Флаги-модификаторы
   * IMAP_UID - вместо номера письма будет взят UID
   * @return boolean. False при ошибке. True при удачном выполнении
   */
  public function deleteMessage($num, $flags = 0){
    $prefix = ($flags & IMAP_UID)!=0 ? "UID " : "";
    if(!$this->sendCommand("{$prefix}STORE {$num} +FLAGS (\\Deleted)")){
      return false;
    }else{
      return $this->sendCommand("EXPUNGE");
    }
  }
  public function createMessage($headers, $body){
    $commandData = '';
    foreach($headers as $name=>$value){
      $commandData .= "{$name}: {$value}\r\n";
    }
    $commandData .= "Content-Transfer-Encoding: base64\r\n\r\n";
    
    $commandData .= base64_encode($body)."\r\n";
    $size = mb_strlen($commandData, $this->_encoding)-2;
    if(!$this->sendCommand("append {$this->_dir} (\\Seen) {{$size}}", $commandData)){
      return false;
    }else{
      preg_match("#^\\[APPENDUID (\\d+) (\\d+)\\]#i", $this->getLastStatus(), $statusMatches);
      return $statusMatches[2];
    }
    
  }
  
  /**
   * Возвращает основную (служебную) часть строки для таких значений как
   * from, to, message-id
   * 
   * @param string $str Строка для парсинга
   * @return string Обрезаная строка с служебным значением из начальной строки
   */
  public function getMainPartOfString($str){
    return preg_replace("#^[^<]*<([^>]+)>.*?$#ui", "\\1", $str);
  }
  
  /**
   * Функция кодирует строку в UTF7-IMAP для правильного общения с imap сервером
   * (требуется для русских символов)
   * 
   * @param string $str строка для кодирования
   * @return string Закодированая строка
   */
  public function encode7bit($str){
    return mb_convert_encoding($str, "UTF7-IMAP", $this->_encoding);
  }
  
  /**
   * Функция декодирует строку из UTF7-IMAP для правильного общения с imap сервером
   * (требуется для русских символов)
   * 
   * @param string $str строка для декодирования
   * @return string Декодированая строка
   */
  public function decode7bit($str){
    return mb_convert_encoding($str, $this->_encoding, "UTF7-IMAP");
  }
  
  /**
   * Функция для декодирования не англоязычных заголовков письма таких как
   * тема, от кого письмо (подпись), кому письмо (подпись) и т.д.
   * 
   * @param string $str Строка для декодирования
   * @param string $encoding Кодировка письма
   * @return string Декодированая строка
   */
  public function decodeLine($str, $encoding = "UTF-8"){
    preg_match_all("#=\\?([^\\?]+)\\?([^\\?]+)\\?([^\\?]+)\\?=#uis", $str, $matches, PREG_SET_ORDER);
    if (empty($matches)){
      $res = $this->_encoding!=$encoding ? iconv($encoding, $this->_encoding, $str) : $str;
      return $res;
    }
    
    $res = '';
    foreach($matches as $match){
      $rs = $match[3];
      
      switch($match[2]){
        case 'Q': $rs = quoted_printable_decode($rs);
          break;
        case 'B': $rs = base64_decode($rs);
          break;
      }
      
      if($match[1]!=$this->_encoding) $rs = iconv($match[1], $this->_encoding, $rs);
      $res .= $rs;
    }
    
    return $res;
  }
  
  /**
   * Рекурсивная функция возвращающая текст определённой части письма
   * (ВРЕМЕННО НЕ ВОСТРЕБОВАНА)
   * 
   * @param array $contentType Разбитый по ";" вышестоящий заголовок
   * @param string $body Текст вышестоящей части письма
   * @return array возвращет массив 
   * array(
   *   'text' => письмо в формате text/plain,
   *   'html' => письмо в формате text/html
   * )
   */
  private function getMultiPart($contentType, $body){
    $res = array("text"=>"", "html"=>"");
    
    preg_match("#boundary=\"?([a-zA-Z0-9\\-_=]+)\"?#s", $contentType, $boundary);
    $boundary[1] = preg_quote($boundary[1], "#");
    
    preg_match_all("#\\-\\-{$boundary[1]}\n((?:[^\n]+\n)+)\n(.*?)(?=\n\\-\\-{$boundary[1]})#s", $body, $parts, PREG_SET_ORDER);
    foreach($parts as $part){
      $part[1] = preg_replace("#\n[ \t]+#is", " ", $part[1]);
      
      $subHeaders = array();
      preg_match_all("#^([^:]+): *([^\n]+)$#ims", $part[1], $matches, PREG_SET_ORDER);
      foreach($matches as $match){
        $subHeaders[mb_strtolower($match[1], $this->_encoding)]=$match[2];
      }
      $subContentType = explode(";", str_replace(" ", "", $subHeaders["content-type"]));
      $subContentType[0] = mb_strtolower($subContentType[0], $this->_encoding);
      
      $partBody=$part[2];
      if ($subContentType[0]=="text/plain" || $subContentType[0]=="text/html"){
        switch($subHeaders["content-transfer-encoding"]){
          case "base64":
            $partBody = base64_decode($partBody);
            break;
          case "8bit":
            break;
          case "7bit":
            break;
          case "quoted-printable":
            $partBody = quoted_printable_decode($partBody);
            break;
        }
      }
      
      switch ($subContentType[0]){
        case "multipart/alternative":
          $rs = $this->getMultiPart(implode(" ", $subContentType), $partBody);
          $res['text'] .= $rs['text'];
          $res['html'] .= $rs['html'];
          break;
        case "text/plain":
          preg_match("#charset=\"?([a-zA-Z0-9\\-_]+)\"?#is", implode(" ", $subContentType), $subCharset);
          $res["text"] .= mb_convert_encoding($partBody, $this->_encoding, ($subCharset[1]=='') ? 'koi8-r' : $subCharset[1]);
          break;
        case "text/html":
          preg_match("#charset=\"?([a-zA-Z0-9\\-_]+)\"?#is", implode(" ", $subContentType), $subCharset);
          $res["html"] .= mb_convert_encoding($partBody, $this->_encoding, ($subCharset[1]=='') ? 'koi8-r' : $subCharset[1]);
          break;
      }
    }
    
    return $res;
  }
  
  /**
   * Функция соединения с imap сервером
   * 
   * @param string $server Имя imap сервера
   * @param integer $port Порт imap сервера
   * @return boolean Результат соединения. True - удачно, False - при ошибке
   */
  private function connect($server, $port){
    $this->_socket = fsockopen($server, $port, $errno, $error);
    if(!$this->_socket){
      $this->_error = $error;
      $this->_connected = false;
      return false;
    }else{
      $this->_server = $server;
      $this->_port = $port;
      $this->_connected = true;
      return true;
    }
  }
  
  /**
   * Функция для авторизации на сервере imap
   * 
   * @param string $user Логин пользователя
   * @param string $pass Пароль пользователя
   * @return boolean Результат логина. True - удачно. False - ошибка
   */
  private function login($user, $pass){
    return $this->sendCommand("LOGIN {$user} {$pass}");
  }
  
  /**
   * Функция для разавторизации на сервере imap
   * 
   * @return boolean Результат выполнения. True - удачно. False - оишбка
   */
  private function logout(){
    return $this->sendCommand("LOGOUT");
  }
  
  /**
   * Функция для отправки команды для выполнения на сервере
   * 
   * @param string $command Команда для выполнения
   * @return boolean Результат выполнения команды. True - удачно. False - не удачно
   */
  private function sendCommand($command, $data=''){
    if(!$this->_connected){
      $this->_error = 'You must to connect first';
      return false;
    }else{
      
      $this->_commandNum++;
      $commandNumLength = mb_strlen("{$this->_commandNum}", $this->_encoding);
      fputs($this->_socket, "{$this->_commandNum} {$command}\r\n");
      
      $res = '';
      /*
       * читаем строку с сокета и проверяем начинается ли она с номера отправленной комманды
       * если да - значит это статус выполнения и мы прекращаем чтение и переходим к обработке
       * полученого статуса
       */
      while($line=fgets($this->_socket)){
        if(mb_substr($line, 0, $commandNumLength, $this->_encoding)=="{$this->_commandNum}") break;
        if (mb_substr($line, 0, 2, $this->_encoding)=="* "){
          $line = mb_substr($line, 2, null, $this->_encoding);
        }elseif(mb_substr($line, 0, 1, $this->_encoding)=="+"){
          fputs($this->_socket, $data);
          $line = '';
        }
        $res .= str_replace("\r\n", "\n", $line);
      }
      
      /*
       * удаляем номер комманды с пробелом и читаем статус
       * если статус начинается с OK - значит комманда выполнилась удачно, если с NO или BAD -
       * значит выводим ошибку
       */
      $line = mb_substr($line, $commandNumLength+1, null, $this->_encoding);
      if (mb_substr($line, 0, 2, $this->_encoding)=="OK"){
        $this->_result = $res;
        $this->_status = preg_replace("#^OK #i", "", $line);
        return true;
      }else{
        $this->_error = preg_replace("#^(NO|BAD) #i", "", $line);
        $this->_status = '';
        return false;
      }
    }
  }
  
}




ну а пользую я его так (и начиная с комманды select получаю на выход пустые ошибки из-за молчания сервера почты):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    //соединяюсь с imap для приёма писем
    $imap = new Imap($this->imap_mail_serv, $this->imap_mail_port, $this->imap_mail_user, $this->imap_mail_pass);
    if($error = $imap->getLastError()) $errors .= $error."\n";

    // перехожу в папку входящих сообщений и
    // читаю последнее принятое с базы
    if($imap->select("INBOX")===false) $errors .= $imap->getLastError()."\n";

    //тут куча разных комманд чтения почты и всё такое

    unset($imap)



Всем, кто откликнется заранее благодарен
...
Рейтинг: 0 / 0
imap. cокеты. молчание после соединения
    #38169723
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у себя порт 993 запустил... оказалось, что это защещённое соединение, поэтому почтовый сервер надо указывать как ssl://imap.yandex.ru

Но с серваком так и не удалось ни 143-ий ни 993-ий запустить... Есть хоть какие-то предположения, что это может быть? Горю, сдавать сегодня надо, а оно не работает на серваке!!!
...
Рейтинг: 0 / 0
imap. cокеты. молчание после соединения
    #38170228
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам и отвечаю.
Проблема была в
Код: php
1.
$line = mb_substr($line, 2, null, $this->_encoding);


и
Код: php
1.
$line = mb_substr($line, $commandNumLength+1, null, $this->_encoding);



Оказалось, что сервер null понимал не как мой локальный, что надо все символы взять, а он переводил его в чисельный эквивалент(0) и брал 0 символов строки... вот и ошибка.

Всем спасибо за внимание.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / imap. cокеты. молчание после соединения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]