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