pear 发送的 MIME PDF 文件附件打不开
MIME PDF file attachment sent by pear is not opening
这是我使用 MPDF 即时生成 PDF 并将其作为附件发送的代码。我已经删除了不必要的代码以使事情变得容易理解。
<?php
require_once "Mail.php";
require_once "Mail/mime.php";
include 'mpdf/mpdf.php';
$server = 'my-domain-name';
$header = file_get_contents($server.'/pdf-header.php);
$html = file_get_contents($server.'/pdf-data.php);
//....Some parameters for mPDF constructor
$mpdf = new mPDF('en-x','A4','','',$marginLeft, $marginRight, $marginTop, $marginBottom, $marginHeader, $marginFooter);
// *** Set some properties of $mpdf object
$mpdf->WriteHTML($html); # Write html to pdf
$content = $mpdf->Output('', 'S'); // Saving pdf to attach to email
$content = chunk_split(base64_encode($content));
# Set $from, $to, $subject and parameters for SMTP Authentication
$bodyHTML = '<p>Some HTML Body</p>';
$bodyTXT = 'Plain Text Body for clients not supporting HTML';
$headers = array ('From' => $from, 'To' => $to,
'Reply-To' => $to, 'Subject' => $subject);
$smtpParams = array ('host' => $host, 'port' => $port,
'auth' => true, 'username' => $emailID,
'password' => $password);
$mime = new Mail_mime("\n");
$mime->setTXTBody($bodyTXT);
$mime->setHTMLBody($bodyHTML);
$mime->addAttachment($content, 'application/pdf', 'report.pdf', false, 'base64', 'attachment');
# Get Mime Body
$body = $mime->get();
# Get Mime Headers
$mimeHeaders = $mime->headers($headers);
$smtp = Mail::factory('smtp', $smtpParams);
$mail = $smtp->send($to, $mimeHeaders, $body);
?>
电子邮件已成功发送给收件人,附件 report.pdf 的文件大小符合预期,但附件在 Adobo Acrobat 以外的任何浏览器中都无法打开。 report.pdf的编码可能是错误的。
如果我替换-
$content = $mpdf->Output('', 'S'); // Saving pdf to attach to email
$content = chunk_split(base64_encode($content));
和
$mpdf->Output();
PDF完美输出到浏览器,没有任何错误。这意味着我搞砸了-
$mime->addAttachment($content, 'application/pdf', 'report.pdf', false, 'base64', 'attachment');
类似的问题已经在 Whosebug 上讨论过,但它们是关于从存储中提取文件然后通过电子邮件发送的问题。我也试过了,但同样,PDF 已损坏。
谁能告诉我我的脚本有什么问题吗?
提前致谢
您的代码的问题是您对 pdf 文件进行了双重编码。调用 chunk_split
和 base64_encode
是 Mail_mime
内部工作的一部分,因此您不必这样做。使用 'base64'
参数调用 addAttachment
只会告诉 Mail_mime
使用 base64 对其进行编码,not 你必须这样做。
要修复您的代码,您只需删除以下行
$content = chunk_split(base64_encode($content));
这是我使用 MPDF 即时生成 PDF 并将其作为附件发送的代码。我已经删除了不必要的代码以使事情变得容易理解。
<?php
require_once "Mail.php";
require_once "Mail/mime.php";
include 'mpdf/mpdf.php';
$server = 'my-domain-name';
$header = file_get_contents($server.'/pdf-header.php);
$html = file_get_contents($server.'/pdf-data.php);
//....Some parameters for mPDF constructor
$mpdf = new mPDF('en-x','A4','','',$marginLeft, $marginRight, $marginTop, $marginBottom, $marginHeader, $marginFooter);
// *** Set some properties of $mpdf object
$mpdf->WriteHTML($html); # Write html to pdf
$content = $mpdf->Output('', 'S'); // Saving pdf to attach to email
$content = chunk_split(base64_encode($content));
# Set $from, $to, $subject and parameters for SMTP Authentication
$bodyHTML = '<p>Some HTML Body</p>';
$bodyTXT = 'Plain Text Body for clients not supporting HTML';
$headers = array ('From' => $from, 'To' => $to,
'Reply-To' => $to, 'Subject' => $subject);
$smtpParams = array ('host' => $host, 'port' => $port,
'auth' => true, 'username' => $emailID,
'password' => $password);
$mime = new Mail_mime("\n");
$mime->setTXTBody($bodyTXT);
$mime->setHTMLBody($bodyHTML);
$mime->addAttachment($content, 'application/pdf', 'report.pdf', false, 'base64', 'attachment');
# Get Mime Body
$body = $mime->get();
# Get Mime Headers
$mimeHeaders = $mime->headers($headers);
$smtp = Mail::factory('smtp', $smtpParams);
$mail = $smtp->send($to, $mimeHeaders, $body);
?>
电子邮件已成功发送给收件人,附件 report.pdf 的文件大小符合预期,但附件在 Adobo Acrobat 以外的任何浏览器中都无法打开。 report.pdf的编码可能是错误的。
如果我替换-
$content = $mpdf->Output('', 'S'); // Saving pdf to attach to email
$content = chunk_split(base64_encode($content));
和
$mpdf->Output();
PDF完美输出到浏览器,没有任何错误。这意味着我搞砸了-
$mime->addAttachment($content, 'application/pdf', 'report.pdf', false, 'base64', 'attachment');
类似的问题已经在 Whosebug 上讨论过,但它们是关于从存储中提取文件然后通过电子邮件发送的问题。我也试过了,但同样,PDF 已损坏。
谁能告诉我我的脚本有什么问题吗?
提前致谢
您的代码的问题是您对 pdf 文件进行了双重编码。调用 chunk_split
和 base64_encode
是 Mail_mime
内部工作的一部分,因此您不必这样做。使用 'base64'
参数调用 addAttachment
只会告诉 Mail_mime
使用 base64 对其进行编码,not 你必须这样做。
要修复您的代码,您只需删除以下行
$content = chunk_split(base64_encode($content));