Отправка почты с вложениями (Часть первая)
В данной статье я расскажу о более правильном, но и о более сложном варианте отправки писем с вашего сайта. Правильность заключается в оптимизации нагрузки на сервер и ваш сайт, а сложность — в использовании множества методов и использование полного метода отправки почты (вложения, текстовые, 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--
Вот в принципе и все. Содержание писем может меняться в зависимости от добавленных параметров в него или его блоков, а так то что я описал, это стандарт для обычных писем, тут главное запомнить — конструировать письмо будете Вы сами, т.е. Вам не придется что-то парсить или обрабатывать для получения нужного результата. Как Вариант изучения разного рода структур писем — отправляйте самим себе разные письма, нагружая их разной информацией, и вы поймете, например как сделать письма с высоким приоритетом, паркованные письма и т.д.
В следующей статье будет рассказано о создании механизма о подготовке данных для отправки, и постановление в очередь, дабы не нагружать сервер.
Последние комментарии