Использование заголовка Content-Type, таким образом, почти что "черная магия", так как браузеры не руководствуются каким-либо стандартом при работе с различными типами MIME. Но этот метод доказал право на жизнь при написании intranet-приложений, где есть возможность ограничиться узким набором браузеров. 
24.4. Электронная почта с вложениями
Отправка простой почты с помощью PHP - дело несложное. Функция mail сама справляется с различными деталями протокола, но если разработчику необходимо отправить вложения, следует ознакомиться с документами RFC, в частности с RFC 1341, в котором описывается протокол MIME (Multipurpose Internet Mail Extensions). С ним можно познакомиться на Web-узле www.faqs.org по адресу <http://www. faqs.org/rfcs/rfc1341.html>, но здесь будет продемонстрирована несколько наивная реализация.
Несколько примеров реализации отправки почты можно найти в Internet. Обратитесь к сетевой секции, которую ведет Девид Скляр (David Sklar) (<http://px. sklar.com/section.html?id=10>). Большая часть этой задачи реализована с помощью класса, при этом сделана попытка использовать любой аспект стандарта.
В листинге 24.6 приводится программный код, который отправляет несколько вложений с помощью двух простых функций. Этот пример можно рассматривать в качестве основы изучения процесса и по необходимости расширения ее функциональности.
Сети:HTTP-аутентификация,Управление кэш-памятью браузера,Установка типа документа
** ARRAY attachment ** Вывод: none
** Описание: отправление вложений по почте, ** массив является двумерным. Каждый ** элемент является ассоциативным массивом ** с элементами type, name и content.
*/
function mailAttachment($to, $from, $subject, $attachment)
{
//добавить заголовок from
$headers = "From: $fromrn";
//задать версию MIME 1.0
$headers .= "MIME-Version: 1.0rn";
//различные части требуют разной обработки
if(count($attachment) > 1)
{
// несколько вложений требует специальной обработки
$boundary = uniqid("COREPHP");
$headers .= "Content-Type: multipart/mixed" .
"; boundary = $boundaryrnrn" . "Это сообщение в кодировке MIME.rnrn" .
"--$boundary"; foreach($attachment as $a)
{
$headers .= "rn" .
makeAttachment($a) . "--$boundary";
}
$headers .= "--rn";
}
else
{
$headers .= makeAttachment($attachment[0]);
}
//отправить сообщение
mail($to, $subject, "", $headers);
}
//добавить объясняющее сообщение
$attach[] = array("content"=>"Это листинг 24.6",
"type"=>"text/plain"); // добавить сценарий в список вложений $fp = fopen(_FILE_, "r");
$attach[] = array("name"=>basename(_FILE_),
"content"=>fread($fp, filesize(_FILE_)),
"type"=>"application/octet-stream");
fclose($fp);
// Отправить сообщение пользователю root mailAttachment("root@localhost",
"httpdolocalhost",
"Листинг 2 4.6",
$attach); print("Mail sent!<br>n");
?>
</body> </html>
Функция mailAttachment собирает составляющие части сообщения MIME, которые отправляются в четвертом аргументе функции mail, обычно используемом для задания заголовков. В сообщении MIME эта область используется как для заголовков, так и для вложений. После того как отправлены обычные заголовки From, отправляется заголовок MIME-Version. Несмотря на то что существует только одно вложение, должна быть создана граничная строка. Она предназначена для разделения вложений. Пытаясь избежать граничного значения, которое само по себе может оказаться сообщением, воспользуемся функцией uniqid.
Все вложения окружаются границами, которые обычно начинаются с двух тире. Само по себе вложение подготавливается функцией makeAttachment. Для каждого вложения требуются заголовки Content-Type и Content-Transfer-Encoding. Тип содержимого зависит от самого вложения. Если отправляется изображение, тип должен быть image/jpg. Это те же коды, которые описывались ранее, но в связи с протоколом HTTP. Для простоты эта функция всегда кодирует вложения с помощью кодировки base64, которая позволяет преобразовать двоичную кодировку файлов в 7-битовый код ASCII. Так можно предотвратить их разрушение при передаче через серверы, которые принимают только 7-битовые коды ASCII. Как можно предположить, текстовым файлам кодировка не требуется, полные реализации кодируют вло­жения на основании типа содержимого.
Внимательно просмотрите все собранное сообщение. Попробуйте отправить сообщение самому себе. В ОС Unix сам файл можно просмотреть в каталоге /var/spool/mail перед его прочтением или в каталоге ~/Mail/received после прочтения.