2011-12-20 51 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