Xpoint
   [напомнить пароль]

Кодировка gmail

Метки: [без меток]
2009-03-28 22:50:08 [обр] Александр Петров(2/4)[досье]

Здравствуйте

{imap.gmail.com:993}INBOX
{imap.gmail.com:993}Sent
{imap.gmail.com:993}Trash
{imap.gmail.com:993}[Gmail]/&BBIEQQRP- &BD8EPgRHBEIEMA-
{imap.gmail.com:993}[Gmail]/&BBoEPgRABDcEOAQ9BDA-
{imap.gmail.com:993}[Gmail]/&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-
{imap.gmail.com:993}[Gmail]/&BB8EPgQ8BDUERwQ1BD0EPQRLBDU-
{imap.gmail.com:993}[Gmail]/&BCEEPwQwBDw-
{imap.gmail.com:993}[Gmail]/&BCcENQRABD0EPgQyBDgEOgQ4-
{imap.gmail.com:993}petav@inbox.ru
{imap.gmail.com:993}petav@mail.ru
{imap.gmail.com:993}&BCcENQRABD0EPgQyBDgEOgQ4-

Это список всех папок в gmail.com, что за кодировка такая, iconv не получилось применить. Грустно.

спустя 9 минут [обр] Александр Петров(2/4)[досье]
так вот так уже более менее
$mbox = imap_open('{'.$imap_server.':'.$imap_port.'/imap/ssl/novalidate-cert}', $imap_user, $imap_pass)
     or die('ERROR: '.imap_last_error());
    
   $folders = imap_listmailbox($mbox, '{'.$imap_server.':'.$imap_port.'}', "*");
   if ($folders == false) {
       echo "Call failed<br />\n";
   } else {
      print_r($folders);
      foreach ($folders as $val) {
         echo iconv('UTF-16','UTF-8',imap_utf7_decode($val)). "<br />\n"; //Вот решение, но не совсем
      }
   }
спустя 10 минут [обр] Александр Петров(2/4)[досье]
теперь это выглядит так
...
&&#31593&&&&#28001&&&&#28718&&&&#26477&&&&#24937&&&&#27694&&&&#25455&&&&#27962&&&&#14649&&&&#13181&&&&#23367&&&&#28001&&&&#26988&&&&#23855&&Корзина
...
спустя 11 часов [обр] Алексей Севрюков(162/1280)[досье]
Александр Петров[досье] может быть это base64?
спустя 56 минут [обр] Александр Петров(2/4)[досье]
Алексей Севрюков[досье], нет. Как я понимаю после imap_utf7_decode, получается строка в которой присутствуют латинские буквы, и руские крякозябры. После iconv('UTF-16','UTF-8'... Латинские буквы становятся крякозябрами, а русские читаются. Т.е я как понимаю нужно найти способ перекодирования строки по символам что ли.... Какая-то ерунда, в голове не укладывается.
спустя 1 час 2 минуты [обр] Александр Петров(2/4)[досье]
Гугл латинские буквы кодирует utf-8, а русские utf-16, а потом все это конкатенирует и без зазрения совести отдаёт, у меня такое впечатление сейчас
спустя 24 минуты [обр] Lynn «Кофеман»(98/571)[досье]
Мне кажется, что это UTF-7, только & надо заменить на +.
~$ echo "[Gmail]/+BBIEQQRP- +BD8EPgRHBEIEMA-" | iconv -f utf-7 -t utf-8
[Gmail]/Вся почта
спустя 18 минут [обр] Lynn «Кофеман»(98/571)[досье]

А, нет. Это самый натуральный UTF-7 модифицированный для IMAP (RFC3501(ietf), §5.1.3).
А разработчики PHP как всегда не в курсе, что есть другие кодировки, кроме latin1 :(

По-хорошему, надо вытащить из текста все блоки &...- и декодировать их по стандарту. По-быстрому, заменить & на + и скормить iconv

спустя 14 минут [обр] Александр Петров(2/4)[досье]

Lynn «Кофеман»[досье]

$folders = imap_listmailbox($mbox, '{'.$imap_server.':'.$imap_port.'}', "*");
if ($folders == false) {
   echo "Call failed<br />\n";
} else {
   foreach ($folders as $val) {

      /////
      $text = str_replace('&', '+', $val);
      echo iconv('UTF-7','UTF-8', $text). "<br />\n";
      /////

   }
}

Вот так уже кое что, только почему-то ошибка выскакивает Notice: iconv() [function.iconv]: Detected an illegal character in input string in D:\htdocs\botmail.petav\www\clapi\tabs\get.php on line 28. Эта ошибка выскакивает когда на "п" натыкается, вот

{imap.gmail.com:993}INBOX
{imap.gmail.com:993}Sent
{imap.gmail.com:993}Trash
{imap.gmail.com:993}[Gmail]/Вся почта
{imap.gmail.com:993}[Gmail]/Корзина

Notice: iconv() [function.iconv]: Detected an illegal character in input string in D:\htdocs\botmail.petav\www\clapi\tabs\get.php on line 28
{imap.gmail.com:993}[Gmail]/От   //Отправленные
{imap.gmail.com:993}[Gmail]/Помеченные
{imap.gmail.com:993}[Gmail]/Спам
{imap.gmail.com:993}[Gmail]/Черновики
{imap.gmail.com:993}petav@inbox.ru
{imap.gmail.com:993}petav@mail.ru
{imap.gmail.com:993}Черновики
спустя 3 минуты [обр] Александр Петров(2/4)[досье]

Александр Петров[досье]

По-хорошему, надо вытащить из текста все блоки &...- и декодировать их по стандарту

Поясните пожалуйста "и декодировать их по стандарту".

спустя 10 минут [обр] Александр Петров(2/4)[досье]

Я понял

&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-

ему в слове "Отправленные" , не нравиться

спустя 2 минуты [обр] Lynn «Кофеман»(98/571)[досье]

Да. Там должен стоять /.

Для декодирования нужно в вытащенном блоке заменить , (запятую) на / (слеш). Раскодировать из base64. Преобразовать из UTF-16-BE в нужную кодировку.

спустя 1 минуту [обр] Lynn «Кофеман»(98/571)[досье]
И не забыть, что последовательность символов &- означает &, а не пустую строку.
спустя 11 минут [обр] Александр Петров(2/4)[досье]

Lynn «Кофеман»[досье], очень признателен, сам бы не за что не догадался. Вот такой код на скорую руку заработал

$text = str_replace('&', '+', $val);
$text  = str_replace(',', '/', $text);
echo iconv('UTF-7','UTF-8', $text). "<br />\n";

Пока так оставлю, но кажется что правильнее использовать ваш второй вариант.

И не забыть, что последовательность символов &- означает &, а не пустую строку.

т.е. если блок ни чего ни содержит значит его не декодируем, а смело пишум &

спустя 1 год 8 месяцев [обр] shkur[досье]

непонятно зачем:

  1. Раскодировать из base64. (и так работает)
  2. Преобразовать из UTF-16-BE (мы же делаем UTF-7 в UTF-8)
  3. Совсем не понял про: → И не забыть, что последовательность символов &- означает &, а не пустую строку.

Что я хочу: (я понимаю что это проще сделать php+mysql+наверняка это уже все давно придуманно и сделанно)
база ведется в google spreadsheets
переписка по каждой заявке через HOSTED free Gmail
Хочу что бы в скрипт в соответствующую заявку в spreadsheets записывал соответствующую ссылку на gmail, т.е. цепочку\цепочки писем

Что сделал: (кагжешь медленно все это блин...)

<?php
echo "<pre>";
$username = '_________';  //user@gmail.com или user@yourdomain (HOSTED ACCOUNT)
$password = '__________'; // your pass
$hostname = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX'; //без INBOX тоже работает.
$mbox = imap_open($hostname, $username, $password) or die('Cannot connect to Gmail: ' . imap_last_error());
//print_r($inbox);

echo "<p><h1>Mailboxes</h1>\n";
$folders = imap_listmailbox ($mbox, "{myimap}", "*");

   if ($folders == false) {
      echo "Call failed<br>\n";
   } else {
   /*while (list ($key, $val) = each ($folders)) { // не понимаю я как это работает
   echo $val."<br>\n";
   }*/
      foreach ($folders as $k => $v){
         $v = str_replace('&-', '&', $v); //если у ярлыка в конце стоит "&" то к нему добавится "-" и строка пойдёт на раскодировку и вместо "ярлык&" получится "ярлык+"
         if (preg_match("/&(?!-)|-(?= )|[^&]-$/", $v) === 1) {
            //echo "1 ";
            echo gm_utf7_decode($v)."<br>\n"; //кривая кодировка Gmail'a см тут http://xpoint.ru/forums/programming/PHP/thread/44035.xhtml
         } else {
            // echo "2 ";
            echo $v."<br>\n";
         }
      }
   }

echo "<hr>\n<p><h1>Headers in INBOX</h1>\n";

for ($i=0,$m=1; $i<5; $i++,$m++){
   $headers[] = imap_header($mbox, $m);
   echo $i.' '.$m.' ';
   echo mime_charset_to_utf8($headers[$i]->subject)."\n";
}

echo "\n\n\n print_r(\$headers)= "; print_r($headers);
imap_close($mbox);
// мои функции
   function mime_charset_to_utf8($string){
      $SS = imap_mime_header_decode($string);
         for($i=0;$i<count($SS);$i++) {
            $income_charset = $SS[$i]->charset;
            $income_text = $SS[$i]->text;
            if ($income_charset == 'default') {
               $output .= $income_text;
            } else {
               $output .= iconv($income_charset,'UTF-8', $income_text);
            }
         }
      return $output;
   }

   function gm_utf7_decode($val){
      $text = str_replace('&', '+', $val);
      $text  = str_replace(',', '/', $text);
      return iconv('UTF-7','UTF-8', $text);
   }

/* example раскодировки mime subject
$SS = imap_mime_header_decode("=?KOI8-R?B?6c3Qz9LUIMvPztTBy9TP1yDJINPUwdLZyCDQydPFzQ==?=");
for($i=0;$i<count($SS);$i++) {
echo "Charset: {$SS[$i]->charset}\n";
echo "Text: {$SS[$i]->text}\n\n";
echo iconv($SS[$i]->charset,'UTF-8', $SS[$i]->text). "<br />\n";
}
*/

приходят названия ящиков и темы писем без "крягозябров"

Mailboxes

{myimap}INBOX

{myimap}[Gmail]/Вся почта

{myimap}[Gmail]/Корзина

{myimap}[Gmail]/Отправленные

{myimap}[Gmail]/Помеченные

{myimap}[Gmail]/Спам

{myimap}[Gmail]/Черновики

{myimap}Личные

{myimap}Путешествие

{myimap}Работа

{myimap}Счета

{myimap}нотес



Headers in INBOX

0 1 Доступ к Gmail с мобильного телефона
1 2 Импорт контактов и старых писем
2 3 Настройка цвета и темы в Gmail
3 4 Группы Google: Вы приглашены в группу topor-racing
4 5 ge-пвх-39153000



 print_r($headers)= Array
(
    [0] => stdClass Object
        (
            [date] => Sun, 14 Feb 2010 01:36:04 -0800
            [Date] => Sun, 14 Feb 2010 01:36:04 -0800
            [subject] => =?KOI8-R?B?5M/T1NXQIMsgR21haWwg0yDNz8LJzNjOz8fPINTFzMXGz87B?=
            [Subject] => =?KOI8-R?B?5M/T1NXQIMsgR21haWwg0yDNz8LJzNjOz8fPINTFzMXGz87B?=
            [message_id] => <81a539bb1002140136w1bcfc082p@mail.gmail.com>
            [toaddress] => "Mr. Shkur" 
            [to] => Array
                (
                    [0] => stdClass Object
                        (
спустя 19 часов [обр] Lynn «Кофеман»(98/571)[досье]
Попробуйте задать свой вопрос ещё раз. Я не понял
спустя 2 дня 15 часов [обр] shkur[досье]

Вопрос еще не сформировался :)
А с кодировкой "ларчик просто открывался"
&BBoEPgRABDcEOAQ9BDA- это слово Корзина

echo mb_convert_encoding("&BBoEPgRABDcEOAQ9BDA-", "UTF-8", "UTF7-IMAP");

P.S. непонятно почему функция imap_utf7_decode(); работает некоррэктно.

спустя 3 месяца 24 дня [обр] shkur[досье]
Вообще мне нужно воспользоваться расширениями imap сервера, но в стандартных функциях я ни чего не нашел. Может подскажете более простой путь?
http://forum.php.su/topic.php?......5&postid=1303322310#1303322310
спустя 5 месяцев [обр] shkur[досье]
вот тут и тут продолжил тему - вдруг кому-то понадобится.
и вот еще на stackoverflow:
find-gmail-url-ids-via-imap
custom-imap-command-in-php
how-to-get-gmail-threadid-using-imap-xoauth
спустя 14 часов [обр] shkur[досье]
не нашёл как можно отредактировать своё же сообщение, к сожалению с вики все удалили. Выложил на блоггере http://mrshkur.blogspot.com/
Powered by POEM™ Engine Copyright © 2002-2005