Справочник
WEB - языков

www.spravkaweb.ru Rambler's Top100
 Вы находитесь: Главная/Советы/Отправка писем при помощи PHP.Прикрепление файлаРаспечатать 
Разделы
Новости
Сразу все
HTML
JavaScript
VBScript
CSS
Flash
Perl
PHP
MySQL
SSI
VRML
Дополнительно
Советы
Download
Форум
Гостевая
Ссылки
Написать мне
Поиск:
Рассылки
Subscribe.Ru:

Советы

<--Назад | Вернуться к списку | Дальше-->
Отправка писем при помощи 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. Преобразовать файл в этот формат можно при помощи функции 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: $to\n";
  $header.="Subject: $subject\n";
  $header.="Mime-Version: 1.0\n";
  $header.="Content-Type: multipart/mixed; boundary=\"$bound\"";
  $body="\n\n--$bound\n";
  $body.="Content-type: text/html; charset=\"windows-1251\"\n";
  $body.="Content-Transfer-Encoding: quoted-printable\n\n";
  $body.="$message";
  $file=fopen($file_name,"rb");
  $body.="\n\n--$bound\n";
  $body.="Content-Type: application/octet-stream;";
  $body.="name=\"".basename($file_name)."\"\n";
  $body.="Content-Transfer-Encoding:base64\n";
  $body.="Content-Disposition:attachment\n\n";
  $body.=base64_encode(fread($file,filesize($file_name)))."\n";
  $body.="$bound--\n\n";
  if(mail($to, $subject, $body, $header)) {
    echo "<center>Письмо было успешно отправлено!</center>";
  } else {
    echo "<center>Сообщение не отправлено!</center>";
  };
};
Комментарии
alex
Товарищи, после опробы этой функции да, файл начал прикрепляться к письму, тока имя файла выглядит так: image.gifContent-Transfer-Encoding:base64Content-Disposition:attachment

При открытии он выдаёт ошибку. Никак не могу понять, что не так. Подскажите, пожалуйста


Имя:
Майл:
Коментарий:
Наверх / К оглавлению
 
Что нового:
05.07.2004
  • В разделе PHP добавлены некоторые функции для работы с картинками (библиотека GD):
    imagetypes(), ...
  • В разделе JavaScript добавлены свойства на букву D, E, F, H, I
  • В разделе Советы добавлена статья, рассказывающая как вставить в html-страницу документы MS Office (Word, Excel и т.д.)
  • Голосование:
    Ваше отношение к дизайну сайта:
    Приятный.
    Оригинальный.
    Так себе.
    Видали и получше.
    Ужасный.
    Ничего хуже не встречали.
    Счетчики:
    Rambler's Top100
    Сделать страницу стартовой Сделать страницу стартовой
    Добавить страницу в избранное Добавить сайт в избранное
    Сообщить об найденной ошибке Сообщить об ошибке