Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > проблемы с сылками в письмах


Автор: Vigoroso 14.3.2008, 16:01
после знака "=" в письме пропадают символы,
по проведенному опыту, есть подозрение что проблемы с кодировкой, потому что знак =аа превратился в черный ромб со знаком вопроса =)
на каком шаге возможны такие проблемы?

Автор: flashaa 14.3.2008, 16:19
Исходный текст письма в студию

Автор: Vigoroso 14.3.2008, 16:31
input: ... link: www.xxx.com/index.php?action=forgot_password&code=AS2DSF32WERDF32SDFSDF32RDSFF32DSFDSFDSF
output: ... link: www.xxx.com/index.php?action=rgot_password&code=AS2DSF32WERDF32SDFSDF32RDSFF32DSFDSFDSF



Автор: flashaa 14.3.2008, 16:55
Это я уже понял из слов. Нужно посмотреть все письмо с заголовками, которое было ПОЛУЧЕНО клиентом, а не тот текст, который скармливается ф-ции mail или её аналогам.  Надо понять что в письме не так, а затем уже смотреть скрипт.
Ведь речь идет о емейл-письме?
В мозиле thunderbird например можно посмотреть с помощью ctrl+u, выделив интересующее письмо.

Автор: Vigoroso 14.3.2008, 17:02
Цитата(flashaa @ 14.3.2008,  16:55)
Это я уже понял из слов. Нужно посмотреть все письмо с заголовками, которое было ПОЛУЧЕНО клиентом, а не тот текст, который скармливается ф-ции mail или её аналогам.  Надо понять что в письме не так, а затем уже смотреть скрипт.
Ведь речь идет о емейл-письме?
В мозиле thunderbird например можно посмотреть с помощью ctrl+u, выделив интересующее письмо.

X-Mailer: phpClient (mail)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Message-ID: <20080314155454.1234.noreply@xxx.com>
Date: Fri, 14 Mar 2008 15:54:54 +0200 (EET)
X-Virus-Scanned: amavisd-new at xxx.com
Envelope-To: xxx@xxx.com

follow the link: http://www.xxx.com/?pop=forgot_password&code=BDDHZMD94E46E33KVVY9F2PCUHAZWW3JBJ6UC7RCQGBZH2HN

Спасибо что подсказал посмотреть само письмо,
получается что текст приходит нормально, но Thunderbird ошибается при отображении содержимого, не знаю как остальные имэйл клиенты...

Автор: Feldmarschall 14.3.2008, 17:23
Цитата(Vigoroso @  14.3.2008,  17:02 Найти цитируемый пост)
 charset=UTF-8

гм.

Автор: flashaa 14.3.2008, 18:00
Feldmarschall, 
А меня больше смутило вот это
Цитата

Content-Transfer-Encoding: quoted-printable

http://msdn2.microsoft.com/en-us/library/ms526941(EXCHG.10).aspx
Попробуй поставить 8bit вместо quoted-printable

Автор: Feldmarschall 14.3.2008, 18:02
А, ну да. Разумеется! поэтому-то на знак = так неадекватно почтовый клиент и реагирует =)

Автор: flashaa 14.3.2008, 18:23
Хотя UTF-8 без кавычек - тоже нехорошо, не по стандарту. НО сразу видно, что вряд ли кодировка потому что
1) Нет русских букв, а портятся латинские, которые что в KOI, что в UTF имеют одинаковые коды
2) Я отправлял письма в такой небрежной форме задания кодировки, клиенты распознают

Автор: Vigoroso 14.3.2008, 18:39
пользуюсь email_message_class(), не полусается изменить этот хеадер =\

Автор: Feldmarschall 14.3.2008, 18:41
тогда кодируй тело в quoted printable
или используй другой класс.

очевидные, в общем-то, решения.

Автор: flashaa 14.3.2008, 18:48
Кодирование к quoted-printable (из PEAR::Mail_mime).. Т.е. ДЕкодирование, счас подыщу кодирование...
Код

/**
     * Given a quoted-printable string, this
     * function will decode and return it.
     *
     * @param  string Input body to decode
     * @return string Decoded body
     * @access private
     */
    function _quotedPrintableDecode($input)
    {
        // Remove soft line breaks
        $input = preg_replace("/=\r?\n/", '', $input);

        // Replace encoded characters
                $input = preg_replace('/=([a-f0-9]{2})/ie', "chr(hexdec('\\1'))", $input);

        return $input;
    }


Добавлено @ 18:55
По идее вот так:

Код

$input = preg_replace('/./ie', "'='.ord('$0')", $input);
$input = wordwrap($input, 76, "\r\n");

Автор: Vigoroso 14.3.2008, 19:41
Цитата(flashaa @ 14.3.2008,  18:48)
Кодирование к quoted-printable (из PEAR::Mail_mime).. Т.е. ДЕкодирование, счас подыщу кодирование...
Код

/**
     * Given a quoted-printable string, this
     * function will decode and return it.
     *
     * @param  string Input body to decode
     * @return string Decoded body
     * @access private
     */
    function _quotedPrintableDecode($input)
    {
        // Remove soft line breaks
        $input = preg_replace("/=\r?\n/", '', $input);

        // Replace encoded characters
                $input = preg_replace('/=([a-f0-9]{2})/ie', "chr(hexdec('\\1'))", $input);

        return $input;
    }


Добавлено @ 18:55
По идее вот так:

Код

$input = preg_replace('/./ie', "'='.ord('$0')", $input);
$input = wordwrap($input, 76, "\r\n");

не очень как-то работает =)
Вот что пришло: 1408�101a�R�tiievgep�WvurP��w�t�vhRi�U�ghVTrwgw���fuhR�pt

Автор: flashaa 15.3.2008, 21:25
Можно было посмотреть ссылку которую я дал и код декодирования, а не дожидаться всего на блюдечке с каемочкой.
Код

$input = preg_replace('/./ie', "'='.sprintf('X', ord('$0'))", $input);
$input = wordwrap($input, 76, "\r\n");

Автор: Vigoroso 17.3.2008, 12:39
Цитата(flashaa @ 15.3.2008,  21:25)
Можно было посмотреть ссылку которую я дал и код декодирования, а не дожидаться всего на блюдечке с каемочкой.
Код

$input = preg_replace('/./ie', "'='.sprintf('X', ord('$0'))", $input);
$input = wordwrap($input, 76, "\r\n");

если бы это работало =)

Автор: Feldmarschall 17.3.2008, 12:41
flashaa, у него же класс. черный ящик. который наверняка что-то там у себя внутри кодирует. криво, судя по всему.

Автор: Vigoroso 17.3.2008, 15:41
Код

Function QuotedPrintableEncode($text,$header_charset='',$break_lines=1)
    {
        $ln=strlen($text);
        $h=(strlen($header_charset)>0);
        if($h)
        {
            $s=array(
                '='=>1,
                '?'=>1,
                '_'=>1,
                '('=>1,
                ')'=>1,
                '<'=>1,
                '>'=>1,
                '@'=>1,
                ','=>1,
                ';'=>1,
                '"'=>1,
                '\\'=>1,
/*
                '/'=>1,
                '['=>1,
                ']'=>1,
                ':'=>1,
                '.'=>1,
*/
            );
            $space=$break_lines=0;
            for($i=0;$i<$ln;$i++)
            {
                if(IsSet($s[$text[$i]]))
                    break;
                if(strcmp($text[$i]," "))
                {
                    $o=Ord($text[$i]);
                    if($o<32
                    || $o>127)
                            break;
                }
                else
                    $space=$i+1;
            }
            if($i==$ln)
                return($text);
            if($space>0)
                return(substr($text,0,$space).($space<$ln ? $this->QuotedPrintableEncode(substr($text,$space),$header_charset,0) : ""));
        }
        for($w=$e='',$l=0,$i=0;$i<$ln;$i++)
        {
            $c=$text[$i];
            $o=Ord($c);
            $en=0;
            switch($o)
            {
                case 9:
                case 32:
                    if(!$h)
                    {
                        $w=$c;
                        $c='';
                    }
                    else
                    {
                        if($o==32)
                            $c='_';
                        else
                            $en=1;
                    }
                    break;
                case 10:
                case 13:
                    if(strlen($w))
                    {
                        if($break_lines
                        && $l+3>75)
                        {
                            $e.='='.$this->line_break;
                            $l=0;
                        }
                        $e.=sprintf('=%02X',Ord($w));
                        $l+=3;
                        $w='';
                    }
                    $e.=$c;
                    $l=0;
                    continue 2;
                default:
                    if($o>127
                    || $o<32
                    || !strcmp($c,'='))
                        $en=1;
                    elseif($h
                    && IsSet($s[$c]))
                        $en=1;
                    break;
            }
            if(strlen($w))
            {
                if($break_lines
                && $l+1>75)
                {
                    $e.='='.$this->line_break;
                    $l=0;
                }
                $e.=$w;
                $l++;
                $w='';
            }
            if(strlen($c))
            {
                if($en)
                {
                    $c=sprintf('=%02X',$o);
                    $el=3;
                }
                else
                    $el=1;
                if($break_lines
                && $l+$el>75)
                {
                    $e.='='.$this->line_break;
                    $l=0;
                }
                $e.=$c;
                $l+=$el;
            }
        }
        if(strlen($w))
        {
            if($break_lines
            && $l+3>75)
                $e.='='.$this->line_break;
            $e.=sprintf('=%02X',Ord($w));
        }
        if($h
        && strcmp($text,$e))
            return('=?'.$header_charset.'?q?'.$e.'?=');
        else
            return($e);
    }

вырезанно из класса email_message_class()

Добавлено @ 15:42
Цитата(Feldmarschall @ 17.3.2008,  12:41)
flashaa, у него же класс. черный ящик. который наверняка что-то там у себя внутри кодирует. криво, судя по всему.

вот именно, черный ящик, кто же знал что надо предварительно вызывать кодирование...
(если тип сообщения уже установлен)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)