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

2689

  • 1000P

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

質問日時 / 2010年4月21日 19:23    回答数 / 13件

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

キーワード / キーワードが設定されていません

お世話になります。

以下ページの続きですが宜しくお願いいたします。
http://www.phppro.jp/qa/2688

PHP5.1.6では、以下ソースで問題なく送信できました。
ですが、PHP4.2.2の方では、何度やっても”送信できませんでした。”となります。
エラーが出るわけでも無いため、困り果てています。
ソースは動作確認後にもちろん修正しますが、何とか動作確認を取りたいのです。
何が悪いのか、心当たりがありましたら教えていただけないでしょうか?

  1. $mail['to']['name'] = '○○様';
  2. $mail['to']['mail'] = '00@***.com';
  3. $mail['from']['name'] = '××';
  4. $mail['from']['mail'] = '11@***.com';
  5. $subject = '添付ファイルテスト';
  6. $message = '添付ファイルテスト';
  7. $filename = '01.pdf';
  8. $attach_file = '01.pdf'; // 添付ファイル へのパス
  9. $mime_type = "application/octet-stream";
  10.  
  11. /****
  12.  * 関数定義
  13.  */
  14.  
  15. // mb_encode_mimeheaderのバグ対策用
  16. function mb_encode_mimeheader_ex($text, $split_count = 34) {
  17.     $position = 0;
  18.     $encorded = '';
  19.  
  20.     while ($position < mb_strlen($text, 'ISO-2022-JP')) {
  21.         if ($encorded != '') {
  22.             $encorded .= "\r\n ";
  23.         }
  24.         $output_temp = mb_strimwidth($text, $position, $split_count, '', 'ISO-2022-JP');
  25.         $position = $position + mb_strlen($output_temp, 'ISO-2022-JP');
  26.         $encorded .= "=?ISO-2022-JP?B?" . base64_encode($output_temp) . "?=";
  27.     }
  28.  
  29.     return $encorded;
  30. }
  31.  
  32. /****
  33.  * 以下、実際の処理
  34.  */
  35.  
  36. // 文字エンコードの設定
  37. mb_internal_encoding('UTF-8');
  38.  
  39. // マルチパートなので、パートの区切り文字列を指定
  40. $boundary = '----=_Boundary_' . uniqid(rand(1000,9999) . '_') . '_';
  41.  
  42. // 件名のエンコード
  43. $subject = mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8');
  44. $subject = mb_encode_mimeheader_ex($subject);
  45.  
  46. // 本文のエンコード
  47. $message = mb_convert_encoding($message, 'ISO-2022-JP', 'UTF-8');
  48.  
  49. // toをエンコード
  50. $to = mb_convert_encoding($mail['to']['name'], "JIS", "UTF-8");
  51. $to = "=?ISO-2022-JP?B?" . base64_encode($to) . '?= <' . $mail['to']['mail'] . '>';
  52.  
  53. // fromをエンコード
  54. $from = mb_convert_encoding($mail['from']['name'], "JIS", "UTF-8");
  55. $from = "=?ISO-2022-JP?B?" . base64_encode($from) . '?= <' . $mail['from']['mail'] . '>';
  56.  
  57. // 添付ファイルのエンコード
  58. $filename = mb_convert_encoding($filename, 'ISO-2022-JP', 'UTF-8');
  59. $filename = "=?ISO-2022-JP?B?" . base64_encode($filename) . "?=";
  60.  
  61. // ファイルを開く
  62. if ($handle = @fopen($attach_file, "r")) {
  63.    while (!feof($handle)) {
  64.        $attach_file .= fread($handle, 14096);
  65.    }
  66.    fclose($handle);
  67. }
  68.  
  69. $attach_file = chunk_split(base64_encode($attach_file), 76, "\n"); // Base64に変換し76Byte分割
  70.  
  71. // ヘッダーの指定
  72. $head = '';
  73. $head .= "From: {$from}\n";
  74. $head .= "MIME-Version: 1.0\n";
  75. $head .= "Content-Type: multipart/mixed; boundary=\"{$boundary}\"\n";
  76. $head .= "Content-Transfer-Encoding: 7bit";
  77.  
  78. $body = '';
  79.  
  80. // 本文
  81. $body .= "--{$boundary}\n";
  82. $body .= "Content-Type: text/plain; charset=ISO-2022-JP\n" .
  83.           "Content-Transfer-Encoding: 7bit\n";
  84. $body .= "\n";
  85. $body .= "{$message}\n";
  86.  
  87. // 添付ファイルの処理
  88. $body .= "--{$boundary}\n";
  89. $body .= "Content-Type: {$mime_type}; name=\"{$filename}\"\n" .
  90.          "Content-Transfer-Encoding: base64\n" .
  91.          "Content-Disposition: attachment; filename=\"{$filename}\"\n";
  92. $body .= "\n";
  93. $body .= "{$attach_file}\n";
  94.  
  95. // マルチパートの終了
  96. $body .= "--$boundary--\n";
  97.  
  98. if (mail($to, $subject, $body, $head)) {
  99.     echo '送信完了';
  100. } else {
  101.     echo '送信できませんでした。';
  102. }

Linux raq.nsk.dom 2.4.20-42.9.legacy #1 Sun Feb 20 14:08:04 EST 2005 i686 i686 i386 GNU/Linux
/usr/sbin/sendmail -t -i
PHPのバージョンUPは不可
PEARも利用不可

情報が不足しておりましたら、ご指摘下さい。
宜しくお願いいたします。

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



ツリー一覧

┣A01pannna現時点でPHP4.2.2の環境を構築出来ないので検証出来な
┃┣A01-1warashi4こんばんはpannnaさん。 > ファイルを添付しなかっ
┃┃┗A01-1-1fedora6php code is OK, I think Send mail is not OK. r
┃┗A01-2warashi4> $cat 添付ファイル | /usr/sbin/sendmail -t -i '送
┃ ┗A01-2-1fedora6cat 添付ファイル | /usr/sbin/sendmail -t -i '送信
┃  ┗A01-2-1-1warashi4こんばんはfedora6さん。 夜遅くまでありがとうござ
┃   ┗A01-2-1-1-1fedora6warashi4さん お疲れ様です。 I think your sen
┃    ┗A01-2-1-1-1-1warashi4fedora6さん。何度もありがとうございます。 PHPへ
┃     ┣A01-2-1-1-1-1-1fedora6warashi4さん  cat /home/sites/home/web/***/001.pd
┃     ┗A01-2-1-1-1-1-2pannnaこんな時間のレスですみません。 例としてあげている
┃      ┗A01-2-1-1-1-1-2-1warashi4お世話になります。 > phpソースに問題はなさそう
┗A02shimix#外しているかもしれませんが・・ php5.1.6のサー
 ┗A02-1warashi4こんばんはshimixさん。 "\r\n"に書き換えましたが結

回答一覧

並び替え:

A01 満足
answererpannna [4月21日 19:47] (最終編集:4月21日 19:51)

現時点でPHP4.2.2の環境を構築出来ないので検証出来ないのですが、
ファイルを添付しなかった場合などのケースで状況は変わるのでしょうか?

また、MTAがメールの送信が可能なように設定されていれば、
catコマンドでsendmailを実行してファイルを送信することも可能です。
pearが使えない、phpのバージョンも上げられないのでしたら
これでごまかすという手もあります(ただしお勧めは全くしません)。

$cat 添付ファイル | /usr/sbin/sendmail -t -i '送信先メールアドレス'

mimeに関係する部分は別ファイルとして記載し、nkfを介することで
マルチバイトも可能になると記憶しています

この意見に回答する

ツリーへ TOPへ

A01-1
replyerwarashi4 [4月21日 20:14]

こんばんはpannnaさん。

> ファイルを添付しなかった場合などのケースで状況は変わるのでしょうか?
そうですね、ファイルを添付しない、またその部分を削除しても同様でした。

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyerfedora6 [4月21日 20:35]

php code is OK,
I think Send mail is not OK.

run pannnaさん's command 
  1. cat /var/log/maillog | /usr/sbin/sendmail -t -i 'yourmail@xxx.com'

hava you Received mail?

show your maillog

  1. tail /var/log/maillog

よろしくお願いいたします

この意見に回答する

ツリーへ TOPへ

A01-2
replyerwarashi4 [4月21日 20:58]

> $cat 添付ファイル | /usr/sbin/sendmail -t -i '送信先メールアドレス'
これは、PHP内へ記述して実行するという事でしょうか?

よくわかってなくて申し訳ありません。

この意見に回答する

ツリーへ TOPへ

A01-2-1 満足
replyerfedora6 [4月22日 00:10]

cat 添付ファイル | /usr/sbin/sendmail -t -i '送信先メールアドレス'

is Linux command

you need to [telnet] or [ssh] into your system ,then run the command like dos command.

日本語は学んでいます,よろしくお願いいたします。

この意見に回答する

ツリーへ TOPへ

A01-2-1-1
replyerwarashi4 [4月22日 00:19]

こんばんはfedora6さん。
夜遅くまでありがとうございます。
このコマンドは[telnet]か[ssh]で実行するという事ですね?
PHPでの処理を考えていますので、もう少しこちらでも考えてみます。

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1 満足
replyerfedora6 [4月22日 00:37]

warashi4さん

お疲れ様です。

I think your senmail maybe some wrong(or not run),so you can run the command to test.

I have run you php script, it's ok.

よろしくお願いいたします。

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-1
replyerwarashi4 [4月22日 00:46]

fedora6さん。何度もありがとうございます。

PHPへの記述はこんな感じでしょうか?
cat /home/sites/home/web/***/001.pdf | /usr/sbin/sendmail -t -i '**@***.com';

上記ですと、エラーが出ます。
Parse error: parse error, unexpected T_STRING in /home/sites/home/web/***/001.php  on line 125

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-1-1 満足
replyerfedora6 [4月22日 01:25]

warashi4さん
 cat /home/sites/home/web/***/001.pdf | /usr/sbin/sendmail -t -i '**@***.com'

run it in linux system as Linux command, not in php script.

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-1-2 満足
replyerpannna [4月22日 03:11] (最終編集:4月22日 03:20)

こんな時間のレスですみません。
例としてあげているのはunixのcatコマンドですので、PHPではそのまま実行できません。
コンソール(telnetなど)から実行するためのものです。

PHPから実行したい場合は、system関数やexec関数を使用して下さい。

$command = "cat /home/sites/home/web/***/001.pdf | /usr/sbin/sendmail -t -i '**@***.com' &";
system($command);

のような感じになるでしょうか。
再度の&は別プロセスとして実行するためのオプション(のようなもの)です。
別プロセスとして実行しないと、system関数で実行した処理が終了するまで
PHP側に処理が戻りません。タイムアウトが発生する可能性があるので注意が必要です。

また、fedora6さんが何度かレスを付けて下さっていますが、
phpソースに問題はなさそうなので、catコマンドを使ってメール送信が出来ないか
テストをしてみて、と書かれていますね。こちらのテストはやってみたのでしょうか?

状況を見る限り、php4.2.2が動作しているサーバでは、
メールが送信できない状態になっているのではないかと思います。
サーバ管理者がいればすぐ確認できるはずなので、もしMTAの設定がされていないようならば
設定をしてもらうように依頼したほうがいいかと思います。

>fedora6さん
詳しい解説を付けて下さってありがとうございます。

thank you for the detailed account :)

…英語これであってるかな…(汗

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-1-2-1
replyerwarashi4 [4月22日 12:02]

お世話になります。

> phpソースに問題はなさそうなので、catコマンドを使ってメール送信が出来ないか
> テストをしてみて、と書かれていますね。こちらのテストはやってみたのでしょうか?
私にはFTPでの権限しか無いため、このテストはできません。

$command = "cat... も試してみましたが、ダメでした。
> 状況を見る限り、php4.2.2が動作しているサーバでは、
> メールが送信できない状態になっているのではないかと思います。
一度相手側と交渉してみます。

皆様、いろいろとありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02 満足
answerershimix [4月21日 21:22] (最終編集:4月21日 21:29)

#外しているかもしれませんが・・

php5.1.6のサーバとsendmailのバージョンは同じでしょうか?

改行が"\n"のみになっているようですが、"\r\n"に置換しても変化ありませんか?RFCでの改行の記載はCRLFになっていたと思うので、厳密なメールサーバでは「LFのみ」は改行として扱わない可能性があります。

#自分が書くときは"\r\n"だなぁ・・と思ったので(汗


(追記)
RFC2821を読む限り、メール送信側はデータ中の改行は「必ず <CRLF> というシーケンスとして送信しなければならない(MUST)」 となっていますから、もし今回の件に関係なくてもCRLFにすべきですね。まぁLFのみでも改行として扱うメールプログラムの方が実装としては多いんでしょうけど(汗

この意見に回答する

ツリーへ TOPへ

A02-1
replyerwarashi4 [4月21日 21:41]

こんばんはshimixさん。
"\r\n"に書き換えましたが結果は同じでした。

sendmailのバージョンはPHP4.2.2の方はちょっとわからない(調べられない)のですが、かなり古いサーバーです。
5.1.6の方はqmailです。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

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

>>続きを読む

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

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