2013-07-18 51 views
0

我們正在使用Cake的電子郵件類發送帶附件的電子郵件。對於除一個情況以外的所有情況都可以正常工作,而且我們無法確定問題出在哪裏。

過程:

  • 的PDF文件被創建&寫入到文件系統(文件被正確地寫入和存在)
  • 當電子郵件被髮送的附接是在大小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();

編輯 - 有沒有錯字它是所有正確設置。問題似乎是,由tcpdf生成的PDF在背景中非常不穩定地運行。因此,當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被寫入數據庫,所以可能會有一個醜陋的解決方法:將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();