2011-12-20 121 views
2

我正在阅读使用PHP和下载附件的imap电子邮件,使用核心imap PHP函数。我也通过imap协议(不是POP)连接。我希望能够在将它们加载到内存之前知道附件的文件大小,以减少服务器资源的使用。PHP获取imap附件的文件大小

例如,我希望每个附件的限制为5MB,这样,我可以在消耗任何服务器资源之前丢弃任何超出限制的附件。找到电子邮件的大小可能会有所帮助,但问题是我想每个附件的限制,而不是每个电子邮件。

imap_fetchbody()正在加载附件,这一切都有效。我大概可以读取该函数结果的大小,但这意味着首先将附件加载到内存中。

由于

回答

3

我意识到这是一个较旧的文章,但在情况下有帮助,在尺寸上的差别是由于附件是base64编码,这导致数据的大约33%的膨胀。从RFC3501:“[Body size is]一个以八位字节为单位给出身体大小的数字。请注意,此大小是其传输编码中的大小,而不是解码后得到的大小。”

2

这个问题刚刚超过3岁,没有真正的答案,我很惊讶。

使用imap_fetchstructure();加载电子邮件结构将显示此任务需要的所有信息。我会假设你在使用imap_fetchstructure();之前知道如何获得你想要检查的特定电子邮件。

无论如何,该函数将返回一个“零件”列表。这些部分属于IMAP4规范。结果以数组形式给出,其中一个数组索引被称为bytes,它指示该部分的字节数。还有另一个索引encoding,它指出了该部分的编码方法。

正如Paul所回答的那样,Base64编码通常比原始尺寸大33%,这应该足以确定附件的原始数据长度。

我相信你可以通过使用imap_savebody();函数将数据直接写入文件句柄来避免将数据加载到内存的麻烦。在调用imap_savebody();之前,您可以通过向该文件句柄添加流过滤器来解决编码问题。这是通过stream_filter_append();函数实现的。

我可以编辑我的答案,并在有更多时间时添加一些有效的PHP代码。

+0

非常感谢有用,是的所有信息你需要的是结构零件部分。对我而言,这是一个StdClass,但可能是特定案例。另一个答案不回答这个问题。 – Andrew 2017-04-21 13:37:37