Представляю посетителям сайта http://red-book-cms.ru пример полностью рабочей самописной функции отправки писем с вложениями на PHP:
<?php
/**
* Функция отправки письма с вложениями.
* Коды возвращаемых ошибок:
* 0 - файл не существует,
* 1 - файл не удалось открыть,
* 2 - письмо не удалось отправить,
* -1 - письмо успешно отправлено.
*
* @param string $charset
* @param string $to
* @param string $from
* @param string $subject
* @param string $message
* @param array $files
* @return int
*/
function send_mail($charset, $to, $from, $subject, $message, $files) {
$boundary = "--" . md5(uniqid(time())); // генерация разделителя
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$headers .= "From: $from\r\n";
$multipart .= "--$boundary\n";
$multipart .= "Content-Type: text/html; charset=$charset\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= $message;
if ((is_array($files)) && (!empty($files))) :
foreach ($files as &$path):
if (!file_exists($path)): // проверяем, что файл существует
return 0;
exit();
endif;
$fp = fopen($path, "r"); // пробуем открыть файл
if (!$fp) :
return 1;
exit();
endif;
$file = fread($fp, filesize($path));
fclose($fp);
$message_part .= "--$boundary\n";
$message_part .= "Content-Type: application/octet-stream\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"" . $path . "\"\n\n";
$message_part .= chunk_split(base64_encode($file)) . "\n";
endforeach;
$multipart .= "\n\n" . $message_part . "--$boundary--\n";
endif;
if (!mail($to, $subject, $multipart, $headers)): // отправка письма
return 2;
exit();
endif;
return -1;
}
print send_mail('windows-1251',
'red-book-cms@yandex.ru',
'ПХП ',
'Письмо от PHP с вложениями',
'<h1>Привет.</h1><p>Присланы файлы вам во вложении.',
array('robots.txt', 'html.zip')
);
?>
В принципе все входные параметры функции приведены в комментарии к ней же, но для тех кому все ещё ничего непонятно поясню, как пользоваться данным сниппетом.
$charset — кодировка письма, строковый тип данных. Примеры кодировок: windows-1251, koi8-r, utf-8.
$to — получатели, их ящики, также строковый тип данных.
$from — отправитель, от кого письмо придет получателям, строка.
$subject — тема письма, строкового типа данных.
$message — текст сообщения, тело письма. Может содержать как простой текст, так и разметку на HTML.
$files — массив с файлами. Пример: array('text.txt', 'readme.md', 'archive.zip');.
Коды ошибок, которые возвращает моя самописная функция:
-1 — все в порядке, письмо отправлено по назначению.
0 — какого-то из файлов или файла не существует.
1 — файл(ы) не удалось открыть по каким-то причинам.
2 — по неизвестным причинам письмо отправить не получилось.