@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);
    }
}
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега PHP
Три простых шага для решения данной проблемы:

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, которые вы включаете в заголовки) должны кодироваться по-хорошему. Длинные заголовки - разбиваться на строки.

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

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

Войти через центр авторизации
Похожие вопросы
LAPTOP.RU Москва
от 150 000 до 190 000 ₽
LAPTOP.RU Москва
от 130 000 до 170 000 ₽
LAPTOP.RU Кострома
от 25 000 до 65 000 ₽