2014-04-01 27 views
1

我的應用程序使用企業SMTP服務器,電子郵件大小限制爲20mb。我的電子郵件失敗,錯誤爲「[SocketException] SMTP錯誤:552 4.3.1消息大小超過固定的最大消息大小」,當附件總計14.92mb。在CakePHP中獲取電子郵件大小

目前我的代碼循環遍歷附加文件,並使用PHP filesize()對文件大小進行統計,然後將其與20mb的硬編碼限制進行比較。它應該運行單獨的代碼來告訴用戶文件是否太大,但是,在上面的例子中,它仍然小於極限,而是產生了一個醜陋的錯誤。

有沒有一種方法可以測量電子郵件,附件和所有的總大小?企業短信團隊正在推回說,電子郵件必須超過20MB,我想對此進行適當的測試。

我正在使用CakePHP 2.3的EmailComponent。下面是代碼的簡化版本:

App::uses('CakeEmail', 'Network/Email'); 
$email = new CakeEmail('smtp'); 
... 

$totalAttachmentsSize = 0; 
$attachments = array(); 
//loop array with files to be attached 
foreach ($files as $file) { 
$totalAttachmentsSize += filesize($file['path']); 
$attachments[$file['name']] = $file['path']; 
} 

//compare attachments size to constant defined in bootstrap.php 
if ($totalAttachmentsSize < MAX_EMAIL_SIZE) { 
    $email->send(); 
} 
else { 
    //handle 
} 

回答

4

附件被base64編碼,這將需要一些更多的數據,也將其連在一起需要額外的頭和東西的幾個字節。

要得到確切的大小,請檢查返回值CakeEmail::send(),它將包含呈現的標題和消息正文。如果您不想實際發送郵件,請使用DebugTransport

$email->transport('Debug'); 
$contents = $email->send(); 

$data = $contents['headers'] . "\r\n\r\n" 
     . $contents['message'] . "\r\n\r\n\r\n."; 

debug(strlen($data)); 

這應該爲您提供SMTP傳輸發送的郵件的確切字節數。

+0

謝謝,這很完美。事實上,我的14.92mb電子郵件是以超過20mb的頭髮出現的。 對於未來的讀者,請記住在檢查文件大小後將傳輸設置回SMTP :-)我使用$ email-> config('transport')執行此操作; – gazareth