Отправка письма с вложением на php

Отправка письма с вложением на phpВ этой статье я приведу пример того, как можно с помощью php и функции mail() отправлять письма с прикрепленными файлами.
Чтобы было наглядней и понятней всю основную часть я вынес в функцию. Код подробно прокомментирован, поэтому что-либо писать нет смысла, просто приведу код:

// пример использования
$file = "./files/test.txt"; // файл
$mailTo = "admin@vk-book.ru"; // кому
$from = "test@files.com"; // от кого
$subject = "Test file"; // тема письма
$message = "Тестовое письмо с вложением"; // текст письма
$r = sendMailAttachment($mailTo, $from, $subject, $message, $file); // отправка письма c вложением
echo ($r)?'Письмо отправлено':'Ошибка. Письмо не отправлено!';
//$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения
//echo ($r)?'Письмо отправлено':'Ошибка. Письмо не отправлено!';

/**
* Отправка письма с вложением
* @param string $mailTo
* @param string $from
* @param string $subject
* @param string $message
* @param string|bool $file - не обязательный параметр, путь до файла
* 
* @return bool - результат отправки
*/

function sendMailAttachment($mailTo, $from, $subject, $message, $file = false){
    $separator = "---"; // разделитель в письме
    // Заголовки для письма
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: $from\nReply-To: $from\n"; // задаем от кого письмо
    $headers .= "Content-Type: multipart/mixed; boundary=\"$separator\""; // в заголовке указываем разделитель
    // если письмо с вложением
    if($file){
        $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";
        $fileRead = fopen($file, "r"); // открываем файл
        $contentFile = fread($fileRead, filesize($file)); // считываем его до конца
        fclose($fileRead); // закрываем файл
        $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";
        $bodyMail .= chunk_split(base64_encode($contentFile))."\n"; // кодируем и прикрепляем файл
        $bodyMail .= "--".$separator ."--\n";
    // письмо без вложения
    }else{
        $bodyMail = $message;
    }
    $result = mail($mailTo, $subject, $bodyMail, $headers); // отправка письма
    return $result;
}
Рассказать друзьям:


Оценить:
(6 оценок, среднее: 4,33 из 5)

Отправка письма с вложением на php: 15 комментариев

  1. Ежу может и понятно, а мне вот нет.
    Искал в поиске — форму отправки с сайта, письма с вложением.
    Натолкнулся на эту страницу.
    Нихрена не понятно. Как использовать, чего куда вставлять ….

      1. Если нужен был просто рабочий код, то читатели могли бы просто взять его с PEAR. Вам стоило внести больше объяснения в код.

  2. а если мне нужно отправить два файла в одном письме? что нужно добавить в этот скрипт?

  3. Чувак хорошо все расписал, написал красиво код и все понятно комментировал.
    Кто не понял, ну блин, почитайте в книге, там может понятнее.

  4. Ошибка у тебя при таком расположении ,
    Fatal error: Uncaught Error: Call to undefined function sendMailAttachment()

    а если поставить в таком то работает :
    function sendMailAttachment($mailTo, $from, $subject, $message, $file = false){
    $separator = «—«; // разделитель в письме
    // Заголовки для письма
    $headers = «MIME-Version: 1.0\r\n»;
    $headers .= «From: $from\nReply-To: $from\n»; // задаем от кого письмо
    $headers .= «Content-Type: multipart/mixed; boundary=\»$separator\»»; // в заголовке указываем разделитель
    // если письмо с вложением
    if($file){
    $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»;
    $fileRead = fopen($file, «r»); // открываем файл
    $contentFile = fread($fileRead, filesize($file)); // считываем его до конца
    fclose($fileRead); // закрываем файл
    $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»;
    $bodyMail .= chunk_split(base64_encode($contentFile)).»\n»; // кодируем и прикрепляем файл
    $bodyMail .= «—«.$separator .»—\n»;
    // письмо без вложения
    }else{
    $bodyMail = $message;
    }
    $result = mail($mailTo, $subject, $bodyMail, $headers); // отправка письма
    return $result;
    }
    // пример использования
    $file = «./files/test.txt»; // файл
    $mailTo = «admin@vk-book.ru»; // кому
    $from = «test@files.com»; // от кого
    $subject = «Test file»; // тема письма
    $message = «Тестовое письмо с вложением»; // текст письма
    $r = sendMailAttachment($mailTo, $from, $subject, $message, $file); // отправка письма c вложением
    echo ($r)?’Письмо отправлено’:’Ошибка. Письмо не отправлено!’;
    //$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения
    //echo ($r)?’Письмо отправлено’:’Ошибка. Письмо не отправлено!’;

  5. ток в таком порядке отправляет пустой файл с размером 0байт . как это исправить?

  6. Здравствуйте. Скрипт работает отлично, а как можно сделать отправку через SMTP?

    1. Каждый файл нужно по от отдельности разбивать и кодировать. Можете посмотреть в исходниках класса для отправки писем по SMTP: https://vk-book.ru/novaya-versiya-klassa-sendmailsmtpclass-otpravka-fajlov-cherez-smtp-s-avtorizaciej-po-protokolu-ssl-na-php/ Там есть метод, который умеет прикреплять любое количество файлов.

  7. На почту приходит пустой файл с изменённым названием. Что можно с этим сделать?

Добавить комментарий для павел Отменить ответ

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

*

code