[PHP-users 3675] Re: メール添付画像ファイルのファイル名を取得したい

Tsuzuki Toshiya php-users@php.gr.jp
Mon, 19 Nov 2001 19:49:26 +0900 (JST)


こんにちは。都築です。

#ちょっと応答が遅いかもしれませんが…。


Jun 2kawa さんは書きました:
>> ちなみに parameters配列のインデックスの意味は私も良く
分かりません。
>> とりあえず 0 を指定してますが。あと、dparameter配列と
いうのもありますが
>> なにに使うんでしょうね。

送信に使用するメーラによってファイル名はparameterに入る か
dparameterに入るかが変わってきます。


以下の例はAL-MAILによる添付ファイルのimap_fetchstructure
実行例です。
#ちょっと長くてごめんなさい。

stdClass Object
(
[type] => 1
			(中略)
[parts] => Array
	(
	[0] => stdClass Object
			(中略)

	[1] => stdClass Object
		(
		[type] => 5
		[encoding] => 3
		[ifsubtype] => 1
		[subtype] => JPEG
		[ifdescription] => 0
		[ifid] => 0
		[bytes] => 62868
		[ifdisposition] => 1
		[disposition] => ATTACHMENT
		[ifdparameters] => 1
		[dparameters] => Array
			(
			[0] => stdClass Object
				(
				[attribute] => FILENAME
				[value] => =?ISO-2022-JP?BGyRCQGkkSEBpP1IbKEIuanBn?=
				)
			)
		[ifparameters] => 1
		[parameters] => Array
			(
			[0] => stdClass Object
				(
				[attribute] => NAME
				[value] => =?ISO-2022-JP?BGyRCQGkkSEBpP1IbKEIuanBn?=
				)
			)
		)
	[2] => stdClass Object
		(
		[type] => 5
		[encoding] => 3
		[ifsubtype] => 1
		[subtype] => JPEG
		[ifdescription] => 0
		[ifid] => 0
		[bytes] => 21070
		[ifdisposition] => 1
		[disposition] => ATTACHMENT
		[ifdparameters] => 1
		[dparameters] => Array
			(
			[0] => stdClass Object
				(
				[attribute] => FILENAME
				[value] => a.jpg
				)
			)
		[ifparameters] => 1
		[parameters] => Array
			(
			[0] => stdClass Object
				(
				[attribute] => NAME
				[value] => a.jpg
				)
			)
		)
	)
)

というわけで
	$mes->parts[1と2]->dparameters[0]->value
と
	$mes->parts[1と2]->parameters[0]->value
の両方にファイル名が入ってますね。(添付は2つ着いてます
。)

#どっちかにしかファイル名を書かないメーラも多いですし、
 エンコード方法もBase64とは限りません。
 全部送信メーラの設定ですので。


>何がどこに格納されているのか、混乱してしまいますね。お
そらくメチャメチャ
>使い勝手の良い関数な感じがするんですけど、情報が少なす
ぎるのが残念です。
>ソースとか、ヘッダファイルを直接見てみるしかないのかな
。。。。

print_r コマンドを使ってみてください。先の例みたいにみん
な表示されます。
ちなみに、例は以下のコードをコマンド実行して出力しました
。

	$mbox = imap_open ("{サーバ:110/pop3}","ユーザ","パスワ
ード");
// メール数を求める。
	$mboxes = imap_check($mbox);
	$mail_cnt = $mboxes->Nmsgs;
// 一番最後のメールを解析
	$mes = imap_fetchstructure( $mbox, $mail_cnt );
// 表示
	print_r( $mes );


>確かにここにファイル名が格納される場合もあるんですが、
>おそらく送信側のメールクライアントに依存するのだと思い
ますが、
>ヘッダの記述がDispositionには無い場合もあったのです。
>ちなみに、Dipositionの内容も "Attachment"までは
>取得できたんですけど、その先が。。。。

ちょっと面倒なんですが、

全partsについて{
	ifdparametersが1なら{
		全dparametersについて{
			attributeが"FILENAME"なら{
				ファイル名はbasename(xxx->value)
			}
		}
	}
	ifparametersが1なら{
		全parametersについて{
			attributeが"NAME"なら{
				ファイル名はbasename(xxx->value)
			}
		}
	}
}

みたいなコーディングを使ってます。

本当はこれでもRFCには準拠しないようですし、ファイル名が
日本語だと
JISコードで、MIMEエンコードされてますので注意が必要です 。



__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/