Отправка писем с вложенными файлами

Рецепт №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 – получает содержимое файла.

Рассказать друзьям:


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*