Получение PDF-файла в Outlook - PullRequest
0 голосов
/ 11 апреля 2011

В моем текущем проекте мне нужно на лету создать PDF-файл, прикрепить его как почтовое вложение и отправить.Работает нормально, файл генерируют и отправляют на почту, которую я предоставил.Когда я отправляю его в учетную запись Microsoft Outlook или Windows Live, файл PDF прикреплен, но не удается открыть файл с помощью PDF, выдает сообщение об ошибке и говорит, что он поврежден.Но с Gmail и Yahoo все работает нормально.У кого-нибудь есть решение для этого.Ниже мой код

$dompdf = new DOMPDF();
    $dompdf->load_html($message);
    $dompdf->set_paper("a4", "landscape");
    $dompdf->render();

    // The next call will store the entire PDF as a string in $pdf
    $pdf = $dompdf->output();

    // You can now write $pdf to disk, store it in a database or stream it to the client.
    file_put_contents("pdfs/invoice.pdf", $pdf);


    $fileatt = "pdfs/invoice.pdf"; // Path to the file
    $fileatt_type = "pdf"; // File Type
    $fileatt_name = "invoice.pdf"; // Filename that will be used for the file as the attachment


    $fp = fopen($fileatt, "rb");
    $file = fread($fp, filesize($fileatt));

    $file = chunk_split(base64_encode($file));
    $num = md5(time());




    $to = "mail@mail.com";

    $subject = "Invoice";
    $headers = "From: " . "Manager" . "<" . "mail@mail.com" . ">\r\n";
    $headers  .= "MIME-Version: 1.0\r\n";
    $headers  .= "Content-Type: multipart/mixed; ";
    $headers  .= "boundary=".$num."\r\n";
    $headers  .= "--$num\r\n";

    $headers .= "Message-ID: <" . gettimeofday() . " TheSystem@" . $_SERVER['SERVER_NAME'] . ">\r\n";
    $headers .= "X-Mailer: PHP v" . phpversion() . "\r\n";



    $headers  .= "Content-Type:".$fileatt_type." ";
    $headers  .= "name=\"".$fileatt_name."\"r\n";
    $headers  .= "Content-Transfer-Encoding: base64\r\n";
    $headers  .= "Content-Disposition: attachment; ";
    $headers  .= "filename=\"".$fileatt_name."\"\r\n";
    $headers  .= "".$file."\r\n";
    $headers  .= "--".$num."\r\n";

    $headers .= "Content-Type: text/html; charset=iso-8859-1\r\n";
    $headers .= "".$message."\r\n";
    $headers .= "--".$num."--";

    if (mail($to, $subject, $message, $headers)) {
        fclose($fp);
        echo "Success";
        //header("location: client.php?m=1");
    } else {
        echo "Error";
        //header("location: client.php?m=0");
    }

Надеюсь, что кто-то может помочь мне решить проблему.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

Создание собственных сообщений пантомимы никогда не является хорошей идеей.Используйте взамен PHPMailer или Swiftmailer .Они оба обрабатывают тяжелую работу по созданию сообщений, включая вложения файлов.Лучше всего то, что они оба бесплатны и работают намного лучше, чем встроенная функция почты PHP.Ваш код выше может быть уменьшен до 5 из 6 строк кода отправки почты с любым из пакетов.

1 голос
/ 01 февраля 2012

Я боролся с этим в течение почти дня и обнаружил, что Outlook, похоже, не распознает вложения, если граница не имеет префикса с символом табуляции (\t).

Например:

$headers.="Content-type: multipart/mixed;\r\n\tboundary=\"uniqueID\"\r\n\r\n";

Вам также нужно использовать оба параметра \r\n вместе и
, чтобы убедиться, что между каждой границей (и ее инструкциями) и ее содержанием имеется четкая линия.

...