• ベストアンサー

メールフォームから大きめの添付ファイル送信したら有効期限切れページになる

Pealで書かれたメール送信フォーム(添付ファイル送信機能付き)から大きめの添付ファイルを送信したら、「ページを表示できません。」というエラーページか、有効期限切れページになってしまいます。 ただし、送信先にメールと添付ファイルはちゃんと送られています。 小さめのファイルであれば、問題なく送信後の送信済み画面に切り替わります。 Pealのソースを見ているのですが、待機時間を持っているようなところが見当たりません。 どのくらいまでのファイルサイズを許可するかを指定するところはあるので、そこには大きめのサイズを指定しています。 どのあたりを探れば、改善できそうですか? お分かりになる方がいらっしゃいましたら、お教え下さいませ。

  • THUBAN
  • お礼率76% (771/1002)
  • Perl
  • 回答数5
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.5

> “Internal Server Error”が表示されてしまいました。 それでは何が悪いのか分かりません。構文エラーでないことは確認しましたか?後はサーバーのエラーログを見るとか、use CGI::Carp 'fatalsToBrowser'; するなどして原因を特定して下さい。 また、改良後のスクリプトを見ると「送信済み画面」の出力部分がないのですが、もしかすると sendmail の中だったりしますか?名前からするに「メールの送信だけを行う関数」かと思っていたのですが・・・ もしそうならメール関連の部分(添付ファイルの処理を含むメールの生成から送信まで)だけを別関数にして、そこを子プロセスに実行させるようにして下さい。画面出力は全て親プロセスの仕事になります。 それと、スクリプト中の「# 何らかのエラー処理を書く」の部分には &error("子プロセスの生成に失敗しました"); などと書いて下さい。単にコピーしただけではダメです。 # ちなみに、No.4 の回答内のスクリプトをそのままコピーしたってことはないですよね?見やすさのためにインデントに全角空白で書いているので、それをタブまたは半角空白に置換しないと構文エラーになります。

THUBAN
質問者

お礼

まず、「送信後の画面表示」出力部分も sendmail の中でした。 そして、一部、全角空白が入っていたせいもありました。 失礼いたしました。 よって、 ・テキスト情報送信準備 ・添付ファイル送信準備 ・メール送信 を子プロセスに入れて、 ・送信情報保存ファイル書込み ・送信後の画面表示 は、親プロセスのままにしました。 そして、実行すると、見事上手くいきました。 添付ファイルを付けても、すぐ送信後の画面表示がされ、送信済みとなります。 しかし、10MB近くの大きいファイルを添付すると、ファイルサイズが0で送信されてしまうこともありました。(上手く送信されていることもあった) ただ、目的はほぼ達成できましたので、これで行こうと思います。 今回は勉強にもなりました。 どうもありがとうございました。

その他の回答 (4)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

CGIで重い処理をする場合、その処理を子プロセスに任せてしまう、というのも手です。 sendmailという関数が重いのなら、その呼び出し部分を   &sendmail; から、   my $pid = fork;   if (!defined $pid) {  # fork失敗     # 何らかのエラー処理を書く   }   elsif (!$pid) {      # 子プロセス     # ブラウザとの通信と関わりを断つ     close STDOUT;     close STDERR;     # 重い処理     &sendmail;     exit;   } のような感じに変えます。 親プロセスは子プロセスの終了を待ちませんが、問題はありません。 この方法は変数の引継ぎなどの問題で単純にスクリプトを切り離せない場合にも有効です。

THUBAN
質問者

お礼

ご回答ありがとうございます。 まさに単純に切り出せないで困っておりました。 ただ、メイン処理では「&sendmail();」しか呼んでないんです。 sendmail関数の中で添付ファイルをアップロードしているサブルーチンを呼んでいるのですが、 そのサブルーチンで時間がかかっているのかもしれません。 ちなみに、ご教授いただいた内容を元にスクリプトに手を加えて実行してみましたが、 “Internal Server Error”が表示されてしまいました。 コードの書き方が間違っているのでしょうか? 以下のように修正しました。 ### メイン処理(改良前) &decode(); if ($in{'mode_sys'} eq 'send') {  &sendmail(); } &error("不正なアクセスです"); ### メイン処理(改良後) &decode(); if ($in{'mode_sys'} eq 'send') {  my $pid = fork;  if (!defined $pid) { # fork失敗   # 何らかのエラー処理を書く  }  elsif (!$pid) {  # 子プロセス   # ブラウザとの通信と関わりを断つ   close STDOUT;   close STDERR;   # 重い処理   &sendmail;   exit;  } } &error("不正なアクセスです");

回答No.3

この場合、cgiではなくシェルスクリプトとして実行する訳ですから、拡張子はplなどの方が良いのではないですか?拡張子付けのルールをどうしているかにもよりますが。 &はシェルで「バックグラウンドで実行」の意味です。コマンドの末尾につけます。コマンドラインからコマンド名を入力して実行する時に&を末尾に付ける事で、バックグラウンドで実行され制御がすぐコマンドラインに戻ってきます。この同じ動作をSYSTEM関数で行うという事です。&はコマンド文字列の末尾、つまり""の中に付けて下さい。 実はperlではこういう事した事ないのですが、phpでできるので同じじゃないかな、と思います。

THUBAN
質問者

お礼

ありがとうございました。 ただ、切り出す処理の中でサブルーチンを呼んでいたりしてるので、 単純に切り出せなくて困ってしまいました。

回答No.2

非同期処理といっても大した事はなくて、時間の掛かるプロセスを別なスクリプトで書いて、system関数などで呼び出すというものです。この時、コマンドの末尾に"&"を付けるとバックグラウンド実行となって制御がすぐ戻ってきます。

THUBAN
質問者

お礼

ありがとうございます。 Pealのコードを見るに、どうやら   sub sendmail {   ・・・} のメール送信部分で時間がかかっていると思われるので、   sub sendmail {   ・・・} 部分を、別のファイル(xxx.cgi)に切り出しました。 そのファイル(xxx.cgi)を、system関数で呼んで実行させたいのですが、 記述は「system("xxx.cgi");」でよろしいのでしょうか? コマンドの末尾に"&"を付けるというのは、具体的にどこに付けるのでしょうか? 「system&("xxx.cgi");」でしょうか? それとも「system("xxx.cgi"&);」もしくは「system("xxx.cgi")&;」 でしょうか?

回答No.1

ブラウザがタイムアウトしてしまったのではないでしょうか。 ブラウザはリクエストを送ったサーバーから一定時間返答が何も無ければ「タイムアウトエラー」と判断してエラーページを表示します。その画面でリロードなどを行えば「有効期限切れエラー」が表示されるはずです。サーバー側では、ブラウザがタイムアウトをしたなんて情報を得る事はできないので、処理は続行します。そのため、メールは送られるがブラウザでエラーが出るという現象になっているのだと思います。 タイムアウトまでの時間は個々のクライアントの設定によるところなので、スクリプトで変更する事はできません。回避するとしたらスクリプトの構造を変えて時間の掛かる処理を非同期(処理の終了をスクリプト側で待たない)方法で行うか、細々とブラウザに対して画面の出力を行って、ブラウザがタイムアウトしないようにするしかありません。

THUBAN
質問者

お礼

ご回答ありがとうございます。 まさにそうだと思います!そんな感じの動きです。 ちなみに、Pealの非同期処理とは、どんなものがありますか? CやVB.NETでは、ちょっとスレッド処理とかやったことはありますが、Pealではないので・・・ 非同期部分を、別のスクリプト(PHPなど)で書いた方がいいですかね? もし、ご存知であれば、アドバイス下さいませ。

関連するQ&A

  • 添付ファイルを送信できるCGIメールフォーム。

    文章と添付ファイルを送信できるCGIメールフォームを探しています。 レンタルではなく、CGIを配布しているサイトで、できれば無料が良いです。 デスクトップ壁紙などの大きなファイルも送信できるメールフォームが良いです。サーバーは2000MBありますので特に問題はないと思います。 オススメのがありましたら教えてください。

    • ベストアンサー
    • CGI
  • ページの有効期限切れ といわれます

    bottonを押した時に、Windowのclose()で元のページを閉じる 処理を実行していますが、 警告 : ページの有効期限切れ 要求したページは、フォームで送信 された情報を使用して作成されました。このページは、もう利用できません。セキュリティ保護のため、情報は自動的には再送信されません。 情報を再送信し、この Web ページを表示するには、ツール バーの [更新] ボタンをクリックしてください。 というメッセージが表示されます。 これを確実に防ぐにはどうすれば、いいでしょうか。 history(-5) も実行してみましたが、同じ結果でした。

  • CGIを使わない添付ファイルつきメールフォームについて

    添付ファイルつきメールフォームのことで困っています。 ホームページスペースはFC2<http://web.fc2.com/>です。しかし、ここはcgiが利用不可です。 無料のレンタルフォームも探しましたが、500KBまでなどサイズが小さく(画像を送信してもらい為、5MBは必要です。)残念ながら利用できません。 cgiを使わずに、添付ファイルつきのメールフォームを作成するにはどんな方法がありますか?? ※家族向けのホームページで、メンバーの家族の画像をメールフォームを使って送ってもらいたいと思っています。

  • PHPメールフォームから添付ファイルが送信できない

    お世話になります ─────────────────────────────── 「PHP 添付ファイルを送信できるメールフォームを作成しました。」 http://web-dev.xyz/php-originalmailform/ ─────────────────────────────── 上記のページよりダウンロードして、 当方のホームページのhtmlに埋め込んで、 本文やラジオボタンの送受信は出来るのですが、 添付ファイルの送受信が出来ません。 ─────────────────────────────── 初期設定のままでは送受信することが出来ないのでしょうか。 Gmailのアカウントを2つ持っていて両方とも試しましたが、 やはり添付ファイルの送受信だけが出来ませんでした。 ご確認のほどよろしくお願いします

    • ベストアンサー
    • PHP
  • 「警告:ページの有効期限切れ」となるのを回避するには?

    ブラウザからファイルのアップロードを行うCGIを作ったのですが、 「警告:ページの有効期限切れ」と表示されます。 どうも<input type=file>でファイルを送信している場合に有効期限切れになるようです。 宜しくお願い致します。

    • ベストアンサー
    • CGI
  • 添付ファイルつきメールの送信

    添付ファイルをつけてメールを送信したいのだが,送信が出来ない.添付ファイルのサイズは50MBを超えるとどうやら送信できないようである.尚,OSはWindowsNT4.0を使っており,メールクライアントソフトはOutlook Express 5.0を利用している.

  • フォームメールにファイルを添付させるには?

    PHPで作成したフォームに複数の画像及びドキュメントファイル(.doc)を添付してメールにて送信させたいのですが、どのようにすればよいでしょうか? 入力欄又は選択欄のみのPHPフォームなら作成したことがあるのですが、ファイルを添付させるやり方がわかりません。 以下に何が分からないか詳細を説明します。 1)フォームの添付ファイル入力欄にはどのようなものを使用すればよいのでしょうか?<input type="file">などのような気はしますが、これで複数のファイルを選択できるのでしょうか?また、一つのフォームに添付ファイル入力欄を複数設置することは可能なのでしょうか?複数設置することができるとした場合、それらの入力欄で選択されたファイルをメールに添付したとき、一つのメール内で入力欄(フォームの)ごとに添付ファイルを区分けする方法はあるのでしょうか? 2)フォームの添付ファイル入力欄で選択したファイルデータをphpファイル間でどのように受け渡すのでしょうか? 通常の<input type="hidden" name="example" value="<?php echo $example ?>">(データの受け渡し)と$package = trim($_POST["example"]);(データの受取)の組み合わせでよいのでしょうか? 3)添付ファイルが選択されているかどうかのチェキングは、どのようなコードを使用するのでしょうか?また、gif、jpg、docファイルのうち、どの拡張子のファイルが幾つ添付されているかの値も知りたいのですが。 4)添付ファイルデータを電子メールで送信する関数は、どのようなものになるのでしょうか?現在は、mail($to, mb_encode_mimeheader($subject,"JIS","B"), mb_convert_encoding($content,"JIS"), "From:$email")を使用しています。 よろしくお願いします。

    • 締切済み
    • PHP
  • 戻ると「ページの有効期限切れ」が常に出てしまう。

    教えてください。『「ページの有効期限切れ」 要求したページは、フォームで送信された情報を使用して作成されました。このページは、もう利用できません。セキュリティ保護のため、情報は自動的には再送信されません。 情報を再送信し、この Web ページを表示するには、ツール バーの [更新] ボタンをクリックしてください。 』OSはwindowsXPです。IEを利用しています。 常にこの文章が出てしまい。いちいち更新を押さなくては進まないのです。この文章が出ない設定などありましたら教えてくれませんか?お願いします。

  • HTMLメールで添付ファイルがついてしまう

    Win2000のOutlookExpressでHTMLメールを作成しました。 画像はダイレクトアドレスで指定しています。 ところが送信すると画像ファイルが添付されてしまいます。 作り方としてはエディターで作成し、ソースをアウトルックのHTMLメール作成でリッチテキスト形式で下のソースタブをクリックしてそこに貼り付けています。 自分宛に送信したら添付で画像ファイルがついてきてしまいました。ダイレクトに画像を指定しているのに何故添付がついてしまうのでしょうか? 添付をさせないようにはできますか? 受信したメールのソースを見て気が付いたのですが、自分は指定していない変なソースがくっついていました。 ■自分が指定したもの <img src="http://●●●.com/●●●.gif" > ■受信メールのソース <IMG src="mhtml:mid://00000580/!http://●●●●.com/●●●.gif" > 【mhtml:mid://00000580/!】が見覚えのないソースなのですが、これは自動てついてしまうのでしょうか? また、添付にしたくない場合は、その都度【】内のソースを削除してから送信しなければいけないのでしょうか? ご存知の方いらっしゃいましたら教えてください。 どうぞよろしくお願いします。

    • ベストアンサー
    • HTML
  • 「ページの有効期限切れ」について

    お世話になります。 同様の質問が多々あり根本的な解決に至っていませんでしたので、質問させて頂きます。 現在、ASP.NETでファイルをアップロードする画面を作成しています。 アップロード後に結果画面に遷移しています。 現象としては・・・ 結果画面からブラウザの[戻る]ボタンまたはjavascriptのhistory.back()を使用すると「ページの有効期限切れ 」と表示されてしまいます。 原因としては・・・ IEでは、フォームにファイルフィールド(<input type="file">)を使用している場合、次のページがキャッシュされないため、「戻る」ボタンを押したときに「ページの有効期限切れ 」になってしまう。 ※IEの仕様 対策として・・・ 過去の質問などから以下の2つを考えています。 1.IEを使用しない。または「ページの有効期限切れ 」でブラウザの[更新]ボタンを押下する。 2.ブラウザの[戻る]ボタンを使わせず、history.back()を使用していたボタンを直接、前画面に遷移するボタンに変更する。 そこで質問なのですが、上記の2つ以外での対応策はあるのでしょうか?

専門家に質問してみよう