Советы по PHP : Отправка писем при помощи PHP : Прикрепление файла
смотрим также
- BIM-решение для МКЭ анализа . Манчестер сити намерен приобрести коке и погба летом манчестер сити трансферы 2015 лето.
Материал из Справочник Web-языков
Отправка писем при помощи PHP: Прикрепление файла
Письмо, содержащее прикрепленный файл, несколько отличается от простого. В нем добавляются некоторые заголовки, и немного меняется само построение, хотя несомненно само письмо остается текстовым файлом. Но давайте все по порядку.
Одна из особенностей - наличие заголовка Mime-Version.
Этот заголовок указывает стандарт, которому соответствует тело сообщения.
Сообщения, соответствующие MIME обязаны содержать такое поле заголовка со следующим текстом:
MIME-Version: 1.0
Если мы хотим отослать письмо с прикрепленными файлами, то необходимо использовать заголовок
Content-type: multipart/mixed
который обозначает, что письмо состоит из нескольких частей, каждая из которых содержит свой заголовок Content-type.
Для обозначения границы этих частей необходимо использовать параметр boundary, который еще называется маркером границы.
Значением этого параметра может служить любая строка. Но надо учесть, что она должна быть уникальной и не встречалась в теле письма. Иначе письмо может быть неправильно разбито на части.
From: "Uspenskii Evgeny" <[email protected]> To: [email protected] Subject: Hello Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="spravkaweb-12345"
При разделении письма на части перед маркером должны стоять два знака дефиса.
А последний маркер, который обозначает конец письма, должен содержать в конце два знака дефиса.
Для каждой части необходимо установить свои заголовки.
После заголовков необходимо поставить два знака перевода строки.
From: "Uspenskii Evgeny" <[email protected]> To: [email protected] Subject: Hello Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="spravkaweb-12345" --spravkaweb-1234 Content-type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Hi! Here's that my file! --spravkaweb-1234 Content-Type: application/x-rar-compressed; name="file.rar" Content-Transfer-Encoding:base64 Content-Disposition:attachment UmFyIRoHAM+QcwAADQAAAAAAAABvYXQg ...... spravkaweb-1234--
Если у нас идет часть с текстом, то надо заголовок 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. Преобразовать файл в этот формат можно при помощи PHP-функции 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 - путь к файлу, который надо прикрепить к письму (это может быть имя файла, выбранного в поле ) */ function sendMail($to,$from_mail,$from_name,$subject,$message,$file_name) { $bound="spravkaweb-1234"; $header="From: '$from_name' 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-1251'\n"; $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, $body, $header)) { echo "Письмо было успешно отправлено! ";} else {echo "Сообщение не отправлено! ";};};