【问题标题】:PHP get filesize of imap attachmentsPHP获取imap附件的文件大小
【发布时间】:2012-01-24 10:10:25
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: php email imap attachment filesize


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 非常感谢有用,是的,您需要的所有信息都在结构部件部分。对我来说,它是一个 StdClass,但可能是特定于案例的。另一个答案没有回答问题。
    【解决方案2】:

    我知道这是一篇较旧的帖子,但如果有帮助,大小差异是由于附件是 base64 编码的,这导致数据扩展了大约 33%。来自RFC3501:“[Body size is] 一个数字,以八位字节表示正文的大小。请注意,此大小是其传输编码中的大小,而不是任何解码后的结果大小。”

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多