$ Email-> attachments()不附加文件

时间:2013-07-18 08:44:34

标签: cakephp cakephp-2.3

我们正在使用Cake的电子邮件类发送带附件的电子邮件。它适用于除一个以外的所有情况,我们无法确定问题所在。

过程:

  • 创建了一个pdf文件&写入文件系统(文件正确写入并存在)
  • 发送电子邮件时,附件大小为0字节(而附加文件在文件系统中正确创建)

工作代码:
// 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;访问文件系统中的文件。它不是锁定问题,因为其他代码在不同的地方工作,但生成的文件较小,因此处理时间不会太长。

我现在如何确保生成过程完成?

1 个答案:

答案 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();