我们正在使用Cake的电子邮件类发送带附件的电子邮件。它适用于除一个以外的所有情况,我们无法确定问题所在。
过程:
工作代码:
// Write invoice as file
$CakePdf->write(APP . 'tmp' . DS . 'invoices' . DS . $invoiceNo . '.pdf');
[...]
// Send invoice to customer
$Email = new CakeEmail('invoice');
$Email->attachments(APP . 'tmp' . DS . 'invoices' . DS . $invoiceNo . '.pdf');
$Email->to($this->Invoice->Customer->getEmailAdress($customerId));
$Email->viewVars(array('invoice_no' => $invoiceNo));
$Email->send();
不工作代码(附件大小为零字节):
$CakePdf->write(APP . 'tmp'. DS .'certificates' . DS . $certLoginId . $certCourseId . '.pdf');
[...]
// Send certificate to customer
$Email = new CakeEmail('certificate');
$Email->attachments(APP . 'tmp'. DS .'certificates' . DS . $certLoginId . $certCourseId . '.pdf');
$Email->to($emailOfUser);
$Email->viewVars(array('courseName' => $certCourseName, 'probandName' => $probandName));
$Email->send();
编辑 - 没有错误,所有设置都正确。问题似乎是,tcpdf生成的PDF在后台运行asycronronously。因此当Cake尝试附加文件时,它不会完全写入文件系统。所以它无法附加。
如果试图让脚本暂停一段时间而没有成功:
echo '<br>';
echo $path_to_certificate;
echo '<br>';
echo filesize($path_to_certificate);
sleep(10);
echo '<br>';
echo $path_to_certificate;
echo '<br>';
echo filesize($path_to_certificate);
echo '<br>';
sleep(10);
echo $path_to_certificate;
echo '<br>';
echo filesize($path_to_certificate);
输出:
C:\xampp\htdocs\www\eflux_frontend\app\tmp\certificates\13750.pdf
0
C:\xampp\htdocs\www\eflux_frontend\app\tmp\certificates\13750.pdf
0
C:\xampp\htdocs\www\eflux_frontend\app\tmp\certificates\13750.pdf
0
虽然文件是在此期间生成的,因为我可以看到&amp;访问文件系统中的文件。它不是锁定问题,因为其他代码在不同的地方工作,但生成的文件较小,因此处理时间不会太长。
我现在如何确保生成过程完成?
答案 0 :(得分:0)
似乎我们无法确保在将PDF附加到电子邮件之前正确创建PDF(也许某人可以在这里给我一个帮助)。
由于创建的PDF被写入数据库这一事实可能会出现一个丑陋的解决方法:将PDF写入数据库后,我们可以将其从数据库中取出,使用CakeFileHandler编写文件并将其附加到给我工作的电子邮件:
// Workaround
$this->Certificate->recursive = -1;
$data = $this->Certificate->findById($cert_id);
$pdf = base64_decode($data['Certificate']['certificate_pdf']);
$path_to_certificate = APP . 'tmp'. DS .'certificates' . DS . $certLoginId . $certCourseId . '.pdf';
$certificate_file = new File($path_to_certificate);
$certificate_file->write($pdf);
[do mail stuff]
$certificate_file->delete();
$certificate_file->close();