Уроки программирования на 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
|
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

Я расскажу почему не аттачится
После строки 100 надо написать
100 $this->sBody .= strtr($this->sHtmlTemplate,$aFields);
101 $this->sBody .= "\r\n";
102 foreach ($this->aAttaches as $sAttach)
....
Выявил, что первый аттач пролетает, а второй - приаттачивается.
Автору еще раз респект, и побольше таких подлечек =)