Создание и отправка почтовых сообщений

В PHP есть лишь самое минимальное и низкоуровневое средство для работы с почтой - функция mail. Потом, правда, появилась еще mb_send_mail (для мультибайтных кодировок), которая не столько помогла, сколько внесла сумятицу. Формировать тело письма изначально предлагалось самостоятельно, что является далеко не тривиальной задачей, особенно если требуется multipart-сообщение с аттачами. Кроме этого желательно, чтобы письмо соотвествовало установленным стандартам. Тот факт, что современные почтовые клиенты великодушно не обращают внимания на небольшие несоответсвия стандартам, отнюдь не означает, что они будут делать это и в будущем.

В TAO существет мощное средство для создания и отправки почтовых сообщений. Итак, последовательно приводим примеры использования:

Создание простого письма

Core::load('Mail');

$mail = Mail::Message()
                ->subject('Привет!')
                ->from('info@mysite.com')
                ->to('infо@miсrоsоft.соm')
                ->text('Пришлите нам, плиз, исходники WindowsXP');

Это будет простое text/plain письмо. Но при этом в полном соответствии стандартам. Однако, несерьезно посылать письмо в текстовом формате. Хотим послать в HTML. Для этого вместо метода text воспользуемся методом html.

Создание HTML письма

Core::load('Mail');

$mail = Mail::Message()
                ->subject('Привет!')
                ->from('info@mysite.com')
                ->to('infо@miсrоsоft.соm')
                ->html('<html><body>Пришлите нам, плиз, исходники WindowsXP</body></html>');

В доказательство серьезностей наших намерений мы хотим аттачем прислать красивую картинку. Для этого нам нужно создать multipart-сообщение.

Создание multipart/mixed письма

Core::load('Mail');

$mail = Mail::Message()
                ->subject('Привет!')
                ->from('info@mysite.com')
                ->to('infо@miсrоsоft.соm')
                ->multipart_mixed()
                ->html_part('<html><body>Пришлите нам, плиз, исходники WindowsXP</body></html>')
                ->file_part('./image/rose.jpg');

Но нам и этого мало. Мы хотим, чтобы красивая картинка была не просто аттачем, а непосредственно отображалась в теле HTML-сообщения. Для этого, во-первых, нужно, чтобы письмо было multipart/related. Это просто: воспользуемся методом multipart_related вместо multipart_mixed. А во-вторых, нужно указать дополнительные параметры аттача - Content-ID и Content-Disposition. А вот с этим сложнее. Дело в том, что метод file_part создан для упрощения процесса и обладает ограниченным функционалом. Поэтому в этом примере воспользуемся более низкоуровневым средством для создания части multipart-сообщения.

Создание multipart/related письма

Core::load('Mail');

$mail = Mail::Message()
                ->subject('Привет!')
                ->from('info@mysite.com')
                ->to('infо@miсrоsоft.соm')
                ->multipart_related()
                ->html_part('<html><body>Пришлите нам, плиз, исходники WindowsXP<br /><img src="cid:rose" /></body></html>')
                ->part(
                        Mail_Message::Part()
                                ->file('./image/rose.jpg')
                                ->content_id('<rose>')
                                ->content_disposition('inline')
                );

Создание вложенных писем

Иногда возникает задача сформировать письмо довольно сложной структуры. Например письмо со вложенными картинками (отображаемые в письме) и приклепленными файлами. Возникает путаница какой тип выставить письму, с одной стороны multipart/related т.к. у нас html письмо со строенными картинками, с другой multipart/mixed т.к.

у нас есть прикрепленный файлы. Правильный ответ будет: и то и другое.

Core::load('Mail');

$mail = Mail::Message()
    ->multipart_mixed()
    ->subject('Тест')
    ->from('info@test.ru')
    ->part(Mail::Message()
    	->multipart_related()
    	->html_part('Тест')
        //инлайн файлы и т.д.
    )
    ->file_part('aa.gif')
    ->to('info@mysite.ru');

Структура может быть и более сложной, например mixed -> alternative -> related и т.д.

Отправка письма

Чтобы отправить созданное почтовое сообщение, необходимо просто вызвать его метод send:

$mail->send();
Метки: Почта
19.02.2014
Все статьи