Php 如何将TCPDF生成的pdf作为Swiftmailer附件发送

Php 如何将TCPDF生成的pdf作为Swiftmailer附件发送,php,tcpdf,swiftmailer,Php,Tcpdf,Swiftmailer,我已经尝试了几种解决方案,最接近的(对我来说)应该是这样的: $file = $pdf->Output('', 'E'); $message->attach(Swift_Attachment::newInstance($file, 'name.pdf', 'application/pdf')); $pdf是TCPDF的实例,$message是Swift\u message的实例。 使用上面的电子邮件发送正常,文件已附加,但当我尝试打开它时,会收到错误消息,文件已损坏或编码错误 我的

我已经尝试了几种解决方案,最接近的(对我来说)应该是这样的:

$file = $pdf->Output('', 'E');
$message->attach(Swift_Attachment::newInstance($file, 'name.pdf', 'application/pdf'));
$pdf
TCPDF
的实例,
$message
Swift\u message
的实例。 使用上面的电子邮件发送正常,文件已附加,但当我尝试打开它时,会收到错误消息,文件已损坏或编码错误

我的问题是:如何将TCPDF生成的pdf作为Swiftmailer附件发送,而不将文件保存到服务器,并在发送电子邮件后将其删除。是指向TCPDF输出方法文档的链接,也许有人可以看到我遗漏的内容。

您尝试过这个吗

$file = $pdf->Output('', 'S');

我正在使用
PHP
中的另一个邮件后端执行此操作,这确实有效。我猜邮件后端负责对附件进行编码,因此无需手动将其编码为base64。

我在动态附加TCPDF时没有遇到任何问题

我调用一个函数,该函数最终使用输出类型“S”返回PDF:

return$pdf->Output('TE_Invoice.pdf','S')

我使用以下方式附加文件:

$message->attach(Swift_Attachment::newInstance()
  ->setFilename('TE_Invoice.pdf')
  ->setContentType('application/pdf')
  ->setBody($val['file']));
其中,
$val['file']
是上面返回的值


我正在使用TCPDF版本:5.9.134和Swift Mailer版本:4.1.3。对于PDF内容,我使用的是PDF库中最简单的示例之一

[...]
$pdf_as_string = $pdf->Output('', 'S'); // $pdf is a TCPDF instance
[...]
$transport = Swift_MailTransport::newInstance(); // using php mail function
$message->setTo(array(
  "client@customdomain.com" => "Main Email",
  "client@publicdomain.com" => "Secondary Email"
));
$message->setSubject("This email is sent using Swift Mailer");
$message->setBody("You're our best client ever.");
$message->setFrom("developers@mydomain.com", "Developers United");
$attachment = Swift_Attachment::newInstance($pdf_as_string, 'my-file.pdf', 'application/pdf');
$message->attach($attachment);
[...]

也许这个答案来得有点晚,因为我使用的是swiftmailer v4_3_0和TCPDF v6_0_002。但以防万一对某人来说是值得的

您可以使用outputmode“E”获取base64String

$base64PdfString = $pdf->Output('', 'E');
小心:也许你必须剪掉前5-6行,因为

内容类型:application/pdf ;;name=”“
内容传输编码:base64
内容处置:附件
filename=“”

Base64StringStartsHere

削减


已经试过了,再试一次仍然不起作用(相同的错误消息)。如果您将文件保存到文件系统,您可以打开它吗?如果是,那么这是一个快捷邮件的故障。如果我保存文件并附加$message->attach(Swift_Attachment::fromPath($path));那么一切都好了对不起,那么我帮不了你。我对正在使用的Swiftmailer一无所知,它可以成功地添加一个附件,该附件由
$file=$pdf->Output(''S')
生成
$mime->addAttachment($file,'application/pdf,'name.pdf')
。。。不过,这对你没什么大帮助。我就是这么做的,但在我打开电子邮件中的pdf后,我收到错误消息,文件已损坏或编码错误…这对MPDF也有效。谢谢。以下是参考资料:
$base64PdfArray = explode("\r\n", $base64PdfString);
$base64 = '';
for($i = 5; $i < count($base64PdfArray); $i++) {
    $base64 .= $base64PdfArray[$i];
}
$mail->attach(new \Swift_Attachment(base64_decode($base64), 'Pdf.pdf', 'application/pdf'));