Postfixで受信したメールをパイプでPHPに渡し、Fromアドレス、件名、本文をDBに格納、添付ファイルを指定フォルダに保存するプログラムを作っているのですが、画像保存だけがうまくいかず困っています。


以下画像保存部分のソースです。
ここにくるまで、受信メールのFromアドレス、件名、本文、添付ファイルのファイル名の取得やデコードも問題なくでき、DBに格納することができています。
しかし、fwriteのところだけがうまく動作しません。

$fp = @fopen($tmpdir.$filename, "w+");
flock($fp,2);
fwrite($fp, $tmp);
flock($fp,3);
fclose($fp);


OSはFedoraCore6、PHP5、画像を保存するフォルダは777にしています。
Postfixのdefault_privsをnobodyやapacheにしたりもしましたが、だめでした。

添付ファイルのファイル名の取得などが問題がなくできているのに、画像の保存だけできないというのがどうも理解できません。PHPではなくOSの問題ような感じもするのですが、どのような問題があると考えられるでしょうか?
よろしくおねがいいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/07/04 19:35:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:t_shiono No.1

回答回数256ベストアンサー獲得回数22

ポイント35pt

ログは何か出ていますか?

どの部分で失敗しているのか分からないので、この情報だけだと、想像の域を出ないのですが、SELinuxが有効になっていると、このような現象が起こる可能性があるかと思います。

画像の保存場所を、/tmp以下や、/home以下など変えてみて、ディレクトリによって成功、失敗が変わるようであれば、この原因が高いかと思います。

いかがでしょうか?

http://www.selinux.gr.jp/

id:dadadadan

回答ありがとうございます。

SELINUXはdisabledにしてあります。

違うプログラムですが、POPで接続してメールを受信してくるものは動作しています。

Postfixからパイプで動作させると保存だけがうまくいきません。

ちなみにログとはどのログを見ればいいのでしょうか?

apacheのログには何もでてきません。

Postfixのログは

Jun 28 10:45:54 localhost postfix/local[10369]: 258041BF8038: to=<to@123.com>, orig_to=<alias@123.com>, relay=local, delay=0.43, delays=0.04/0/0/0.39, dsn=2.0.0, status=sent (delivered to command: /usr/bin/php /var/www/***/mail_syori.php)

Jun 28 10:45:54 localhost postfix/qmgr[1033]: 258041BF8038: removed

となっていて、メールの受け渡しはうまくやっているようです。

2007/06/28 10:58:00
id:toohigh No.2

回答回数291ベストアンサー獲得回数37

ポイント35pt

php のログ出力を確認してみる、が必要かと思います。ログファイルの場所は php.ini で指定されているかと。

ソースを見る限り $tmp として出力データ全体が一旦メモリ上に置かれる仕組みかと思いますので、php 側でメモリ利用量の制限などがかかっているのが原因かな、という気がします。時々やってしまいがちな点ですので・・。その場合は添付ファイルを十分小さいものにすればうまくいったりするのかもしれません。あくまでも切り分けの手段として、ですが。

あと、同じメールについて試してみた結果、パイプ起動だと失敗&POP3経由だと成功、になっているのでしょうか。

http://sb.xrea.com/archive/index.php/t-8285.html

id:dadadadan

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

返信が遅くなりもうしわけございません。

添付しているファイルは10K程度なので、メモリの制限などはないと思います。

PHPのログを見てみたところこのようなエラーが出ていました。

[03-Jul-2007 11:31:50] PHP Warning: flock() expects parameter 1 to be resource, boolean given in /var/www/***/mail_syori.php on line 296

[03-Jul-2007 11:31:50] PHP Warning: fwrite(): supplied argument is not a valid stream resource in /var/www/***/mail_syori.php on line 297

検索してみたりもしましたが、ちょっと意味が分かりません。

どのようなことが言えるのでしょうか?

それから、同じメールでパイプ失敗&POP成功です。

2007/07/03 20:43:45
  • id:t_shiono
    ログという言い方は分かりにくかったです。すいません。

    恐らく起動するコマンドは、

    |/xxx/yyy/foo.sh

    などとなっていて、

    foo.shで

    php /path/to/script/foo.php >> /path/to/log/foo.log

    のようにしているという仮定でログといっておりました。
    もし、このような形になっていなければ、このようにしてみてはいかがでしょうか?つまり、phpプログラムの実行の際の出力は何か出ていますか?


    あと、実際のメールをテキストファイル(mail.txt)に書き出して、

    php /path/to/script/foo.php < mail.txt

    などとやるとどうなりますか?
  • id:dadadadan
    コメントありがとうございます。
    返信が遅れて申し訳ございません。

    php /path/to/script/foo.php < mail.txt

    をやってみたのですが、
    メールの内容が書き込まれました。
    一部抜粋すると、

    Content-Type: text/plain; charset="US-ASCII"
    Content-Transfer-Encoding: 7bit

    test
    --------_46779F2175840621C008_MULTIPART_MIXED_
    Content-Type: image/jpeg;
    name="01.jpg"
    Content-Disposition: attachment;
    filename="01.jpg"
    Content-Transfer-Encoding: base64

    /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAcEBAQFBAcFBQcKBw…

    このようになっており、以下添付ファイルの文字列が続いているので、
    ファイルの読み込みもできているようです。
  • id:t_shiono
    以下のログの件は、fopenが失敗しているのが原因だと思います。

    [03-Jul-2007 11:31:50] PHP Warning: flock() expects parameter 1 to be resource, boolean given in /var/www/***/mail_syori.php on line 296

    [03-Jul-2007 11:31:50] PHP Warning: fwrite(): supplied argument is not a valid stream resource in /var/www/***/mail_syori.php on line 297

    おおよそ、次のようなコードになっているのだと思うのですが、

    $resource = fopen("/path/to/file", "w+");
    flock($resource, LOCK_EX);
    fwrite($resource ...)

    fopenはファイルのオープンに失敗するとFALSE(boolean値)が返るので、

    flock(FALSE, LOCK_EX)

    のようになり、このWarningとなっています。

    fopenが失敗しているのであれば、マニュアルによると、E_WARNINGレベルのエラーが発行されているはずです。
    現状で、表示されていないとのことなので、error_reportingでエラーレベルを設定して実行してみてはいかがでしょうか?

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

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

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

回答リクエストを送信したユーザーはいません