Пишем на PHP: Письма с вложенными файлами (окончание)
Руслан Курепин
http://kurepin.ru
Чтобы совсем уж не размениваться на мелочи, в
следующей функции мы полностью сформируем текст нашего письма. Следите за
мыслью...
Ну вот, собственно, мы и сформировали наше письмо в
переменной $this->mail_body. Что в этой функции
интересного? Да ничего интересного. Можно ее даже не разбирать на
составляющие. Она очень понятна, если ее внимательно
прочесть. Лучше попробуйте создать с ее помощью письмо и
посмотрите, что получится. Результат очень интересно будет сравнить с
табличкой составляющих почтового сообщения, на которую я давал ссылку в
предыдущих главах. Осталось письмо отправить. Ну, это проще
простого: Где-то в глубине наших скриптов присваиваем значения
переменным: $my->mail_from="roma
"; $my->mail_to="roma
"; $my->mail_subj="test message";
и отправляем
письмо с помощью стандартной функции PHP mail().
На этом я заканчиваю повествование об
отправки файлов по e-mail, но убежден, что к этому вопросу еще вернусь.
Так как остался совершенно не доволен качеством рассказа. Придется
переписать функцию mail в удобоваримый формат, но это сделаю чуть позже,
когда сам обкатаю ее и найду все неудобства ее использования.
А
напоследок приведу весь текст со страницы http://www.bryansk.ru/pismo.html, на случай ее пропажи с
указанного URL. Изучайте!
--- Начало цитаты ---
Что есть в письмах кроме
писем?
Много ли можно почерпнуть из обычного письма? Если отправитель
вам давно и хорошо известен, то, вероятно, ничего существенно нового
не узнать, но если отправитель - неизвестный аноним, можно
попробовать определить его географическое положение, реальное имя,
используемое программное обеспечение, имя его компьютера и т.д. Для
этого необходимо всего-то лишь проанализировать заголовок его
письма.
Заголовок письма всегда идет в начале письма. Признаком конца
заголовка является пустая строка. Всё идущее после этой строки
является текстом письма и, как правило, не обрабатывается почтовыми
службами. Заголовок состоит из нескольких полей, а поле, в свое
очередь, - из двух частей: названия и значения, разделяемые между
собой двоеточием, например field:value.
Займемся теперь детальным изучением наиболее часто встречающихся
полей:
Название поля |
Назначение |
Return-Path: |
Служит для указания адреса возврата письма.
Как правило, совпадает с адресом отправителя. Адрес
заключается в угловые скобки. |
Received: |
Содержит путь прохождения письма
по почтовым серверам. Полей обычно несколько и каждое такое
поле обозначает один сервер в маршруте. Серверы указываются в
обратном хронологическом порядке, то есть каждый новый сервер
вставляет свою подпись сверху. Формат таков:
Received: from <домен> - отправитель, by
<домен> - получатель, via <путь> - физический
путь, with <протокол> - почтовый протокол, id
<идентификатор> - идентификатор сообщения у
получателя, for <адрес> - финальный адрес
получателя, ; <дата/время> - время получения
сообщения. Обязательно только указание времени, остальная
информация может быть пропущена, хотя обычно присутствует
большинство из описанных данных. |
Message-ID: |
Уникальный идентификатор сообщения. Как
правило, идентификатор составляется из текущей даты, времени,
адреса компьютера и некоей случайной величины. Записывается
идентификатор в угловых скобках. |
From: |
Автор сообщения. Указывается адрес
электронной почты автора в угловых скобках, но нередко
указывается еще и реальное имя. |
Sender: |
Лицо или служба, отправившая сообщение, в том
случае, если не совпадает со значением поля "From" Довольно
редко встречающееся поле, попадается иногда в различных
спэм-письмах. |
To: |
Основной получатель. Указывается адрес
электронной почты в угловых скобках. Можно указать еще и
реальное имя, которое впрочем, будет с успехом проигнорировано
почтовыми службами. Можно указать несколько получателей через
запятую. |
Cc: |
Carbon Copy. Дополнительные получатели,
синтаксис такой же, как для поля "To". |
Bcc: |
Blind Carbon Copy. Дополнительные получатели,
адреса которых не должны быть видны другим получателям. Очень
полезное поле! Используется когда, например, надо известить
многих лиц об одном и том же, но не нужно, чтобы содержание
вашей адресной книги попало ко всем корреспондентам. Синтаксис
аналогичен полям "To" и "Cc". |
Date: |
Дата написания письма, хотя некоторые системы
выставляют дату отправки письма. В стандартной ситуации это
все-таки дата написания письма, а дата отправки определяется
из первого поля "Received". |
Subject: |
Тема письма. |
MIME-Version: |
Наличие этого поля говорит о том, что текст
письма форматирован в соответствии со стандартом MIME.
Значение поля говорит об используемой версии MIME. Подробное
описание стандарта MIME см. в RFC 1521. Например:
"MIME-Version: 1.0". |
In-Reply-To: |
Ссылка на письмо, ответом на которое является
настоящее письмо. Письма идентифицируются своими уникальными
идентификаторами, проставляемыми в поле
"Message-ID". |
References: |
Ссылки, на другие письма, относящиеся к
данному. Является обобщением поля "In-Reply-To". |
X-Mailer: |
Информация о почтовой программе,
использованной для написания письма. |
Priority: |
Приоритет письма. Бывает "обычным", "срочным"
и "не срочным". Как правило, используются фразы: "Normal",
"Urgent", "Non-urgent". Может оказывать влияние на скорость
обработки и передачи письма различными промежуточными
почтовыми системами. |
X-Priority: |
Тоже приоритет письма, но в отличие от
"Priority" обозначается цифрами. |
Importance: |
Пометка от отправителя получателю о важности
сообщения. Может принимать значения "High", "Normal" или
"Low". В отличие от поля "Priority" никак не влияет на
скорость пересылки. |
Content-Type: |
Формат содержимого письма. Определяется тип
информации в письме и способ ее представления. В частности
задается кодировка письма, если используется какой-либо
национальный набор символов. |
Content-Transfer-Encoding: |
Метод кодирования, используемый в письме,
согласно стандарту MIME. |
Приведенная краткая таблица не претендует на абсолютную полноту.
Существует масса устаревших или, напротив, новых (экспериментальных)
полей заголовка e-mail. Например, Microsoft использует поля
"X-MimeOLE" и "X-MSMail-Priority", которые являются нестандартными.
Строго говоря, все поля, начинающиеся с "X-" (так называемые,
private-поля), не являются стандартными, а используются по
внутрифирменным соглашениям. Существуют редко используемые
стандартные поля, например: "Keywords", "Comments",
"Content-Description" - служащие для описания содержимого письма. Но
в подавляющем большинстве случаев вышеприведенной таблицы вполне
достаточно для прочтения и понимания содержания заголовка. Впрочем,
для полноты картины эту таблицу желательно дополнить более подробным
описанием стандарта MIME (Multipurpose Internet Mail Extensions),
поскольку многие поля так или иначе относятся именно к MIME,
информацию по которому можно найти в RFC 1521 и RFC 1522.
Итак, MIME предназначен для задания способов передачи посредством
электронной почты различной нетекстовой информации, а также больших
объемов информации, которые необходимо посылать в нескольких
письмах, разбив на кусочки. Следует заметить, что под нетекстовой
информацией надо понимать не только бинарные файлы, но и тексты в
нестандартной кодировке, то есть в отличной от ASCII, описанной в
ANSI X3.4-1986.
Одно из основных полей, касающихся MIME, это "Content-Type".
Возможные его значения приведены в таблице.
Название поля |
Назначение |
text |
Текстовая информация в виде набора символов
или описания текста на стандартном языке. |
multipart |
Служит для объединения нескольких частей
(возможно, разных типов) сообщения в одно письмо. |
application |
Служит для пересылки бинарных файлов
приложений или данных посредством электронной
почты. |
message |
Указывает на инкапсуляцию другого
письма. |
image |
Служит для пересылки
изображений. |
audio |
Служит для пересылки звуковой
информации. |
video |
Служит для пересылки
видеоинформации. |
В поле "Content-Type" нужно указать подтип информации. Например,
для поля "text" используются в основном подтипы "plain" -
означающий, что текст обычный и неформатированный, и "html" -
указывающий на то, что сообщение в формате HTML. Если отправляется
сообщение в формате HTML, то правильная почтовая программа создаст
две части письма: в "text/plain" и "text/html", чтобы в случае
непонимания подтипа "html" на получающей стороне не возникло
неудобств. С другой стороны, правильная почтовая программа
получателя должна показать письмо в максимально информативном виде и
поэтому, пропустив "text/plain"-часть сообщения, отобразит
"text/html". В общем случае, текст может быть форматирован любым
способом, понимаемым обеими сторонами. Это декларировано в RFC 1341.
В поле "text" также указывается кодовая таблица. Например:
"Content-type: text/plain; charset=us-ascii".
Для поля "multipart" можно указывать подтипы: "alternative" - на
случай, если несколько частей представляют одно и то же, а надо
выбрать одну из них для отображения; "parallel" - если надо
отобразить части одновременно; "digest" - если каждая часть имеет
тип "message"; и некоторые другие подтипы. Для поля "message"
основной подтип - "rfc822". Еще пара используемых подтипов:
"partial" - для посылки части сообщения и "External-body" - для
передачи, например, объемной информации путем ссылки на внешний
источник данных.
Подтип поля "image" задает графический формат, в котором
пересылается изображение. Основные форматы - jpeg и gif. Поле
"audio" имеет основной подтип "basic". Поле "video" - основной
подтип "mpeg".
Поле "application" имеет основной подтип "octet-stream" в случае
обычных бинарных данных. Если посылается файл известного типа, то
указывается его тип. Так, для MS Word документов Outlook пишет
"application/msword", а для MS Excel "application/vnd.ms-excel".
В соответствии с RFC 822, все письма, по умолчанию, передаются
простым текстом в кодировке US-ASCII, что соответствует
"Content-type: text/plain; charset=us-ascii".
Следующее важнейшее поле, касающееся MIME это
"Content-Transfer-Encoding". Служит оно для указания способа
кодирования, в случаях, когда посылаемое письмо содержит что-либо не
умещающееся в рамках US-ASCII. Стандартизованы следующие
способы:
Кодировка |
Примечание |
7bit |
Считается, что длина одной строки сообщения
не более 1000 символов, а сами строки состоят только из
US-ASCII-символов. |
8bit |
Строки также ограничены по длине, но могут
использоваться символы из старшей половины кодовой
таблицы. |
binary |
Нет ограничений ни на длину, ни на
содержание. |
base64 |
Письмо кодировано в соответствии со
стандартом "base64". |
quoted-printable |
Письмо кодировано в соответствии со
стандартом "quoted-printable". |
Подробно касаться методов "quoted-printable" и "base64", равно
как "uuencoding" и некоторых других, в этой статье касаться не
станем, поскольку тема это довольно объемистая. Разработчики
почтовых систем могут использовать свои (оригинальные) способы
кодирования, с тем лишь условием, чтобы принимающая сторона смогла
корректно декодировать информацию.
Вторая задача MIME - это стандартизация разбиения больших писем
на несколько кусочков. Для этого в поле "Content-Type" после
значения "multipart/<subtype>" указывается строка - уникальный
ограничитель фрагментов "boundary=<boundary string>". А затем
перед каждым фрагментом пишется эта строка, предваренная двумя
минусами, а в конце фрагментации еще одна, завершающаяся такими же
двумя минусами.
Не вдаваясь в дальнейшее описания стандартов, коснемся нескольких
практических вещей. Как добраться до заголовка письма?
- В программах MS Outlook Express и MS Internet Mail, необходимо
нажать правую кнопку мыши, когда курсор указывает на сообщение, и
выбрать пункт "Properties" (либо в меню "File" также выбрать
"Properties"). В появившемся диалоге надо отметить вторую закладку
"Details", а потом нажать кнопку "Message Source". Появится окно,
содержащее то, что нас интересует.
- В программе Netscape Mail в меню "Options/Show Headers" нужно
отметить "All", и заголовки писем предстанут во всей своей красе.
- В программе Netscape Messenger в меню "View/Headers" надо
также выбрать "All".
- В программе The Bat надо в меню "Вид" отметить "Служебная
информация".
В других почтовых программах читатель может попытаться разыскать
заголовок письма самостоятельно. Скорее всего, ему это удастся.
Маленькое резюме. Что же действительно интересного можно увидеть
в заголовке письма?
- Полный маршрут прохождения письма, включая время отправления в
полях "Received". Например, таким образом вы сможете выяснить, по
вине какого сервера ваше письмо задержалось на целых полчаса.
- Тип почтовой программы и операционной системы отправителя в
поле "X-Mailer".
- Возможно, имя компьютера отправителя по суффиксу поля
"Message-Id".
- Возможно, IP-адрес компьютера отправителя, по полю
"Message-Id" или по первому полю "Received".
- Список всех получателей этого письма по полю "Cc". Нередко
люди, посылая массовое сообщение, например, об аварии сервера,
рассылают копию письма по всем, указанным в их адресной книге.
Таким образом, любой получатель сможет ознакомиться с ее
содержимым. Более грамотный подход заключается в использование
поля "Bcc". Тогда одно письмо, как и в первом случае, уйдет ко
многим адресатам, но весь список рассылки они не получат.
- Вероятное географическое местоположение отправителя по
часовому поясу, прописанному в поле "Date", и по анализу адресов в
поле "Received".
Но самое главное - изучая заголовки, приходящих писем, вы
разберетесь в механизме работы одной из старейших интернет-служб.
Чего я вам и желаю! | --- Конец
цитаты ---
С наступающим вас, друзья мои!..

Реклама в журнале
|