2011-12-20 57 views
2

私はPHPでimap電子メールを読んでおり、コアimap PHP関数を使用して添付ファイルをダウンロードしています。また、IMAPプロトコル(POPではなく)で接続しています。添付ファイルのファイルサイズを知ってからメモリにロードして、サーバーリソースの使用量を減らしたいと考えています。PHPはimap添付ファイルのファイルサイズを取得します

たとえば、添付ファイルあたり5MBの制限が必要です。この方法で、サーバーリソースを消費する前に、制限を超えている添付ファイルを破棄できます。電子メールのサイズを知ることは助けになるかもしれませんが、その問題は電子メールではなく、添付ファイルあたりの制限を欲しいということです。

imap_fetchbody()はすべて動作する添付ファイルをロードしています。私はおそらく、その関数の結果のサイズを読むことができますが、それはまず添付ファイルをメモリにロードすることを意味します。

おかげ

答えて

3

は、私はこれは古い記事で実現するが、場合には、それはサイズの違いは、添付ファイルはbase64エンコード、データの約33%の拡大につながることによるものである、ことができます。 RFC3501から: "[ボディサイズは]ボディのサイズをオクテットで示す数値です。このサイズは転送エンコードのサイズであり、デコード後の結果のサイズではありません。

2

この質問は本当に答えが3年ちょっとですが、私は驚いています。

imap_fetchstructure();を使用してメール構造を読み込むと、このタスクに必要なすべての情報が表示されます。 imap_fetchstructure();を使用する前に確認したい特定の電子メールを入手する方法を知っていると仮定します。

とにかく、この関数は "parts"のリストを返します。これらの部分はIMAP4仕様です。結果は配列で与えられ、配列インデックスの1つはbytesと呼ばれ、その部分のバイト数を示します。その部分のエンコード方法を示すencodingという別のインデックスがあります。

Paulが答えたように、Base64エンコーディングは、元のサイズより約33%大きく、添付ファイルの元のデータ長を決定するのに十分なはずです。

imap_savebody();関数を使用してデータをファイルハンドルに直接書き込むことで、データをメモリにロードする手間を省くことができます。 imap_savebody();を呼び出す前に、そのファイルハンドルにストリームフィルタを追加することで、エンコードの問題を解決できます。これはstream_filter_append();機能によって実現されます。

もっと時間がある場合は、私の回答を編集し、動作中のPHPコードを追加することがあります。

+0

ありがとうございました有用な、はい必要なすべての情報は構造部品の部分です。私にとってはStdClassでしたが、ケース固有の可能性があります。他の答えは質問に答えません。 – Andrew

関連する問題