- ベストアンサー
sendmailの使えない環境でメールを送る
- 自分のサイトはCGI(Perl5)はOKだが、sendmailが使えない環境でメールを送りたい
- プロバイダはメールデコードをサポートしているため、それを利用してメールを送信する方法を相談
- CGIはPOSTメソッドでパラメータを渡し、掲示板プログラムからCGIを呼び出すと良さそう
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
えとですね。 >POSTメソッドで引数を渡すので STDINをreadするのはどのプログラムでも一緒 これがそもそも違います(笑) たとえば、yatokesa さんが下記に提示したプログラムは、STDINをreadできるでしょうか? できませんよね。print しかしてないわけですし。 それと同じ考えで、hoge.cgi というプログラムのソースの中に STDIN を read するルーチンが存在しなければ、そもそもプログラムにリダイレクトできないわけです。 で、それができるかどうかは、プログラムを作ったプログラマーしか分からないという寸法なわけです。 ちなみに、HTTP プロトコルはファイルを転送するプロトコルではないので、リダイレクトという概念はありませんが、telnet から which hoge.cgi というコマンドを打てば、(hoge.cgi にパスが通っていれば)サーバー上の物理位置が分かります。 まあ、仕様が分からないということは、試す価値はある、ということでもありますから、やってみてもいいんじゃないでしょうか。 やり方が見当も付きませんが(^_^;
その他の回答 (2)
はいはい(笑) 今、自分でプログラムを組んで試しましたができませんでした。 これはどうやら、open(MAIL, "...") の MAIL と、hoge.cgi の STDIN がうまくつながってくれないのが原因のようです。(ちなみに、「STDINをreadと~」というくだりは、考え方自体は間違ってないです。実際には、必ずこうなってるかというと、そうでもないかもしれませんが) >プロバイダは @niftyですのでちょっと無理でした...。 えー(^_^; これはけっこう致命的です。 すなわち、「プロバイダから直接アクセスを禁止されている」ということになります。
お礼
#ちょっと仕事がばたばたして遅くなりました。 やはりイレギュラーな方法はそれなりの知識がないと難しいようですね。ブラウザとHTTPサーバーとの通信方法など、もう少し勉強してから出直してみます。 >「プロバイダから直接アクセスを禁止されている」 はい、重々承知しております。 確実にメールが送られるではないですが別の方法を思いついたのでそちらを試してみます。 おつきあいくださいましてありがとうございました^_^)/。
プログラムの構造によります。 この手のCGIプログラムはプロバイダの手作りである場合も多く、一般共通項的な使い方はないのです。 ですので、同じ質問をプロバイダにしてみてください。
お礼
スパム防止のために sendmailを禁止していると思いますのでプロバイダには聞き難いです(ゲリラ的ですから)。 できれば便利だと思う程度でしたのでそれほど困っているわけじゃないんですけど、思いついたのでちょっと試してみたかったんです。 お返事ありがとうございました。
補足
>プログラムの構造によります 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に標準入力で渡す方法をご存じでしたらご教授ください。
お礼
まずは、ご回答くださいましてありがとうございます。 疑問点が解決しませんでしたので、宜しければおつきあいください。噛みつきすぎたかと補足を送信したあとに反省してます。
補足
>>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ですのでちょっと無理でした...。