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

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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽