2013-07-18 2 views
0

Мы используем класс электронной почты Cake для отправки электронных писем с вложениями. Он отлично работает для всех случаев, кроме одного, и мы не можем понять, где проблема.

процесса:

  • ФРП-файл создается & записывается в файловой системе (файл записывается правильно и существует)
  • при отправке почты вложение является 0Bytes в размере (в то время как файл прикрепить правильно создаются в файловой системе)

Рабочим код:
// 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();

Edit - нет опечатка это все правильно. Кажется, что проблема заключается в том, что генерация PDF-файла tcpdf выполняется в фоновом режиме. Поэтому, когда 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 

В то время как файл генерируется в то же время, потому что я могу видеть & доступ файл в файловой системе. Это не проблема блокировки, потому что другой код работает в другом месте, но созданный файл меньше, поэтому для обработки не требуется столько времени.

Как я могу гарантировать, что процесс генерации завершен?

+1

Что печатает? 'APP. 'TMP'. DS. 'Сертификаты'. DS. $ certLoginId. $ certCourseId. '.pdf'' –

+0

Оба входа выдают один и тот же путь - поэтому он должен работать. [Что это на самом деле делает сейчас - OO] ... извините за беспокойство. –

+0

Хорошо. Спасибо ... :) –

ответ

0

Похоже, что мы не можем гарантировать, что 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();