获取CakePHP中的电子邮件大小

时间:2014-04-01 12:39:56

标签: php email cakephp

我的应用程序使用的公司SMTP服务器的电子邮件大小限制为20mb。我的电子邮件失败并出现错误" [SocketException] SMTP错误:552 4.3.1邮件大小超过固定的最大邮件大小"当附件总数为14.92mb时。

目前,我的代码循环遍历附加文件并使用PHP filesize()计算文件大小,然后将其与硬编码限制20mb进行比较。它应该运行单独的代码来告诉用户文件是否太大,但是,在上面的示例中,它仍然低于限制并且它会产生一个丑陋的错误。< / p>

有没有办法衡量电子邮件,附件和所有内容的总大小?公司消息传递团队正在推迟说电子邮件必须超过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
}

1 个答案:

答案 0 :(得分: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传输发送邮件的确切字节数。