Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс для работы с почтой, с вложениями и встроеной графикой 
:(
    Опции темы
z-END
Дата 11.9.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Вообщем я использовал класс mail  (Пинежанинова Ивана  v 1.01) вполне удобный класс, но встала проблема отправлять html-письма с графикой в тексте  и вложениями. я его немного изменил под эти нужды, но он стал глючить... т.е. при приеме писем в мэил.ру вложения идут кракозябликами... вообщем замучался править.
есть готовый класс с данным функционалом?


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
-=Ustas=-
Дата 11.9.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



http://phpclub.ru/detail/article/mail#part_3 100% отправка с графикой, практически во всех клиентах проверял лично.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
mishaSL
Дата 11.9.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 54



Цитата(z-END @  11.9.2007,  09:42 Найти цитируемый пост)
я его немного изменил под эти нужды, но он стал глючить...

Покажи что изменял - может исправим этот класс.

Если хочешь сразу готовый, то можешь отсюда http://ru2.php.net/mail из комментариев взять. Или Pear http://pear.php.net/manual/en/package.mail.php воспользоваться.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
z-END
Дата 11.9.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Вот мой измененный класс:
Код

<?    
class Mail    
{    
    //    
    // +----------------------------------------------------------------------+    
    // | Mail, класс для отправки электронной почты с вложениями              |    
    // +----------------------------------------------------------------------+    
    // | Класс предназначен  для отправки  электронной  почты  с  вложениями. |    
    // | Класс автоматически  распознает  кодировку отправляемого сообщения и |    
    // | переконвертирует его в заданную кодировку.                           |    
    // | Поддерживается автоматическое определение типа MIME вложений.        |    
    // +----------------------------------------------------------------------+    
    // | Автор:   Пинежанинов Иван <[email protected]>                         |    
    // +----------------------------------------------------------------------+    
    //    
    // v 1.01 18:42 01.11.2003    
    //    
    // +----------------------------------------------------------------------+    
    // |                    Конфигурационные переменные:                      |    
    // +----------------------------------------------------------------------+    
    var $from;    
    var $to;    
    var $subject;    
    var $body;    
    var $html_auto = false;    
    var $html = true;    
    var $cp = 'windows-1251';    
    var $cp_auto = false;    
    var $cp_in;    
    // +----------------------------------------------------------------------+    
    // |                  Конец конфигурационных переменных.                  |    
    // +----------------------------------------------------------------------+    
     
    var $nl;    
    var $parts = Array();    
    var $headers = Array();    
    function Mail()    
    {    
        substr(PHP_OS, 0, 3) == 'WIN' ? $this->nl = "\r\n" : $this->nl = "\n";    
    }    

    function add_attachment($file,$is_file=false)    
    {    
        if (file_exists($file)) {    
            $file_name = basename($file);    
            if (function_exists('mime_content_type')) {    
                $ctype = mime_content_type($file);    
            } else {    
                $pathinfo = pathinfo($file);    
                $mime = Array(    
                            'rar'  => 'application/x-tar',    
                            'zip'  => 'application/x-zip-compressed',    
                            'asf'  => 'video/x-ms-asf',    
                            'wmv'  => 'video/x-ms-wmv',    
                            'aiff' => 'audio/aiff',    
                            'au'   => 'audio/basic',    
                            'mid'  => 'audio/mid',    
                            'mp3'  => 'audio/mpeg',    
                            'wav'  => 'audio/wav',    
                            'wma'  => 'audio/x-ms-wma',    
                            'avi'  => 'video/x-msvideo',    
                            'ivf'  => 'video/x-ivf',    
                            'mpeg' => 'video/mpeg',    
                            'mpg'  => 'video/mpeg',    
                            'mpe'  => 'video/mpeg',    
                            'qt'   => 'video/quicktime',    
                            'mov'  => 'video/quicktime',    
                            'art'  => 'image/x-jg',    
                            'bmp'  => 'image/bmp',    
                            'gif'  => 'image/gif',    
                            'jpg'  => 'image/jpg',    
                            'swf'  => 'application/futuresplash',    
                            'tiff' => 'image/tiff',    
                            'pdf'  => 'application/pdf',    
                            'html' => 'text/html',    
                            'htm'  => 'text/html',    
                            'xls'  => 'application/x-msexcel',    
                            'doc'  => 'application/msword',    
                            'rtf'  => 'application/msword',    
                            'rtx'  => 'text/richtext',    
                            'xml'  => 'text/xml',    
                            'hta'  => 'application/hta',    
                            'css'  => 'text/css',    
                            'txt'  => 'text/plain'    
                             );    
                isset($mime[$pathinfo['extension']]) ? $ctype = $mime[$pathinfo['extension']] : $ctype = 'application/octet - stream';    
            }    
            $fopen = fopen($file, 'r');    
            $attachment = fread($fopen, filesize($file));    
            fclose($fopen);    
            $this->parts[] = Array    
                             (    
                                'name'       => $file_name,    
                                'attachment' => $attachment,    
                                'ctype'      => $ctype,
                                'is_file'    => $is_file    
                             );    
            return 0;    
        } else {    
            return 1;    
        }    
    }    


    function add_header($header)    
    {    
        $this->headers[] = trim($header);    
    }    
     
    function detect_cyr_charset($str)    
    {    
        $charsets = Array(    
                        'k' => 0,    
                        'w' => 0,    
                        'd' => 0,    
                        'i' => 0,    
                        'm' => 0    
                         );    
        for ($i = 0, $length = strlen($str); $i < $length; $i++) {    
            $char = ord($str[$i]);    
            //non-russian characters    
            if ($char < 128 || $char > 256) continue;    
            //cp866    
            if (($char > 159 && $char < 176) || ($char > 223 && $char < 242)) $charsets['d'] += 3;    
            if (($char > 127 && $char < 160)) $charsets['d'] += 1;    
            //koi8-r    
            if (($char > 191 && $char < 223)) $charsets['k'] += 3;    
            if (($char > 222 && $char < 256)) $charsets['k'] += 1;    
            //win-1251    
            if ($char > 223 && $char < 256) $charsets['w'] += 3;    
            if ($char > 191 && $char < 224) $charsets['w'] += 1;    
            //mac    
            if ($char > 221 && $char < 255) $charsets['m'] += 3;    
            if ($char > 127 && $char < 160) $charsets['m'] += 1;    
            //iso-8859-5    
            if ($char > 207 && $char < 240) $charsets['i'] += 3;    
            if ($char > 175 && $char < 208) $charsets['i'] += 1;    
        }    
        arsort($charsets);    
        return key($charsets);    
    }    

    function cp_convert()    
    {    
        $cp_array = Array(    
                        'windows-1251'   => 'w',    
                        'koi8-r'         => 'k',    
                        'iso8859-5'      => 'i',    
                        'x-cp866'        => 'a',    
                        'x-mac-cyrillic' => 'm'    
                         );    
        if ($this->cp_auto == true) {    
            $from = $this->detect_cyr_charset($this->body);    
        } else {    
            isset($cp_array[$this->cp_in]) ? $from = $cp_array[$this->cp_in] : $from = 'w';    
        }    
        isset($cp_array[$this->cp]) ? $to = $cp_array[$this->cp] : $to = 'k';    
        $this->subject = convert_cyr_string($this->subject, $from, $to);    
        $this->body    = convert_cyr_string($this->body   , $from, $to);    
    }    

    function build_part($part)    
    {    
        $attachment  = chunk_split(base64_encode($part['attachment']));    
        $encoding = 'base64';
        if ($part['is_file']) return 'Content-Disposition: attachment; filename="'.$part['name'] .'"' . $this->nl . 'Content-Transfer-Encoding: ' . $encoding . $this->nl . $this->nl . $attachment . $this->nl;
        $ct_id='Content-ID: <'.$part['name'].'>';
        return $ct_id.$this->nl.'Content-Disposition: attachment; name="'.$part['name'] .'"' . $this->nl . 'Content-Transfer-Encoding: ' . $encoding . $this->nl . $this->nl . $attachment . $this->nl;        
    }    

    function build_multipart()    
    {    
        $boundary  = 'b' . md5(uniqid(time()));    
        $multipart = 'Content-Type: multipart/mixed; boundary = ' . $boundary . $this->nl . $this->nl . 'This is a MIME encoded message.' . $this->nl . $this->nl . '--' . $boundary . $this->nl;    
        $multipart .= 'Content-Type: text/';    
        if ($this->html_auto == true) {    
            $pattern = "%</?\w+(\s[^>]*)?>%is";    
            preg_match($pattern, $this->body) == true ? $multipart .= 'html' : $multipart .= 'plain';    
        } else {    
            $this->html == true ? $multipart .= 'html' : $multipart .= 'plain';    
        }    
        $multipart .= '; charset=' . $this->cp . $this->nl . 'Content-Transfer-Encoding: 8bit' . $this->nl . $this->nl . $this->body . $this->nl . $this->nl . '--' . $boundary;    
        $i = 0;    
        $count = sizeof($this->parts);    
        while ($i < $count) {    
            $multipart .= $this->nl . $this->build_part($this->parts[$i]).    
            '--' . $boundary;    
            $i++;    
        }    
        return $multipart .= '--' . $this->nl;    
    }    

    function send()    
    {    
        $this->cp_convert();    
        $headers = '';
        empty($this->from) or $headers .= 'From: ' . $this->from . $this->nl;    
        $i = 0;    
        $count = sizeof($this->headers);    
        while ($i < $count) {    
            $headers .= $this->headers[$i] . $this->nl;    
            $i++;    
        }    
        $headers .= 'MIME-Version: 1.0' . $this->nl;    
        $headers .= $this->build_multipart();    
        $headers = 'Content-Type: text/html; charset=windows-1251
Content-Transfer-Encoding: 8bit
'.$headers;
        return mail($this->to, $this->subject, '', $headers);    
    }    
}    
?>

Использование:
Код

    $mail = new Mail;    
    $mail->subject = htmlspecialchars($MSG['title']);
    $mail->add_header ('X-Priority: '.$MSG['priority']);    

    // добавление вложений
    {
        $mail->add_attachment($folder.$fname,true);
    }

    // замена картинок в письме
    {
        $mail->add_attachment("..".$imgs[$a]);
        $msg=str_replace('src="','src="cid:',$msg);
        $msg=str_replace("src='","src='cid:",$msg);
    }



Оригинал:

Добавлено через 10 минут и 32 секунды
-=Ustas=-, а где скачать эти самые:
include('Mail.php'); 
include('Mail/mime.php');

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  stdMailer.php 11,26 Kb


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
z-END
Дата 12.9.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



-=Ustas=-, а как этот PEAR устанавливать?



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
z-END
Дата 13.9.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



c PEAR разобрался... 
теперь стоит вопрос о том как сменить кодировку на windows1251 или KOI-8 ?
и еще:
Код

$html = "<html><body>Письмо в африку <img src='test.jpg'> </body></html>"; 

$file = DR.'/pictures/test.jpg'; 
$hdrs = array( 
              'From'    => '[email protected]', 
              'Subject' => 'Проверка почты' 
              ); 

$mime = new Mail_mime(); 

$mime->addHTMLImage ($file, 'image/jpeg'); 
$mime->setHTMLBody($html); 

$body = $mime->get(); 
$hdrs = $mime->headers($hdrs); 

А письмо получается:
Цитата
<html><body>=CF=E8=F1=FC=EC=EE =E2 =E0=F4=F0=E8=EA=F3 <img src=3D'test.jpg'=
> </body></html>
--=_3517bacd2833a7d9065a929fe3050783
Content-Transfer-Encoding: base64
Content-ID: <add3e99de2fe9f525d8f6afe533d6929>
Content-Type: image/jpeg;
 name="test.jpg"; 
Content-Disposition: inline;
 filename="test.jpg"; 

/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2JlAGTAAAAAAf/b

<img src=3D'test.jpg'= - это фигня какаято получается ведь? 


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Golda
Дата 14.9.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 26.3.2007
Где: Ариель, Израиль

Репутация: нет
Всего: 42



а header с кодировкой задали? 


--------------------
"For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics
PM MAIL   Вверх
ewolf
Дата 15.9.2007, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 15.8.2006
Где: г. Москва

Репутация: нет
Всего: 18



Еще можно попробовать вот этот скрипт - я его часто использую, работает хорошо
http://xpertmailer.sourceforge.net/

Это сообщение отредактировал(а) ewolf - 15.9.2007, 01:14
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1098 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.