sendmailの使えない環境でメールを送る

このQ&Aのポイント
  • 自分のサイトはCGI(Perl5)はOKだが、sendmailが使えない環境でメールを送りたい
  • プロバイダはメールデコードをサポートしているため、それを利用してメールを送信する方法を相談
  • CGIはPOSTメソッドでパラメータを渡し、掲示板プログラムからCGIを呼び出すと良さそう
回答を見る
  • ベストアンサー

sendmailの使えない環境でメールを送る

いま使っている自分のサイトは CGI(Perl5)は OKですが sendmailが使えません。しかし、掲示板の書き込み内容をメールで送信したいと考えています。 で、幸いそのプロバイダには標準 CGIとしてメールデコードをサポートしています。これを巧く使ってメールを送信できないかとのご相談です。 件の CGIはPOSTメソッドで渡すので、CONTENT_LENGTHにその長さをセットし、標準入力へパラメータを。そして掲示板プログラムからメールでコードのCGIを呼び出せば巧くいきそうなのですが....。 1.まず、この方法は使えそうか? 2.perl中で別の CGIの標準入力へどのようにパラメータを渡すのか(パイプ?リダイレクト?) 3.環境変数 CONTENT_LENGTHへ CGI中から値を設定できるのか? 4.送信するパラメータはどんな文字列にすればいいのか?(エンコード、パラメータの区切りとか) 以上です。どなたかアドバイスお願いします

  • CGI
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
noname#25358
noname#25358
回答No.2

 えとですね。 >POSTメソッドで引数を渡すので STDINをreadするのはどのプログラムでも一緒  これがそもそも違います(笑)  たとえば、yatokesa さんが下記に提示したプログラムは、STDINをreadできるでしょうか?  できませんよね。print しかしてないわけですし。  それと同じ考えで、hoge.cgi というプログラムのソースの中に STDIN を read するルーチンが存在しなければ、そもそもプログラムにリダイレクトできないわけです。  で、それができるかどうかは、プログラムを作ったプログラマーしか分からないという寸法なわけです。  ちなみに、HTTP プロトコルはファイルを転送するプロトコルではないので、リダイレクトという概念はありませんが、telnet から which hoge.cgi というコマンドを打てば、(hoge.cgi にパスが通っていれば)サーバー上の物理位置が分かります。  まあ、仕様が分からないということは、試す価値はある、ということでもありますから、やってみてもいいんじゃないでしょうか。  やり方が見当も付きませんが(^_^;

yatokesa
質問者

お礼

まずは、ご回答くださいましてありがとうございます。 疑問点が解決しませんでしたので、宜しければおつきあいください。噛みつきすぎたかと補足を送信したあとに反省してます。

yatokesa
質問者

補足

>>POSTメソッドで引数を渡すので STDINをreadするのはどのプログラムでも一緒 > これがそもそも違います(笑) ここのところが腑に落ちませんので、もう少しおつきあい願えますか?(スイマセン) しっかりと書かなかったので全部が伝わらなかったのかと思い、もう少し具体的に書きますと...。 hoge.cgiの使い方として <FORM METHOD="post" ACTION="http://.../hoge.cgi" > でフォームを定義し、あとはテキストフィールドの値をhoge.cgiが読み出しますよね。参考にした CGIの解説には「POSTメソッドは標準入出力にパラメータを渡す」と書いてあったので STDINをreadと短絡的な表現をしました。逆に、この FORMの形式でパラメータを読み込む別の方法(標準入力以外から読み込む方法)というのはあるのでしょうか? で、さらに、クライアント側で入力したテキストフィールドの値をHTTPサーバーに送る手だてがあると思ったのでこれを cgiでシミュレートできればと思った次第です。 >telnet から which hoge.cgi プロバイダは @niftyですのでちょっと無理でした...。

その他の回答 (2)

noname#25358
noname#25358
回答No.3

 はいはい(笑)  今、自分でプログラムを組んで試しましたができませんでした。  これはどうやら、open(MAIL, "...") の MAIL と、hoge.cgi の STDIN がうまくつながってくれないのが原因のようです。(ちなみに、「STDINをreadと~」というくだりは、考え方自体は間違ってないです。実際には、必ずこうなってるかというと、そうでもないかもしれませんが) >プロバイダは @niftyですのでちょっと無理でした...。  えー(^_^;  これはけっこう致命的です。  すなわち、「プロバイダから直接アクセスを禁止されている」ということになります。

yatokesa
質問者

お礼

#ちょっと仕事がばたばたして遅くなりました。 やはりイレギュラーな方法はそれなりの知識がないと難しいようですね。ブラウザとHTTPサーバーとの通信方法など、もう少し勉強してから出直してみます。 >「プロバイダから直接アクセスを禁止されている」 はい、重々承知しております。 確実にメールが送られるではないですが別の方法を思いついたのでそちらを試してみます。 おつきあいくださいましてありがとうございました^_^)/。

noname#25358
noname#25358
回答No.1

 プログラムの構造によります。  この手のCGIプログラムはプロバイダの手作りである場合も多く、一般共通項的な使い方はないのです。  ですので、同じ質問をプロバイダにしてみてください。

yatokesa
質問者

お礼

スパム防止のために sendmailを禁止していると思いますのでプロバイダには聞き難いです(ゲリラ的ですから)。 できれば便利だと思う程度でしたのでそれほど困っているわけじゃないんですけど、思いついたのでちょっと試してみたかったんです。 お返事ありがとうございました。

yatokesa
質問者

補足

>プログラムの構造によります POSTメソッドで引数を渡すので STDINをreadするのはどのプログラムでも一緒だと思ったのですが、OSやhttpサーバーに依存するのでしょうか? で、試して見ちゃいました。結果から言うと以下のソースではNGです。 $formdata = "to_mail=$mailto"; $formdata .= "&sub=$sub"; $formdata .= "&name=$name"; $formdata .= "&from=$email"; $formdata .= "&body=$comment"; $formdata =~ tr/+/ /; $formdata =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $ENV{'CONTENT_LENGTH'} = length($formdata); $ENV{'REQUEST_METHOD'} = 'POST'; if (open(MAIL,"| http://cgi.hoge.com/bin/hoge.cgi")) {   print MAIL $formdata; } close(MAIL); httpを openするってのがそもそも間違いだと思いますが、hoge.cgiの格納ディレクトリが判らないので...。 (ローカルのLinuxサーバーでテストしたら broken pipeとなってしまった) もし、httpに標準入力で渡す方法をご存じでしたらご教授ください。

関連するQ&A

  • sendmailでメールが送信されない。

    こんにちは。 自動応答メールフォームのCGI「ThemeResMail」というのを 使っているのですが、うまく動作しません。 このcgiをアップしたのは以下のレンタルサーバーです。 http://www.dot5hosting.com/dot5/ 使用しているcgiはこれです。 http://apps.cside.com/theme/tmresmail/ メール送信完了画面は出るのですが、 送信者、あて先共にメールが届きません。 同じ設定で他のサーバー(xrea)ではうまくいきました。 sendmailとperlのパスは調べた所、間違いないようです。 ■dot5でのパス sendmail /usr/sbin/sendmail Perl /usr/bin/perl 何が原因なのかどんな事でも結構ですのでコメント頂けると助かります。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Mail::Sendmailの使い方

    お世話になっております。 先日よりsendmailの調子がおかしくていろいろ調べているのですが煮詰まってしまったので詳しい方々にご教授頂きたいと思います。 先日よりMovable Type(CMS)でのメール送信のシステムが機能しなくなり、いろいろ調べているとサーバーのsendmailはきちんと機能しているのですが、perlのモジュールMail::Sendmailがうまく作動していないようなのです。 perlでは、 open (SENDMAIL, "/usr/lib/sendmail -t -i"); (中省略) close(SENDMAIL); という原始的な方法ではメールが送信されるのですが、 use Mail::Sendmail;という使い方では、エラーにはなりませんがずっと読み込み中…状態が続いてメールが送信されませんでした。 Movable TypeでもMail::Sendmailが利用されていますのでここが原因かと思いますが、Mail::Sendmailを使用するにあたって注意すべきこと、または設定すべきことはどのようなことがあるでしょうか?さしあたりどこをチェックしてよいのかわからなくて困っています。 よろしくお願いします。 Mail::Sendmailを利用して作成したスクリプトは以下のようなものです。 #!/usr/bin/perl use strict; use warnings; use Mail::Sendmail; use Encode; use utf8; my $subject = "テスト"; my $message = "テストです。ほげほげ。"; $subject = encode("MIME-Header-ISO_2022_JP", $subject); $message = encode("iso-2022-jp", $message); my %mail = ( "Content-Type" => 'text/plain; charset="iso-2022-jp"', To => 'to@example.com', From => 'from@example.com', Subject => $subject, Message => $message, ); sendmail(%mail); exit;

    • ベストアンサー
    • Perl
  • メールフォームの作成(sendmail)

    現在cgiでメールフォームを作成しています。 sendmail使用、ファイルのエンコーディングはShift_JIS、改行コードLF htmlのフォームから情報を入力し、 perlで入力内容の確認、 cgiでメール送信までは実行できました。 他の項目(件名やメールアドレスなど)はメール内容に反映されているのですが、 本文のみ空白となってしまいます。 本文に関わるコードは下記になります。 use CGI; $cgi = new CGI(); $maintxt = $cgi->param('maintxt'); $cgi->charset('Shift_JIS'); $maintxt = $cgi->escapeHTML($maintxt); &jcode::convert(\$maintxt,'jis'); print MAIL "Content-Type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "$maintxt\n"; cgiは勉強中なもので、解決方法がお分かりの方がいらっしゃいましたら、 教えていただければ幸いです。

    • ベストアンサー
    • CGI
  • sendmail

    フォームメールのcgiを自宅サーバーで作成しようと して、サンプルのcgiを実行しようとおもったのですが、sendmailのパスを設定してくださいとあるのですがsendmailがどこにもありません。どこから入手すればよいのですか?サーバーはwindowsです。 サンプルcgiは、10日でおぼえるPerl/CGIの第5日4時限目のとこです。 よろしくお願いします。 当方はperl初心者です。

    • ベストアンサー
    • Perl
  • sendmailを使わないで送れるメールフォームを探しています。

    自宅サーバーでサイトを公開しているのですがsendmailが使えません。 あちこち探したのですが、配布されているメールフォームCGIはほとんどがsendmailを使うものでした。 次のようなメールフォームCGIをご存知の方よろしくお願いします。 (1)sendmailを使わないでプロバイダ(OCN)のメールサーバで送る (2)投稿者に自動返信ができる (3)送信先のアドレスが複数指定できる (4)添付ファイルが複数送れる (5)必須入力項目のチェックができる 勝手なことばかり申しますがよろしくお願いします。

    • ベストアンサー
    • CGI
  • sendmail

    PerlやPHPにはsendmailを使ってメール送信する関数があったと思いますが、sendmailというメールサーバを起動していなくてはいけないのですか? メールサーバならsendmailサーバの他にpostfixやqmailなどがあるじゃないですか。

  • perlからsendmailを使う

    現在、mod_perlを使ってサイトを構築しているのですが、その中で、sendmailを使ってメールを送信している処理が遅く困っています。 その処理が遅いため、画面へのHTML出力が遅くなっています。(HTML出力処理は、メール送信処理よりさきにやっているのですが・・) 下記は、ソースの該当部分です。 直接、sendmailに渡しているのですが、 この処理がいけないのでしょうか? 何か改善方法があるようであれば教えてください。 ちなみに、通常のCGIだとforkで、別プロセスを立てて そのプロセスにメール送信をさせて、主プロセスは、HTML出力をさせることはできると思うのですが。 プロセスが常駐しているmod_perlでは、有効な手なのでしょうか。 -------------------------------------- open(SENDMAIL,"|/usr/lib/sendmail -t") or $err = 1; if ($err == 0) { print SENDMAIL $mail_body; close(SENDMAIL); $err_msg = "メール送信正常に処理しました。\n"; } else { $err_msg = "メール送信エラー:ticket_cd:$$ref{ticket_cd}\n"; } --------------------------------------

    • ベストアンサー
    • Perl
  • cgi-perl の sendmail について

    cgi-perlのsendmailを使ってWebサイトに問い合わせフォームを作っています。 2つのサイトを同じサーバーに持っているのですが、かたやきちんと送信できるのに、片方はメールが届きません。 メールが届かない方も送信ボタンを押すときちんと出るべき”メールが送信されました”というメッセージは出ます。 このような場合、どこをチェックしたらいいのでしょうか。 もう何度もcgiファイル、htmlファイルを確認して、属性なども確認しているつもりなのですが、きっとどこかが違っているのだと思います。 いっそエラーが出てくれれば、わかりやすいのですが、行き詰っています。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • CGI
  • NIFTYのCGIでSENDMAIL

    どなたか ご存知の方はお知らせ下さい。 NIFTYで sendmailは使えないことは知っています、 しかし 裏技でcgiにて メールを送れると聞いた事があります。 これは メールデコードでは ありません。 ご存知の方は レスお願いします。

    • 締切済み
    • CGI
  • sendmailで添付メールを送信したい

    Perlを勉強してまだ日が浅い初心者です。 sendmailを利用して添付メールを送信したいのです。 WEBで色々と探して自分で勉強してみたのですが・・・ ほとんどがモジュールを必要としています。 モジュールってインストールしないと駄目なのですよね? 設置場所がレンタルサーバーなのでそれは多分出来ないのです。(sendmail可) 標準モジュールのみで添付ファイルを実現できる方法はありませんか? 宜しくお願いします

    • ベストアンサー
    • Perl