Все ленты — последние статьи

Отправка файлов аттачем

Отправка файлов аттачем

Сущность механизма отправки файлов в текстовом сообщении заключается в том, что письмо состоит из нескольких частей, границы которых обозначены уникальной сигнатурой. Именно она и позволяет Вам прикладывать к письму несколько файлов и не смешивать их содержимое в процессе передачи данных.

Я написал класс (точнее, если быть честным — это стандартное решение подобной проблемы. Вы можете найти такой же класс на php.spb.ru. Я не стал переписывать его без изменений, а немного переработал творчески.

Итак исходный код класса с комментариями:

<?
class multi_mail
{
var $from; // Отправитель
var $to; // Получатель
var $headers; // Заголовок сообщения
var $body; // Тело сообщения


function multi_mail() // Конструктор класса
// Проводим инициализацию переменных
{
$this -> from = "";
$this -> to = "";
$this -> body = "";
$this -> headers = array();
$this -> subject = "";
}

// Присоединяем файл
function attach_file($file_name = "" , // Имя файла
$file_content, // Содержимое файла
$encoding_type = "application/octet-stream"
//Тип кодировки данных.
)
{
$this -> headers[] = array( // Записываем заголовочную информацию.
"name" => $file_name,
"content" => $file_content,
"encode" => $encoding_type
);
}

function build_letter($header)
// Строим Часть письма, будь то аттаченный файл или простой текст
{
$letter = $header["content"];
if ($header["encode"] != "text/plain"):
$letter = chunk_split(base64_encode($letter));
$encoding = "base64";
else:
$encoding = $header["encode"];
endif;
return "content-type: ".$header["encode"].
($header["name"]? ".; name = "".$header["name"].""" : "")
."rncontent-transfer-encoding:
$encodingrnrn$lettern";
}

function set_multipart_mail() // Собираем письмо из разрозненных частей
{
$boundary = 'b'.md5(uniqid(time()));
// Создаем уникальное число, служащее индетификатором для чати письма

$multipart = "content-type: multipart/mixed;
boundary =$boundarynnthis is a mime encoded letterrnrn--$boundary";
for($step = sizeof($this->headers)-1; $step >=0; $step--)
{
$multipart .= "rn".$this->build_letter($this->headers[$step])."--$boundary";
// Вставляем содержимое межу метками
}
return $multipart .= "--rn";
}

function get_full_message()
// Вставляем тело письма (текстовую начинку) и все файлы
// на выходе получаем полное писмо (одна большая строка :)))
{
$mime = "";
if (!empty($this->from)):
$mime .= "from: ".$this->from." rn";
endif;
if (!empty($this->body)):
$this -> attach_file("",$this->body,"text/plain");
$mime .= "mime-version: 1.0rn".$this->set_multipart_mail();
endif;

return $mime;
}


function send_mail() // Собственно посыл письма
{
$mime = $this -> get_full_message(false);
mail($this->to,$this->subject,"",$mime);
}
}
?>