CGIでメール送信とファイル転送をする方法とは?

このQ&Aのポイント
  • CGIを利用して、メール送信とファイル転送を行いたい。
  • 一応動いているが、最後の確認ページが表示されない。
  • 原因は基本的なことを無視している可能性がある。
回答を見る
  • ベストアンサー

CGIで二つの仕事をしたい

464487で質問したOtanoshikeです。 メール送信CGIは_mer_さんに教えて頂いたように直したら、無事動くようになりました。 今度は、このCGIの中で、メール送信後にファイル転送をしようとしています。 一応動いてはいるようなのですが、最後の確認ページが出ません。 どこが悪いのでしょうか?恐らくはまた基本的なことを無視しているのでしょうね。 よろしくお願いいたします。 (a.cgi) #!/usr/bin/perl require '../mimew.pl'; require '../jcode.pl'; $sendmail = "/var/qmail/bin/sendmail"; $master_id = "ho\@hoge.net"; $msg="メッセージ"; &jcode'convert(*msg,'jis'); open (ML,"| $sendmail $master_id"); print ML $msg; close(ML); $filename=$ARGV[0]; $file="/~/~/$filename"; $filetype='x-exe'; print "Content-Disposition:attachment;filename=\"$filename\"\n"; print "Content-type:application/$filetype\n\n"; open(FILE,"$file"); while(<FILE>){ print "$_"; } close FILE; print "Content-type: text/html\n\n"; print "<html><head>\n"; print "</head>\n"; print "<body>sent.\n"; print "</body></html>\n"; exit;

  • CGI
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • _mer_
  • ベストアンサー率47% (27/57)
回答No.2

再び_mer_です。 ダウンロードでしたか。言われてみればそうですね。 (プログラムを見ればそうでした) 基本的にダウンロードもページに表示させるのも、 CGI側から見れば同じ扱いになるので、 先の質問の時にも書きましたが、CGIは最後が出力で終了するので、この場合 恐らくダウンロードをさせる(=表示させると言うのと同じ)ことで プログラムがそこで正常終了してしまっているのだと思います。 (終了の?)確認ページはどうしても必要でしょうか?

Otanoshike
質問者

お礼

_mer_さん、ありがとうございます。 確認ページは必須ではありませんので、止めにしました。 最後のブロックをコメントアウトしてもエラーは発生しませんでしたので、ご指摘の通りだと思います。 これで、すっきりしました。 今度は、エラー処理に挑戦です。(^^) perlの本は買ってあったんですが、CGIの説明がほとんどなくて、困ってました。CGIの本を探して見ます。 本論には関係ありませんが、_mer_さんってものすごく幅広い質問に答えていらっしゃるんですね。感心してしまいました。本当はこういう事を書く場所じゃないと思っていますが、ここのシステムでは他に感想を述べる場所がなくって…。 ありがとうございました。

その他の回答 (1)

  • _mer_
  • ベストアンサー率47% (27/57)
回答No.1

再び登場の_mer_でございます。こんにちは。 ぱっと見だけなので、外していたらスイマセン。 この真ん中の部分が付加された部分ですよね? まずこの部分だけ抜き出して、コマンドラインからはきちんと動作しますでしょうか? (最後のprint文が出力されますか?) あとスイマセン、ちょっと読み違えていたら申し訳ありませんが、 ファイルの転送というか、保存をしなおしている(?)と言う感じでしょうか。 #一応動いていると言うことは、保存は出来ているということですよね…? #であれば、書き込む先のディレクトリの権限ではなさそうですよね…? 何か逆に質問になってしまいましたごめんなさい。 #あと乳母心ながら、openをかけている部分には失敗した時の為に #エラーを吐かせるようにしておいた方が良いかと思います。 何かヒントになれば幸いです。

Otanoshike
質問者

補足

_mer_さん、度々すみません。 追加部分は、単独で動いていたのを貼り付けました。 もともとviで編集していて、okwebには手打ちでコピーしましたので、もしかしたらタイプミスがあるかもしれません。流れとして何か間違っているのかな?と考えた次第です。 このCGIでやろうとしているのは、ダウンロードページで、名前を入力してSubmitしたときに、名前の入ったメールの発信とダウンロードをワンクリックで実行したいんです。説明不足ですみません。 テストの結果は、ちゃんとメールも届いているし、ダウンロードも完了できているんです。ただ、最後の確認ページが出てこないんです。ログにエラーも無いようです。 openのエラー処理は、とりあえずこれが動いてから考えようと思ってました。(^^)ゞ お気づきの点があればご指摘いただけると幸いです。 よろしくお願いします。

関連するQ&A

  • CGIでメール送信がしたい

    ホームページからメールを出すCGIを作ろうとしています。 コマンドからCGIを直接実行すると問題なく動くのですが、formから動かすと Premature end of script headers: ・・・・ というエラーがでます。いろいろ探してみたんですが、分かりませんでした。 改行コードは端末からviで書いてますので、問題は無いだろうと思っているんですが… エラーはでますが、メールは送っているようです。 コマンドから実行した場合の差出人はroot@hoge.netになっているんですが、 ページから実行させたものはanonymous@hoge.netになります。 きっと勉強不足でとんでもないことをやっているんだろうと思うのですが、 探した範囲には答えがありませんでした。 どこが悪いのか教えてください。よろしくお願いします。 サーバーはVine2.6R1でApacheを使っています。 (test.html) <html> <body> <form name="down" action="/cgi-bin/test/a.cgi" method="post"> <input size="20" type="text" name="a_sel"> <input type="submit"> </body> </html> (a.cgi) #!/usr/bin/perl require '../mimew.pl'; require '../jcode.pl'; $sendmail = "/var/qmail/bin/sendmail"; $master_id = "ho\@hoge.net"; $msg="メッセージ"; &jcode'convert(*msg,'jis'); open (ML,"| $sendmail $master_id"); print ML $msg; close(ML); exit;

    • ベストアンサー
    • CGI
  • Perl/CGIについて

    #!/usr/bin/perl use CGI; $cgi = new CGI(); $from = $cgi->param('from'); $namae = $cgi->param('namae'); $naiyou = $cgi->param('naiyou'); print "Content-type: text/html\n\n"; # 設定 $sendmail = '/usr/lib/sendmail'; $jcode = './jcode.pl'; $to = 'ha***@***.ne.jp'; #$from = ''; $subject ='名鉄と地下鉄の直通運転'; # 文字コードライブラリの読み込み require $jcode; # メール送信 &jcode'convert(*subject,'jis'); open(MAIL,"| $sendmail -t"); # ヘッダ情報出力 print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; # 本文出力 print MAIL " $namae\n\n"; print MAIL " $naiyou\n"; close(MAIL); #確認表示 print " $namae\n"; print " $naiyou\n"; print "メールを送信しました\n"; end #確認表示の所で表示が改行されない。

    • ベストアンサー
    • Perl
  • cgiのopenについて

    cgiのopenを使って下記のソースを作りました。 が、読み込んだテキストの一行目しか読み込みませんToT require 'cgi-lib.pl'; &ReadParse(*answer); $data = "$answer{'text'}"; require 'jcode.pl'; &jcode'convert(*data,'sjis'); open(dataright,"<data.txt"); $data= <dataright>; close(dataright); print "Content-type:text/html\n\n"; print <<EOF; <html> <head> <title>メール送信フォーム</title> </head> <body> ------------------<br> お知らせ<br> $data ------------------<br> </body> </html> EOF exit; ちなみにテキストは改行に<br>を入力してあります。 ぜひアドバイスをお願いいたします。

    • ベストアンサー
    • CGI
  • Perlからメール送信で文字化け

    Perl5.8からsendmailを使ってメール送信しています。 髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。 #!/usr/bin/perl require 'jcode.pl'; require 'mimew.pl'; $sendmail = '/usr/lib/sendmail'; print"Content-type: text/html\n\n test\n"; if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; } print OUT "To: xxxx\@hogehoge.co.jp\n"; print OUT "From: xxxx\@hogehoge.co.jp\n"; print OUT "Reply-To: xxxx\@hogehoge.co.jp\n"; $subject = "サブジェクト 髙﨑"; $subject = &mimeencode($mail_subject); print OUT "Subject: $mail_subject\n"; print OUT "Mime-version: 1.0\n"; print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n"; print OUT "Content-Transfer-Encoding: 7bit\n\n"; $honbun = "メール本文 髙﨑"; &jcode'convert(*honbun, 'jis'); print OUT "$honbun\n"; close(OUT);

    • ベストアンサー
    • Perl
  • cgi出力での文字コードについて

    下記のソースをsjisで作っていて、出力するdata.txtをuft-8で保存したいです。 どのようにすればよいでしょうか? 下記ソースでは、data.txtはsjisになっています。 尚、htmlはsjisなのでそのまま使用したいです。 どなたか教えてください。 宜しくお願いします。 ############################# #!/usr/local/bin/perl require 'jcode.pl'; require 'cgi-lib.pl'; &ReadParse; $datafile='data.txt'; ←これの保存のみutf-8にしたい open(FH,">$datafile"); print FH "$in{'name'}"; close(FH); rint "Content-type:text/html\n\n"; print "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>"; print "<html><head></head><title>テスト</title><body>\n"; print "<center>入力完了しました。</center><hr /><br>\n"; print "<b>名前:</b>$in{'name'}<br>\n"; print "<hr />\n"; print "</body></html>";

    • 締切済み
    • CGI
  • IIS の@INC ERRORについて教えて

    wiin8にIISとPerl64をインストールしました。「Default Web Site」を「C:\wabs」に設定。 tst.cgi #!/usr/local/bin/perl print "Content-Type: text/html", "\n\n"; print "<HTML>\n"; print "<BODY>\n"; print "こんにちは!<BR>\n"; print "</BODY>\n"; print "</HTML>\n"; で、無事に動いてると確認したのですが、 C:\wabs\lib\jcode.pl を設置して、 require './lib/jcode.pl'; として、実行すると ERROR = Can't locate ./lib/jcode.pl in @INC (@INC・・・・ と、 パスが通っていないようなメッセージが出て、解決策が解らず困っています。 どなたか、解決策を教えてください。よろしくお願いします。

  • Jcode CP932 のエラーを回避したい。

    プログラム初心者です。 form Mailを設置し、フォーム入力→確認画面までは動くのですが、 最後に、送信ボタンを押すと、500エラーになります。 お手上げです。詳しい方お教えください。 サーバーのエラーログをみたところ、 Can't locate object method "CP932" via package "Jcode" at form_mail.cgi となっていました。 ━━ #!/usr/bin/perl require 'jcode.pl'; $sendmail = '/usr/sbin/sendmail'; use Jcode; ━━ エラーと思われる箇所 sub jis { $msg = $_[0]; # Jcode::convert(*msg,'jis'); $msg = Jcode->new($msg, "UTF8")->CP932; &jcode'convert(*msg,'jis'); } ━━

  • 送受信が出来ないメールフォーム

    メールフォームの送信ボタンを押すと Internal Server Errorの画面になり、送受信が出来ません。 jcode.plとcgi-lib.plは書き直していません。 多分form.cgiの書き方が何か違うのだと思います。 下記がform.cgiの中身です。 #!/usr/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*formdata); $subject = "$formdata{'subject'}"; $name = "$formdata{'name'}"; $email = "$formdata{'email'}"; $email = "$formdata{'dayl'}" $12 = "$formdata{'12'}"; $13 = "$formdata{'13'}"; $to = '△@yahoo.co.jp'; $subject = 'メール'; &jcode'convert(*subject,'jis'); open(MAIL, "| /usr/sbin/sendmail -t"); print MAIL "To: $to\n"; print MAIL "From: $email\n"; print MAIL "Content-Type: text/plain;\n\n"; print MAIL "件名:\n$subject\n\nお名前:\n$name\n\nメールアドレス:\n$email\n\n生年月日:\n$day\n\n資料:\n$12\n\n担当者名:\n$13\n\nご相談内容:\n$message\n"; close(MAIL); print "Location: http://△.sakura.ne.jp/12.html\n\n"; exit; 初心者にも分かる様にどなたかご教授をお願いします。 print "Location: http://△.sakura.ne.jp/12.html\n\n"; 部分の12.htmlは送信後に表示するページです。

    • 締切済み
    • CGI
  • CGI経由でのPDFファイルをダウンロード

    こんにちは。 CGIの初心者です。 今CGI経由でのPDFファイルをダウンロードするというプログラムを作っています。 ただ、ダウンロードしたファイルは開けなく、エラーが出ます。ファイルを確認すると0バイトです。原因はよく分からないので、誰かが教えてください。ありがとうございます。 コードです: $filename = './data/sheet.pdf'; $source = $filename ; print qq|Content-type: text/plain\n|; print qq|Content-Disposition: attachment; filename="$filename"\n|; print qq|\n|; #-- ファイルを読み込んで出力 open(FILE,"$source"); binmode FILE; binmode STDOUT; while(read(FILE, $value, 4096)){ print $value; } close FILE;

    • 締切済み
    • CGI
  • 日本語文字化け(GETメソッド?)

    以下のようにすると日本語の受け渡しがうまくいきません。(抜粋) そももこの場合、日本語の受け渡しは、出来ないのでしょうか。 それともコンバートのやり方がまずいのでしょうか。 お知恵をおかしください。宜しくお願い致します。 URL:test.cgi?name=日本語 #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; # 読込 &getinput; $name = $form{'name'}; print "Content-Type: text/html\n\n", $name; exit; sub getinput { &ReadParse; while (($key,$val) = each %in) { &jcode'convert(*val, "sjis", "", "z"); $form{$key} = $val; } }

    • 締切済み
    • CGI

専門家に質問してみよう