PHPのファイル添付機能付きメールフォームについて - PHPプロ!Q&A掲示板

2688

  • 1000P

PHPのファイル添付機能付きメールフォームについて

質問日時 / 2010年4月21日 11:26    回答数 / 7件

Questioner:  warashi4  このエントリーをはてなブックマークに追加 

キーワード / メールフォーム    ファイル添付    PHP4.2.2   

こんにちは。
PHPのファイル添付機能付きメールフォームについて教えて下さい。

PHP4.2.2で、PEAR、file_get_contentsが使えません。
この状態でファイル添付機能付きメールフォームを使いたいのですが、例えば以下ページの
http://www.phppro.jp/qa/596
weekendphpさんのサンプルでfile_get_contentsfile()関数に置き換えてみたのですが、
”送信できませんでした。”となります。

自分の知識では、原因がわかりません。
チェックすべき箇所を教えていただけないでしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01yuu_a0マニュアルによると、file がバイナリセーフになった
┃┗A01-1warashi4こんにちはyuu_a0さん。 yourfile...の部分は、ファ
┣A02shimixfile_get_contentsが使えなければfopenしてfreadでも
┃┗A02-1warashi4こんにちはshimixさん。 バージョンについては、私も
┃ ┗A02-1-1fedora6//check sendmail 1 [ooo@ooo]# mail -v -s "test
┗A03fedora6Package Information: PHP_Compat http://pear.php.n
 ┗A03-1warashi4こんにちはfedora6さん。 内容を理解するのに少し時

回答一覧

並び替え:

A01 満足
answereryuu_a0 [4月21日 11:55]

マニュアルによると、file がバイナリセーフになったのは、PHP 4.3.0 以降。PHP 4.2.2 の時点ではバイナリファイルは正しく読むことができないので、地味に読み込むしかないと思います。

  1. <?php
  2. $attach_file = '';
  3. if ($handle = @fopen('yourfile...'"r")) {
  4.    while (!feof($handle)) {
  5.        $attach_file .= fread($handle4096)// 読み込みに失敗する場合はサイズを調節してください。
  6.    }
  7.    fclose($handle);
  8. }
  9. ?>


file 関数って バイナリがデフォルトだったのは知らんかった。
[quote]
  FILE_BINARY
    コンテンツをバイナリデータとして読み込みます。 これはデフォルトの設定で、 FILE_TEXT と同時に使用することはできません。 
[/quote]

この意見に回答する

ツリーへ TOPへ

A01-1
replyerwarashi4 [4月21日 13:11]

こんにちはyuu_a0さん。
yourfile...の部分は、ファイルへのパスでよろしかったですね?
試してみましたが、結果は同じでした。

ファイルが読み込めてないという事でしょうか?

この意見に回答する

ツリーへ TOPへ

A02 満足
answerershimix [4月21日 11:55]

file_get_contentsが使えなければfopenしてfreadでもいいとは思いますが、そもそも(セキュリティ的に)4.2.2というバージョンはどうなんでしょう・・。

>”送信できませんでした。”となります。

mail関数の戻りがfalseですから、引き渡している変数($to, $subject, $body, $head)をファイルに書き出すなどしてチェックしてみてはどうでしょう。

あと・・。お使いの環境でmail関数がsendmailなのかSMTPなのかくらいの情報は欲しいです。もしwindows版であれば下記のような制限がありますし・・

  http://www.php.net/manual/ja/function.mail.php

-------   引用ここから   -------
mail() の Windows 版実装は、Unix 版実装とは 多くの点で違います。 第一に、メッセージの生成に
ローカルのバイナリは使用せず、 ソケットを通じて直接操作するだけです。 これは MTA がネットワー
クソケットを listen している 必要があるということを意味します(ローカルホスト、リモートマシンどち
らでもかまいません)。
第二に、 From: や Cc:・ Bcc:・ Date: のようなカスタムヘッダは MTA ではなく PHP によってパー
スされます。
そのため、to 引数には "Something <someone@example.com>" 形式の メールアドレスを与える
ことはできません。 MTA と通信する際に mail コマンドはこれを適切にパースできません。 
-------   引用ここまで   -------

この意見に回答する

ツリーへ TOPへ

A02-1
replyerwarashi4 [4月21日 13:18] (最終編集:4月21日 13:32)

こんにちはshimixさん。
バージョンについては、私も頭を悩ませていますが、取引先であるため何ともなりません。

> 引き渡している変数($to, $subject, $body, $head)をファイルに書き出す
echo $to;
が以下のように表示されました。
=?ISO-2022-JP?B?GyRCIXshe01NGyhC?=
この辺に原因がありそうですね。

スミマセン。sendmailです。
OSです。
Linux raq.nsk.dom 2.4.20-42.9.legacy #1 Sun Feb 20 14:08:04 EST 2005 i686 i686 i386 GNU/Linux

P.S. ちなみに、PHP5.1.6のサーバーですとすんなり行きます。
こちらでも表示は同じでした。
echo $to;
が以下のように表示されました。
=?ISO-2022-JP?B?GyRCIXshe01NGyhC?=
問題無いって事ですね?

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyerfedora6 [4月21日 13:34]

//check sendmail

1
[ooo@ooo]# mail -v -s "testmail" xxx@xxx.com < message.txt


/usr/lib/sendmail -bp

この意見に回答する

ツリーへ TOPへ

A03 満足
answererfedora6 [4月21日 12:36]

Package Information: PHP_Compat
http://pear.php.net/package/PHP_Compat

  1. echo php_compat_file_get_contents("/var/www/html/attach_file.txt");
  2.  
  3.  
  4. function php_compat_file_get_contents($filename, $incpath = false, $resource_context = null)
  5. {
  6.     if (is_resource($resource_context) && function_exists('stream_context_get_options')) {
  7.         $opts = stream_context_get_options($resource_context);
  8.     }
  9.     
  10.     $colon_pos = strpos($filename, '://');
  11.     $wrapper = $colon_pos === false ? 'file' : substr($filename, 0, $colon_pos);
  12.     $opts = (empty($opts) || empty($opts[$wrapper])) ? array() : $opts[$wrapper];
  13.  
  14.     switch ($wrapper) {
  15.     case 'http':
  16.         $max_redirects = (isset($opts[$wrapper]['max_redirects'])
  17.             ? $opts[$proto]['max_redirects']
  18.             : PHP_COMPAT_FILE_GET_CONTENTS_MAX_REDIRECTS);
  19.         for ($i = 0; $i < $max_redirects; $i++) {
  20.             $contents = php_compat_http_get_contents_helper($filename, $opts);
  21.             if (is_array($contents)) {
  22.                 // redirected
  23.                 $filename = rtrim($contents[1]);
  24.                 $contents = '';
  25.                 continue;
  26.             }
  27.             return $contents;
  28.         }
  29.         user_error('redirect limit exceeded', E_USER_WARNING);
  30.         return;
  31.     case 'ftp':
  32.     case 'https':
  33.     case 'ftps':
  34.     case 'socket':
  35.         // tbc               
  36.     }
  37.  
  38.     if (false === $fh = fopen($filename, 'rb', $incpath)) {
  39.         user_error('failed to open stream: No such file or directory',
  40.             E_USER_WARNING);
  41.         return false;
  42.     }
  43.  
  44.     clearstatcache();
  45.     if ($fsize = @filesize($filename)) {
  46.         $data = fread($fh, $fsize);
  47.     } else {
  48.         $data = '';
  49.         while (!feof($fh)) {
  50.             $data .= fread($fh, 8192);
  51.         }
  52.     }
  53.  
  54.     fclose($fh);
  55.     return $data;
  56. }

この意見に回答する

ツリーへ TOPへ

A03-1
replyerwarashi4 [4月21日 13:31]

こんにちはfedora6さん。
内容を理解するのに少し時間がかかりそうです。
まだ勉強中の身で申し訳ありません。参考にさせていただきます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)