Уроки программирования на PHP. Отправка email с вложениями

Отправка E-mail - довольно частая задача, но у многих, особенно начинающих, она вызывает трудности. Предлагаю свой вариант решения данной проблемы.

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

Не будем рассматривать устройство и прицип работы самого класса, сейчас это ни к чему. Лучше я покажу как им пользоваться. Это очень просто :) Рассмотрим на конкретных примерах.

Пример первый. Нужно отправить простое текстовое сообщение (plain/text)

Создаем экземпляр класса

$Message = new Mailer();

От кого. Указывам свой адрес

$Message->from    = 'От меня <ot@menya.com>';

Кому. Указываем адрес получателя

$Message->to      = 'vasya@pupkin.ru';

Тема письма

$Message->subject = 'Превед кросавчег!';

Текст письма

$Message->text    = 'Привет Вася';    

Отправка

$Message->Send();   

Вот и всё, проще некуда :) Следующая задача - отправить сообщение в html-формате с парой картинок.

В начале всё тоже самое:

$Message = new Mailer();
$Message->from    = 'Ot Menya <ot@menya.com>';
$Message->to      = 'vasya@pupkin.ru';
$Message->subject = 'Превед кросавчег!';

А вот текст письма помещаем в свойство "html", где уже допускается html-форматирование, но только то, что находится между тегами <body>. Тегов <title>, <header> <html> и т.д. быть не должно

$Message->html    = '<h1>Привет Вася!</h1>
                     <p>Ты редиска, нехороший человек :)<p>
                     <img src="image_1.jpg" />
                     <img src="image_2.jpg" />';

Можно сделать html-шаблон с определенным оформлением, включая css-стили, а затем использовать его в своих письмах.

$Message->SetTemplate('template_name.tpl');

Прикрепляем две картинки

$Message->Attach('image_1.jpg','image/jpeg');
$Message->Attach('image_2.jpg','image/jpeg');

Здесь 'image/jpeg' - это mimetype файла, проще говоря тип файла. Список наиболее часто стречающихся типов файлов смотрите здесь. Конечно, можно было сделать автоматическое определение MimeType непосредственно внутри класса, но я посчитал это излишеством.

Отправка

$Message->Send();   

Ну и напоследок пример простой отправки текстового сообщения с прикрепленным архивом.

$Message = new Mailer();
$Message->from    = 'Ot Menya <ot@menya.com>';
$Message->to      = 'vasya@pupkin.ru';
$Message->subject = 'Получи архивчег';
$Message->Attach('archive.jpg','application/zip');

$Message->Send();

Класс «Mailer»

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
<?php

// Класс для отправки почтовых сообщений
class Mailer
{
var
$subject;       // (string) Тема
var $text;          // (string) Текст сообщения (txt-вариант)
var $html;          // (string) Текст сообщения (html-вариант)
var $from;          // (string) От кого
var $to;            // (string) Кому
var $charset;       // (string) Кодировка (по умолчанию Windows-1251)

var $sHeaders;       // (string)
var $sBody;          // (string)
var $sContentType;   // (string)
var $sHtmlTemplate;  // (string)
var $sBoundary;      // (string)
var $aAttaches;      // (array)

// Конструктор класса
function Mailer()
         {
         
$this->charset      = 'Windows-1251';
         
$this->aAttaches     = array();
         
$this->sBoundary     = '----'.substr(md5(uniqid(rand(),true)),0,16);
         
$this->sHtmlTemplate = '<html><head><title>{title}</title></head><body>{body}</body></html>';
         }

// Добавить заголовок
function DoHeader($sHeader)
         {
         
$this->sHeaders .= $sHeader."\r\n";
         }

// Прикрепить файл
function Attach($sPath,$mimeType)
         {
         if (
file_exists($sPath))
            {
            
$sName=basename($sPath);
            
$sAttach ="Content-Type: $mimeType; name=\"$sName\"\r\n";
            
$sAttach.="Content-Disposition: attachment; filename=\"$sName\"\r\n";
            
$sAttach.="Content-Transfer-Encoding: base64\r\n";
            
$sAttach.="\r\n";
            
$sAttach.=base64_encode(file_get_contents($sPath))."\r\n";
            
$this->aAttaches[] = $sAttach;
            }
         }

// Добавить HTML
function AddHtml($sHtml)
         {
         
$this->html.=$sHtml."\r\n";
         }

// Установить шаблон
function SetTemplate($sPath)
         {
         if (
file_exists($sPath)) $this->sHtmlTemplate = file_get_contents($sPath);
         }
// Отправить
function Send()
         {
         
$iCountAtt=count($this->aAttaches);
         
$this->sHeaders ="From: {$this->from}\r\n";
         
$this->sHeaders.="MIME-Version: 1.0\r\n";
         if (!
$this->html && !$iCountAtt)
            {
            
$this->sHeaders.='Content-Type: text/plain; charset='.$this->charset."\r\n";
            
$this->sBody = $this->text;
            }
         elseif (
$this->html && !$iCountAtt)
                {
                
$this->sHeaders.='Content-Type: text/html; charset='.$this->charset."\r\n";
                
$aFields=array();
                
$aFields['{title}'] = $this->subject;
                
$aFields['{body}']  = $this->html;
                
$this->sBody = strtr($this->sHtmlTemplate,$aFields);
                }
         elseif (!
$this->html && $iCountAtt)
                {
                
$this->sHeaders.="Content-Type: multipart/mixed; boundary=\"{$this->sBoundary}\"\r\n";
                foreach (
$this->aAttaches as $sAttach)
                        {
                        
$this->sBody .= "--{$this->sBoundary}\r\n";
                        
$this->sBody .= $sAttach;
                        }
                
$this->sBody .= "--{$this->sBoundary}--\r\n";
                }
         elseif (
$this->html && $iCountAtt)
                {
                
$this->sHeaders.="Content-Type: multipart/mixed; boundary=\"{$this->sBoundary}\"\r\n";
                
$this->sBody .= "--{$this->sBoundary}\r\n";
                
$this->sBody .= "Content-Type: text/html; charset={$this->charset}\r\n";
                
$this->sBody .= "Content-Transfer-Encoding: 8bit\r\n";
                
$this->sBody .= "\r\n";
                
$aFields=array();
                
$aFields['{title}'] = $this->subject;
                
$aFields['{body}']  = $this->html;
                
$this->sBody .= strtr($this->sHtmlTemplate,$aFields);
                foreach (
$this->aAttaches as $sAttach)
                        {
                        
$this->sBody .= "--{$this->sBoundary}\r\n";
                        
$this->sBody .= $sAttach;
                        }
                
$this->sBody .= "--{$this->sBoundary}--\r\n";
                }
         @
mail($this->to, $this->subject, $this->sBody, $this->sHeaders);
         }

}
// End of class Mailer

/*
© 2006 Сеник Алексей Владимирович aka MrSlim
*/

?>


MimeTypes

application/msword                    doc
application/octet-stream            bin dms lha lzh exe class so dll
application/ogg                            ogg
application/pdf                            pdf
application/rar                            rar
application/x-javascript            js
application/x-shockwave-flash            swf
application/x-tar                    tar
application/xml                            xml xsl
application/zip                            zip
audio/midi                            mid midi kar
audio/mpeg                            mpga mp2 mp3
audio/x-wav                            wav
image/bmp                            bmp
image/gif                            gif
image/jpeg                            jpeg jpg jpe
image/png                            png
text/css                            css
text/html                            html htm
text/php                            php php3 php4 phtml
text/plain                            asc txt
text/rtf                            rtf
text/xml                            xml
video/mpeg                            mpeg mpg mpe
video/quicktime                            qt mov
Автор: MrSlim

Комментарии

Арман (добавлено 16 января 2008 г. в 18:30)
большое спасибо за класс, очень пригодился. Столько времени сэкономил. Уважаю!
Цитировать
Руся (добавлено 30 августа 2007 г. в 02:09)
Молодец! Но я это сам знал!
Цитировать
html (добавлено 26 августа 2007 г. в 23:06)
действительно аттачится второй файл, а первый нет
Цитировать
PPS (добавлено 10 августа 2007 г. в 19:09)
Автору респект. За стиль программирования - 5+

Я расскажу почему не аттачится
После строки 100 надо написать

100 $this->sBody .= strtr($this->sHtmlTemplate,$aFields);
101 $this->sBody .= "\r\n";
102 foreach ($this->aAttaches as $sAttach)
....

Выявил, что первый аттач пролетает, а второй - приаттачивается.

Автору еще раз респект, и побольше таких подлечек =) smile
Цитировать
Алексей Сеник (добавлено 2 августа 2007 г. в 20:11)
А поподробнее? ;)
Цитировать

Добавить комментарий




:smile1: :smile2: :smile3: :smile4: :smile5: :smile6: :smile7: :smile8: :smile9: :smile10: :smile11: :smile12: :smile13: :smile14: :smile15: :smile16: :smile17: :smile18:


Сайт для умных людей, логические игры, задачи
xNova - Браузерная космическая игра
Новости современных технологий
Яндекс цитирования Rambler's Top100 Рейтинг@Mail.ru
Реклама: