0

在我当前的项目中,我必须即时创建一个 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");
    }

希望有人可以帮助我解决问题。

4

2 回答 2

2

构建自己的 mime 消息绝不是一个好主意。请改用PHPMailerSwiftmailer。他们都处理构建消息的繁重工作,包括文件附件。最重要的是,它们都是免费的,而且比内置的 PHP 邮件功能好得多。使用任何一个包,您上面的代码都可以减少到大约 6 行邮件发送代码中的 5 行。

于 2011-04-11T14:29:21.593 回答
1

我已经为此苦苦挣扎了将近一天,发现除非边界以制表符 ( ) 为前缀,否则 Outlook 似乎无法识别附件\t

例如 :

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

您还需要同时使用两者\r\n,并
确保每个边界(及其说明)与其内容之间有一条清晰的界限。

于 2012-02-01T15:57:40.690 回答