Сущность механизма отправки файлов в текстовом сообщении заключается в
том, что письмо состоит из нескольких частей, границы которых
обозначены уникальной сигнатурой. Именно она и позволяет Вам
прикладывать к письму несколько файлов и не смешивать их содержимое в
процессе передачи данных.
Я
написал класс (точнее, если быть честным - это стандартное решение
подобной проблемы. Вы можете найти такой же класс на 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); } } ?>
|