Рецепт №51. Из книги «128 рецептов php»
Перейти к оглавлению
Для отправки писем с вложениями достаточно использовать функцию php mail. Файлы, которые будут отправлены, необходимо закодировать в формат base64 и добавить в тело письма, а также указать в отправляемых заголовках письма информацию о том, что в письме присутствуют файлы.
Чтобы отделить закодированный файл от текста письма, необходимо добавить текстовый разделитель, это может быть любая уникальная строка. Разделитель следует обозначить в отправляемых заголовках, и выводить до и после прикрепления файла в тексте письма.
Пример:
// файл $file = "/files/file.txt"; // кому письмо $mailTo = "zhenikipatov@yandex.ru"; // от кого письмо $from = "test@files.com"; // тема письма $subject = "Test file"; // текст письма $message = "Тестовое письмо с вложением"; // разделитель в письме $separator = "---"; // Заголовки для письма $headers = "MIME-Version: 1.0\r\n"; // задаем от кого письмо $headers .= "From: $from\nReply-To: $from\n"; // в заголовке указываем разделитель $headers .= "Content-Type: multipart/mixed;" . "boundary=\"$separator\""; // начало тела письма, выводим разделитель $bodyMail = "--$separator\n"; // кодировка письма $bodyMail .= "Content-type: text/html;" . "charset='utf-8'\n"; // задаем конвертацию письма $bodyMail .= "Content-Transfer-Encoding: quoted-printable"; // задаем название файла $bodyMail .= "Content-Disposition: attachment;" . "filename==?utf-8?B?" . base64_encode(basename($file))."?=\n\n"; $bodyMail .= $message."\n"; // добавляем текст письма $bodyMail .= "--$separator\n"; // тип контента и имя файла $bodyMail .= "Content-Type: application/octet-stream;" . "name==?utf-8?B?" . base64_encode(basename($file))."?=\n"; // кодировка файла $bodyMail .= "Content-Transfer-Encoding: base64\n"; $bodyMail .= "Content-Disposition: attachment;" . "filename==?utf-8?B?" . base64_encode(basename($file))."?=\n\n"; // считываем файл $contentFile = file_get_contents($file); // кодируем и прикрепляем файл $bodyMail .= chunk_split(base64_encode($contentFile))."\n"; $bodyMail .= "--".$separator ."--\n"; // отправка письма $result = mail($mailTo, $subject, $bodyMail, $headers); if($result){ echo "Письмо успешно отправлено"; }else{ echo "Письмо не отправлено"; }
В рецепте было использовано несколько ранее не описанных функций.
Base64_encode – кодирует данные в формат base64.
Chunk_split – разбивает строку на фрагменты, осуществляет перенос каждого фрагмента на новую строку, по умолчанию длина одного фрагмента 76 символов.
Basename – определяет имя файла из указанного пути.
File_get_contents – получает содержимое файла.