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

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

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

Похожие вопросы