質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

3回答

1472閲覧

JavaScriptで受け取った値をperlに渡したい

sunsunsun

総合スコア7

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2018/04/16 10:36

前提・実現したいこと

お問い合わせフォームを作っています。
入力された値を、JavaScriptでajaxを利用しjson型で格納し、
perlプログラムに渡しメールが送れるようにしたいです。

perlプログラム自体は、コマンドで操作するとメール送信が出来ます。
JavaScriptも、動作自体はしており、console.log();で値が入っていることも確認できます。

jsからperlのパスが、間違っていると思い、
変更しましたが、上手くいきません。
使用している環境が関係しているのでしょうか。

プログラミング初心者で原因を解明できずにいます。
もしかすると、解決に必要な情報も足りない場合があるかと思います。
大変恐縮ですが、そこも含めてご教授ください。

発生している問題・エラーメッセージ

エラーメッセージなし

該当のソースコード

function send() {
var name = '名前  :' + $('#name').val().trim();
var kana = 'ふりがな     :' + $('#kana').val().trim();
var age = '年齢      :' + $('#age').val().trim();

$.ajax({ type : "POST", url : "http://xxx.com/cgi-bin/contact.pl", dataType : "json", data : { name : name, kana : kana, age : age, } }); alert("メールを送信しました。");

};

試したこと

・相対パスでの記載
・絶対パスでの記載

補足情報(FW/ツールのバージョンなど)

サーバーはさくらインターネットを利用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takyafumin

2018/04/16 11:11

『perlプログラム自体は、コマンドで操作するとメール送信が出来ます。』とはどのような操作をされていますか?
sunsunsun

2018/04/16 11:32

RLoginというソフトを使用して、perl xxx.pl と打ち込むと、メールが送れます。
退会済みユーザー

退会済みユーザー

2018/04/16 12:04

というか xxx.com とか xxx.org て確か危険度Aのサイトじゃなかったけ
sunsunsun

2018/04/16 14:43

「危険度Aのサイト」とは一体どういった意味でしょうか。.comとゆうドメインがいけないということでしょうか。xxxの部分のことであれば、例えで記載しました。
guest

回答3

0

ベストアンサー

質問の環境としては、お問い合わせフォーム(Webアプリケーション)からメール送信処理(コンソールアプリケーション)の呼び出しを行っているようですね。
お問い合わせフォーム(Javascript)からajaxで呼び出し可能な機能はWebアプリケーションであり、現在のperl(コンソールアプリケーション)は直接呼び出し出来ません。

対処方法として思いつくのは2つです。

  1. 現在のperlプログラムをWebアプリケーションに変更する
  2. 現在のperlプログラムを呼び出すWebアプリケーション(perl)を新たに作成する

「1. 現在のperlプログラムをWebアプリケーションに変更する」に関しては、perlプログラムをcgiとして動作するように作り変えることとなります。

「perl cgi メール送信」とGoogle検索すると参考になりそうなページがたくさんヒットしますね。


「2. 現在のperlプログラムを呼び出すWebアプリケーション(perl)を新たに作成する」に関しては、新たなperlプログラム(cgi)を作成し、そのcgiから現在のperlプログラムを呼び出すこととなります。

「perl 外部コマンド 実行」とGoogle検索すると参考になりそうなページがたくさんヒットしますね。
ただし、「コマンドインジェクション」といった攻撃に十分注意したプログラミングが必要となります。
入力値のチェック等、入念に行うようにしてください。

投稿2018/04/16 11:47

takyafumin

総合スコア2335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sunsunsun

2018/04/16 14:36

回答、そして丁寧な説明をありがとうございます。 ただ現在のperlをcgiに変更してみましたが、出来ませんでした。 ただ前回同様に、Rloginでperl xxx.cgiでメールは送れます。 また、test.cgiを作成しjsで動かしたところ、 500 Internal Server Errorがでました。 ●test.cgi #! \usr\local\bin\perl print "Content-type: text/html\n\n"; print "<HTML><BODY>\n"; print "<H2>Hello!</H2>\n"; print "</BODY></HTML>\n"; exit; ●js function test(){ $.ajax({ type : "POST", url : "http://xxx.com/cgi-bin/test.cgi", }); } ちなみに、元々作成していたperlはエラーがでないのですが、 それもおかしい気がしています。 他に考えられる原因がありましたら、ご教授頂ければ幸いです。 宜しくお願いします。
takyafumin

2018/04/16 15:16

まずはperlが動作するところの確認をしてみましょう。 「test.cgi」をブラウザで表示させても同じようにInternal Server Errorとなりますか? 頂いたコメントがタイプミスでなければ、●test.cgiの1行目のperlのパスは円マーク(¥)ではなく、スラッシュ(/)区切りとする必要があります。 またプログラム部分はmix-peachさまの回答にあるように以下の書式で記載すると見やすくて良いですよ。 ``` // プログラムコードをここに記載 ```
退会済みユーザー

退会済みユーザー

2018/04/16 15:20

拡張子 pl でのアクセスだと plain/text か application/octedstream のどちらかになるはずなので 500 エラーになるわけがないじゃないですかやだー
takyafumin

2018/04/16 15:36

そうなんですね、勉強になります。ご指摘ありがとうございます。 その部分は質問者さまも、asahina1979さまの回答をもとに改善できているようですね。 現在はtest.cgiへのアクセスで500エラーとなるようですよ。
sunsunsun

2018/04/18 10:39

回答ありがとうございます。 返信が遅れまして申し訳ございません。 ご指摘頂いた通り、タイプミスでした。 お騒がせで申し訳ございません。。。無事test.cgiを動かすことができました。 そして、値を渡すプログラムも改行コードを変更しアップロードしたところ、 ajaxでcgiを呼び出しが出来ました! 無事解決しました。本当に丁寧に説明頂きありがとうございました。
takyafumin

2018/04/19 02:05

解決できて良かったです。
guest

0

perlは詳しくないですが、気になった点を。

javascript

1$.ajax({ 2type : "POST", 3url : "http://xxx.com/cgi-bin/contact.pl", 4dataType : "json", //★これ 5data : { 6name : name, 7kana : kana, 8age : age, 9} 10});

dataTypeは「戻り値の型」を定義するところで、渡す値の型を定義するところではありません。

上記コードを見る限り、ajaxで渡しているdata は、
POSTされた側(perlのプログラム側)では、「通常のform」でPOSTした時と同じ要領で参照できる形になるのではないかと思います。

jsonとわざわざ書いているので、もし「decode_json()」がエラーになって上手く行かないのであれば、これが原因ではないでしょうか??

投稿2018/04/16 11:36

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sunsunsun

2018/04/16 14:36

ありがとうございます。 初心者で理解が乏しい部分があるのですが、 POSTされた側(perlのプログラム側)には、 json型で渡っていないとゆう認識でよろしいでしょうか。 dataTypeの記載はなくてもよいということでしょうか。 お教え頂ければ幸いです。
mix-peach

2018/04/17 08:25 編集

jsonでは渡されていないですね・・・とりあえずは、値を受け取れるようになってから、実際に受け取っている値を確認された方が良いかと! dataTypeは、このajaxの記述の場合、処理を投げっぱなしで結果のお返事を待っていませんので、不要です。(設定したままでも特に問題はないけど、意味はない)
sunsunsun

2018/04/18 10:42

回答ありがとうございます。 根本的な部分が理解しておらず、問題が何処にあるか探せないという現状です。。。 今回mix-peach様のアドバイス大変勉強になりました。 皆様のお力で無事解決することができました。 本当にありがとうございました。
guest

0

CGI-PHP-SSI-について

.pl は許容されていません。

.cgi ファイルに変更しましょう

投稿2018/04/16 11:50

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sunsunsun

2018/04/16 14:38

回答ありがとうございます。 しかし、.cgiファイルに変更しましたが、上手くいきませんでした。 他に考えられる要因がありましたら、ご教授頂ければ幸いです。
退会済みユーザー

退会済みユーザー

2018/04/16 14:49

コマンドラインで使うものは 拡張子CGIに変えるんじゃなく CGIで受け取ってsystem関数だったかなで呼び出さないとだめよ
sunsunsun

2018/04/18 10:38

回答ありがとうございます。 返信が遅れまして申し訳ございません。 ご指摘頂いた通りで、解決致しました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問