我正在阅读带有PHP的imap电子邮件并使用核心的imap PHP函数下载附件。我也通过imap协议(不是POP)连接。我希望能够在将附件加载到内存之前知道附件的文件大小,以减少服务器资源的使用。
例如,我希望每个附件限制为5mb,这样我就可以在消耗任何服务器资源之前丢弃超出限制的任何附件。查找电子邮件的大小可能有所帮助,但问题是我希望每个附件的限制,而不是每封电子邮件。
imap_fetchbody()
正在加载附件,这一切都有效。我可能会读取该函数结果的大小,但这意味着首先将附件加载到内存中。
由于
答案 0 :(得分:3)
我意识到这是一篇较旧的文章,但如果它有所帮助,大小的差异是由于附件是base64编码的,这导致数据大约增加了33%。来自RFC3501:“[Body size is]一个以八位字节表示正文大小的数字。请注意,此大小是其传输编码的大小,而不是任何解码后的结果大小。”
答案 1 :(得分:3)
这个问题已经超过3年了,没有真正的答案,我很惊讶。
使用imap_fetchstructure();
加载电子邮件结构将显示您执行此任务所需的所有信息。在使用imap_fetchstructure();
之前,我将假设您知道如何获取要检查的特定电子邮件。
无论如何,该函数将返回"部分"的列表。这些部分属于IMAP4规范。结果以数组形式给出,其中一个数组索引称为bytes
,表示该部分的字节数。还有另一个名为encoding
的索引,它指示该部分的编码方法。
正如保罗所回答的那样,Base64编码通常比原始大小大约33%,这应该足以确定附件的原始数据长度。
我相信通过使用imap_savebody();
函数将数据直接写入文件句柄,可以避免将数据加载到内存中的麻烦。您可以通过在调用imap_savebody();
之前向该文件句柄添加流过滤器来克服编码问题。这是通过stream_filter_append();
函数实现的。
当我有更多时间时,我可以编辑我的答案并添加一些有用的PHP代码。