PHPの画像メール解析について質問させていただきます。


現在、PEARのmimeDecodeを利用しながら画像メールを受信し、保存する開発を行っております。

画像、テキストを解析して保存することはできたのですが画像を保存する際に
パスの指定が../のような相対パスでは保存できなかったため、こちらがなぜなのかわからず知見のある方にお聞きしたい次第です。

開発環境
php5.3.8
postfix 2:2.3

保存先ディレクトリ
/var/www/html/app/image/

メール解析用のphpが保管されているディレクトリ
/var/www/html/app/mail/mail.php


× mail.php→$image_path内で保存できなかったときの指定
../image/

◎ mail.php→$image_path内で保存できたときの指定
/var/www/html/app/image/

なぜこの指定をしなければいけないのかがわからず、要因がわかれば教えて頂きたくよろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/12/01 22:10:34
  • 終了:2011/12/04 23:07:10

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492011/12/01 22:46:43

ポイント70pt

相対アドレスが使えなくて、さらに「保存先ディレクトリ」や
「phpが保管されているディレクトリ」とあわせての想像ですが・・・

CakePHPなどのフレームワーク使ってませんか?
だとすれば、「サーバーサイドでURLのReWriteが行われるために、
相対アドレスでは正常に動かない」と合点もいくのですが・・・

フレームワークなどを用いている場合は、例えば、
「CakePHP 相対パス」といったような具合に検索すると良いでしょうし、
返信欄に書き込んで回答を待ってみてもいいでしょう

他3件のコメントを見る
id:windofjuly

>postmail

tdoiさんのほうへの返信読みました

tdoiさんのおっしゃるとおりですね
phpの実体が存在する場所と、phpが動作している場所の違いです

getcwd はphpが動作しているディレクトリを返します
dirname(__FILE__) はphpの実体が存在するディレクトリを返します

/var/www/html/app/mail/ を基準にするならば、

$image_path = dirname(__FILE__) . "/../image/" . $image_name;
2011/12/01 23:16:24
id:kuso47

ありがとうございます、確認してみました。
getcwdでみたところカレントのワーキングディレクトリが
/var/spool/postfix
となっていました。これはpostfix側のワーキングディレクトリ?だと思うので、
これだと保存先の指定がおかしい扱いになりますね。。。

dirname(__FILE__)
をおこなってみたところ

/var/www/html/app/mail
とでまして、phpが実態するディレクトリがでてきました。

無事理由がわかりまして大変参考になりました。

ありがとうございました。

2011/12/02 12:36:05

その他の回答(1件)

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752011/12/01 22:41:56

ポイント30pt

PHPではなく、OS的な問題かと。
恐らく、procmailかなんかでphpスクリプトを起動してるんでしょうが、その辺りの仕組み次第でしょう。

ようは、「.」つまり、カレントディレクトリがどこの状態で動作しているかです。
スクリプトのあるディレクトリ以下としてやりたければ、

$image_path = dirname(__FILE__) . "/" . $image_name;


とでもすればよいかと。

id:kuso47

ありがとうございます、一度試してみます。phpスクリプトは/etc/aliasesで特定のアドレス宛にメールが来た時に作動するようにしています。

postmail: "| /usr/bin/php -q /var/www/html/app/mail/mail.php

procmailというのも知らなかったため調べてみます。。

2011/12/01 22:52:52
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492011/12/01 22:46:43ここでベストアンサー

ポイント70pt

相対アドレスが使えなくて、さらに「保存先ディレクトリ」や
「phpが保管されているディレクトリ」とあわせての想像ですが・・・

CakePHPなどのフレームワーク使ってませんか?
だとすれば、「サーバーサイドでURLのReWriteが行われるために、
相対アドレスでは正常に動かない」と合点もいくのですが・・・

フレームワークなどを用いている場合は、例えば、
「CakePHP 相対パス」といったような具合に検索すると良いでしょうし、
返信欄に書き込んで回答を待ってみてもいいでしょう

他3件のコメントを見る
id:windofjuly

>postmail

tdoiさんのほうへの返信読みました

tdoiさんのおっしゃるとおりですね
phpの実体が存在する場所と、phpが動作している場所の違いです

getcwd はphpが動作しているディレクトリを返します
dirname(__FILE__) はphpの実体が存在するディレクトリを返します

/var/www/html/app/mail/ を基準にするならば、

$image_path = dirname(__FILE__) . "/../image/" . $image_name;
2011/12/01 23:16:24
id:kuso47

ありがとうございます、確認してみました。
getcwdでみたところカレントのワーキングディレクトリが
/var/spool/postfix
となっていました。これはpostfix側のワーキングディレクトリ?だと思うので、
これだと保存先の指定がおかしい扱いになりますね。。。

dirname(__FILE__)
をおこなってみたところ

/var/www/html/app/mail
とでまして、phpが実態するディレクトリがでてきました。

無事理由がわかりまして大変参考になりました。

ありがとうございました。

2011/12/02 12:36:05
  • id:kuso47

    以下はmail.phpの保存ソースです。解析部分は割愛しております。

    // 画像を一意な名前にするためにuniqidを利用
    $uniq = uniqid();
    // 保存する画像名
    $image_name = $uniq . "." . $type;
    ※$typeはメール解析でとってきた拡張子を利用しています。

    // 保存先の指定
    $image_path = "/var/www/html/app/image/" . $image_name;

    $fp = fopen($image_path,"wb");
    fwrite($fp,$binary);
    fclose($fp);
    chmod($image_path, 0777);

    ※$binaryはメールでとってきたファイルデータ

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません