Задать вопрос
@microna

Как правильно прикрепить вложенный файл?

Пытаюсь прикрепить файл в письмо но на выходе получаю кракозябры :(
В чем может быть проблема?

//attachment
        $filename = 'test.pdf';
        $path = file_get_contents(INC_PATH . 'theme-templates');
        $file = $path . "/" . $filename;
        $content = file_get_contents($file);
        $content = chunk_split(base64_encode($content));
        $eol = "\r\n";


function send_email($email, $emailCopy, $from, $subject, $message, $headers = null)
{
    // Unique boundary
    $boundary = md5(uniqid());
    // If no $headers sent
    if (empty($headers)) {
        // Add From: header
        $headers = "From: " . $from->name . " <" . $from->email . ">\r\n";
        // Specify MIME version 1.0
        $headers .= "MIME-Version: 1.0\r\n";
        // Tell e-mail client this e-mail contains alternate versions
        $headers .= "Content-Type: multipart/alternative; boundary=\"$boundary\"\r\n\r\n";
    }
    // Plain text version of message
    $body = "--$boundary\r\n" .
        "Content-Type: text/plain; charset=UTF-8\r\n" .
        "Content-Transfer-Encoding: base64\r\n\r\n";
    $body .= chunk_split(base64_encode(strip_tags($message)));
    // HTML version of message
    $body .= "--$boundary\r\n" .
        "Content-Type: text/html; charset=UTF-8\r\n" .
        "Content-Transfer-Encoding: base64\r\n\r\n";
    $body .= chunk_split(base64_encode($message));
    $body .= "--$boundary--";

    // attachment
    $body .= "--" . $separator . $eol;
    $body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"" . $eol;
    $body .= "Content-Transfer-Encoding: base64" . $eol;
    $body .= "Content-Disposition: attachment" . $eol;
    $body .= $content . $eol;
    $body .= "--" . $separator . "--";
    //  end of attechment


    // Send Email
    if (is_array($email)) {
        foreach ($email as $e) {
            mail($e, $subject, $body, $headers);
        }
    } else {
        return mail($email, $subject, $body, $headers, $emailCopy);
    }
}
  • Вопрос задан
  • 108 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Три простых шага для решения данной проблемы:

1. Посмотреть на календарь и уточнить, какой сейчас век на дворе.
2. Аккуратно выделить этот код, и нажать клавишу Del
3. Скачать phpmailer
4. Забыть все эти кустарные ковыряния как страшный сон.

В итоге код должен получиться примерно таким:

require 'PHPMailerAutoload.php';
    $mail = new PHPMailer;
    $mail->setFrom('from@example.com', 'First Last');
    $mail->addAddress('whoto@example.com', 'John Doe');
    $mail->Subject = 'PHPMailer file sender';
    $mail->msgHTML("My message body");
        // Attach uploaded files
    $mail->addAttachment($filename1);
    $mail->addAttachment($filename2);
    $mail->send();

следует понимать, что отправка почты - это не просто копирование в свой скрипт каких-то определенных сочетаний символов, которые случайно сработали в прошлом веке у автора какой-либо допотопной статьи. Это гораздо более сложный процесс, который включает множество нюансов. И поэтому отправку почты надо не лепить вручную на ходу из навоза и палок, а доверить проверенному и отлаженному решению.
Ответ написан
@galaxy
По приведенному коду проблема, скорее всего, тут:
//$body .= "Content-Disposition: attachment" . $eol;
$body .= "Content-Disposition: attachment" . $eol . $eol;
$body .= $content . $eol;


кроме того, общий Content-Type лучше делать multipart/mixed.

Также, $filename (и другие строки типа $from->name, которые вы включаете в заголовки) должны кодироваться по-хорошему. Длинные заголовки - разбиваться на строки.

Короче, граблей там много. Возьмите готовую библиотеку
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽