Письмо, содержащее прикрепленный файл, несколько отличается от простого. В нем добавляются некоторые заголовки, и немного меняется само построение, хотя несомненно само письмо остается текстовым файлом. Но давайте все по порядку.
Одна из особенностей - наличие заголовка mime-version. Этот заголовок указывает стандарт, которому соответствует тело сообщения. Сообщения, соответствующие mime обязаны содержать такое поле заголовка со следующим текстом: mime-version: 1.0
Если мы хотим отослать письмо с прикрепленными файлами, то необходимо использовать заголовок content-type: multipart/mixed, который обозначает, что письмо состоит из нескольких частей, каждая из которых содержит свой заголовок content-type. Для обозначения границы этих частей необходимо использовать параметр boundary, который еще называется маркером границы. Значением этого параметра может служить любая строка. Но надо учесть, что она должна быть уникальной и не встречалась в теле письма. Иначе письмо может быть неправильно разбито на части.
При разделении письма на части перед маркером должны стоять два знака дефиса. А последний маркер, который обозначает конец письма, должен содержать в конце два знака дефиса. Для каждой части необходимо установить свои заголовки. После заголовков необходимо поставить два знака перевода строки.
Если у нас идет часть с текстом, то надо заголовок content-transfer-encoding присвоить значение quoted-printable, либо 7bit, либо 8bit. Для части с файлом этот заголовок должен быть равен base64.
Заголовок content-disposition, присутствующий во второй части, указывает, как почтовой программе следует отобразить данную часть письма. Он может принимать значение attachment (этот участок не является частью письма, а просто прикреплен к нему в виде файла) и inline (включение, которое используется непосредственно в письме, например, картинка, вставляемая в html).
В первой части заголовком content-type: text/plain; charset="windows-1251"
указали, что это простой текст с кодировкой windows. Во второй же части заголовком content-type: application/x-rar-compressed; name="file.rar"
указали, что тип файла - rar-архив, а имя файла - file.rar. Если отправляем gif-картинку, его content-type будет выглядеть: content-type: image/gif; name="file.gif"
В случае, если заранее не известно, какой тип файла отправляем, или формат файла не является стандартным, следует заголовку content-type присвоить значение application/octet-stream. content-type: application/octet-stream; name="file.dat"
Прикрепленные файлы должны быть размещены в письме в формате base64. Преобразовать файл в этот формат можно при помощи функции base64_encode(): // Открываем файл для чтения в бинарном формате $file=fopen("file.zip", "rb"); // Считываем его в строку $str_file $str_file=fread($file,filesize("file.zip")); // Преобразуем эту строку в base64-формат $str_file=base64_encode($str_file);
Теперь переменную $str_file, которая содержит файл, можно вставлять в письмо.
Для окончательного закрепления материала напишем функцию, которая отправляет письмо в html-формате по указанному адресату с прикрепленным файлом:
/* $to - адрес получателя письма $from_mail - адрес отправителя письма $from_name - имя отправителя письма $subject - тема письма $message - само сообщение в html-формате $file_name - путь к файлу, который надо прикрепить к письму (это может быть имя файла, выбранного в поле <input type=file name=file_name>) */ function sendmail($to,$from_mail,$from_name,$subject,$message,$file_name) { $bound=spravkaweb-1234; $header=from: $from_name <$from_mail>n; $header.=to: $ton; $header.=subject: $subjectn; $header.=mime-version: 1.0n; $header.=content-type: multipart/mixed; boundary=$bound; $body=nn--$boundn; $body.=content-type: text/html; charset=windows-1251n; $body.=content-transfer-encoding: quoted-printablenn; $body.=$message; $file=fopen($file_name,rb); $body.=nn--$boundn; $body.=content-type: application/octet-stream;; $body.=name=.basename($file_name).n; $body.=content-transfer-encoding:base64n; $body.=content-disposition:attachmentnn; $body.=base64_encode(fread($file,filesize($file_name))).n; $body.=$bound--nn; if(mail($to, $subject, $message, $header)) { echo <center>Письмо было успешно отправлено!</center>; } else { echo <center>Сообщение не отправлено!</center>; }; };