Главная > Заметки, Сделай сам, Статьи > Отправка почты с вложениями (Часть первая)

Отправка почты с вложениями (Часть первая)

В данной статье я расскажу о более правильном, но и о более сложном варианте отправки писем с вашего сайта. Правильность заключается в оптимизации нагрузки на сервер и ваш сайт, а сложность — в использовании множества методов и использование полного метода отправки почты (вложения, текстовые, HTML и смешанные письма, испльзование MySQL и CRON).

Для наших целей понадобится локальный сервер DENWER или хостинг с поддержкой PHP, MySQL, Cron.

Своими словами я расскажу, как я понимаю, что такое письма. Письмо, это текстовый документ, даже включающий в себя разного рода вложения. Текстовый вариант, потому что в нем все можно прочитать обычным блокнотом, если сохранить письмо на диск из TheBat или Outlook Express. Смысл шифровать письма — нет, это открытый «протокол» или как говорят стандарт.

Все письма в мире делятся на 3 вида:
1. Текстовые письма, которые легко читаются как в консоли любой ОС так и интерпретаторами — почтовыми клиентами
2. HTML письма, которые тяжело читать в консоли, но удобно читать в почтовых клиентах, поддерживающих HTML
3. Смешанные письма, письма, которые будут читаться и в консоли, как текст, и в почтовом клиенте как HTML письмо

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

Какая структура письма (в кратце):

1. В начале письма при его формировании указываются:
a. Адрес получателя (To: User name user@name.ru)
b. Тема письма: (Subject: Привет Народ!)
2. Далее идут заголовки, говорящие почтовым клиентам, что это «модное» письмо, которое может содержать файлы, текст, хтмл.

MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=”КЛЮЧ”

Где: — первая строка как раз говорит о типе письма (содержит вложения любого типа) — вторая — тип контента письма, и ключ, разделяющий элементы письма

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

From: "=?koi8-r?B?4c7E0sXKICwerDhzsnLyc4=?=" <xxxxx@xxxx.ru>
To: "=?koi8-r?B?8s/Nwc4g68wetnMwc7P1w==?=" <yyyy@yyyyyyy.ru>
CC: "=?koi8-r?B?8s/Nwc4g88XSerx8XF18tsdfgneIOvJzMHOz9c=?=" <zzzzz@zzz.ru>
Subject: =?koi8-r?B?Rnc6INLFy9fJ2asdfaasdsdgasd7HwSdfsaiZWwucnUgIMTM0Q==?=
Date: Thu, 18 Nov 2004 07:21:04 +0500
MIME-Version: 1.0
Content-Type: multipart/related;
	type="multipart/alternative";
	boundary="----=_NextPart_000_0018_01C4CD3F.29FB8640"

Где:
1. От кого (электронный адрес)
2. Кому (электронный адрес)
3. Кому копию направить (электронный адрес)
4. Тема сообщения (текст)
5. Дата отправки
6. Тип письма
7. Тип контента письма с КЛУЧОМ частей письма

Не обращайте внимания на строки вида:

"=?koi8-r?B?4c7E0sXKICwerDhzsnLyc4=?=

Это кодированные в BASE64 названия, которые можно получить следующим методом:

function encodeString($header)
	{
	return "=?windows-1251?B?".base64_encode($header)."?=";
	}

Соответственно изменив кодировку на KOI-8. Но сейчас кои-8 не актуально использовать, я лично использую windows-1251 кодировку. Она работает, поддерживается всеми почтовыми клиентами и вообще, с ней меньше всего проблем.

Далее в письме может быть следующий блок или несколько блоков разного содержания:

------=_NextPart_000_0018_01C4CD3F.29FB8640
Content-Type: image/gif; name="Ug_logo1.gif"
Content-Transfer-Encoding: base64
Content-ID: <001701c4cd15$411c5680$3c6b8cd5@u4d3l3>
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
Mi5COjZOQj5SRkJWSkZeUk5WTkpiWlZuZl52a
------=_NextPart_000_0018_01C4CD3F.29FB8640--

Это является частью письма как вложение. Посмотрите выше, там, где был указан ключ:

Content-Type: multipart/related; type="multipart/alternative";
	boundary="----=_NextPart_000_0018_01C4CD3F.29FB8640"

Вот этот ключ используется для разделения частей письма таких как: текст обычный, текст в формате HTML, вложения. Представим, что у нас есть письмо со следующим описанием его контента:

MIME-Version: 1.0
Content-Type: multipart/related;
	type="multipart/alternative";
	boundary="mykey"

То, чтобы отделить 2 части письма текстовое и HTMLльное будет выглядеть все это следующим образом:

Текстовый вариант:

--mykey
Content-Type: text/plain; chareset=”windows-1251”
Content-Transfer-Encoding: quoted-printable
Здесь какой то текст, это текстовый вариант письма
--mykey—

и HTML:

--mykey
Content-Type: text/html; chareset=”windows-1251”
Content-Transfer-Encoding: quoted-printable
<html>
<head></head>
<body>
<p>Здесь какой то текст, это <b>вариант HTML</b></p>
</body>
</html>
--mykey--

А вложение:

--mykey
Content-Type: image/gif;
	name="Ug_logo1.gif"
Content-Transfer-Encoding: base64
Content-ID: <001701c4cd15$411c5680$3c6b8cd5@u4d3l3>
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
TlRRTlZSUFeXGNgXmRhXmZiYGViYGdkYmhlY2pnZWxpZm5q
Mi5COjZOQj5SRkJWSkZeUk5WTkpiWlZuZl52a
--mykey--

Вот в принципе и все. Содержание писем может меняться в зависимости от добавленных параметров в него или его блоков, а так то что я описал, это стандарт для обычных писем, тут главное запомнить — конструировать письмо будете Вы сами, т.е. Вам не придется что-то парсить или обрабатывать для получения нужного результата. Как Вариант изучения разного рода структур писем — отправляйте самим себе разные письма, нагружая их разной информацией, и вы поймете, например как сделать письма с высоким приоритетом, паркованные письма и т.д.

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

Заметки, Сделай сам, Статьи , ,