アプリ版:「スタンプのみでお礼する」機能のリリースについて

メールフォームで
ホームページの問い合わせをクリックすると下記のコードでフォームページに飛びます。
print qq(Content-type: text/html; charset=Shift_JIS\n\n);
print <<END;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>メールフォーム</title>
</head>
<body>
<h1 class="title">メールフォーム</h1>
<form method="post" action="mail.pl">
<input type="hidden" name="a" value="exec">
件名(Subject) :<br />
<input type="text" name="subject" size="80" value=""><br />
宛先(To) :<br />
<input type="text" name="to" size="80" value=""><br />
差出人(From) :<br />
<input type="text" name="from" size="80" value=""><br />
本文(Body) :<br />
<textarea name="body" rows="10" cols="65"></textarea><br />
<p>
<input type="submit" value="送信">
</p>
</form>
</body>
</html>
END
そこで、内容を入力すると送信するようになのですが、
このアクションでmail.plのコード内で

my $mailto= 'aaaaa@aaaaaa.jp';
my $subject = '問い合わせ;
my $message = "テスト";

このmy の内容を変数を利用してメールフォームから呼び出し?したいと思います。
そのやり方をご教示ください。

また、mailtoの相手に送信してもらったら
自動的に定型文を返信するようにしたいです。

A 回答 (2件)

CGI の仕組みにおいて <form method=post> で送られてくる情報は、


内容は標準入力から、長さは環境変数 CONTENT_LENGTH から取得できます。
ただそのままでは、ブラウザによってエスケープされたままの情報なので、
少々面倒な加工処理が必要です。

ブラウザから送信されるエスケープされた post 情報の例:
a=exec&subject=%E4%BB%B6%E5%90%8D&to=%E3%81%BB%E3%81%92&from=%E3%81%B5%E3%81%8C&body=%E3%81%B5%E3%82%93%E3%81%8C%E3%81%A8%E3%81%A3%E3%81%A8

ですので、その加工をおこなってくれるモジュールを使って取得しましょう。
例:
use CGI;
my $p = new CGI;
my $subject = $p->param('subject');

メールの自動返信を行いたいならば、
MTA に対して受信契機のスクリプト実行を設定することになります。
ただその方法は環境によって異なるので、
インフラ担当の方にお問い合わせください。
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

CGI.pmはインストールはしています。
しかし、まだ使いかたがわかりません・・

質問のコードはmailform.pl
下記のコードがmail.pl

#!/usr/bin/perl -w
use Encode qw(from_to encode);
use Net::SMTP;
use strict;
my $from = 'xxxx@xxxxx.jp';
my $mailto= 'xxxx@xxxxx.jp';
my $mailcc= 'xxxx@xxxxx.jp';

my $subject = 'ホームページからのお問い合わせ';
from_to($subject, 'shiftjis', 'iso-2022-jp');
encode('MIME-Header-ISO_2022_JP', $subject);

my $header = << "MAILHEADER";
From: $from
To: $mailto
CC: $mailcc
Subject: $subject
Mime-Version: 1.0
Content-Type: text/plain; charset = 'ISO-2022-JP"
Content-Trensfer-Encoding: 7bit
MAILHEADER

my $message = "テスト";

from_to($message, 'shiftjis', 'iso-2022-jp');

my $smtp = Net::SMTP->new('xxxx-xxxx.jp');
if ( !$smtp ) {
print "メールサーバーにアクセスできません!";
exit;
}
#メール送信
$smtp->mail($from);
$smtp->to($mailto);
$smtp->to($mailcc);
$smtp->data();
$smtp->datasend($header);
$smtp->datasend($message);
$smtp->dataend();
$smtp->quit;

なのですが、回答してくださった答えはどこにどう入れればいいのでしょうか・?

自動返信はこれができた後に考えますorz

お礼日時:2016/11/02 09:33

どうやってフォームの入力を取得しているのかは、貼り付けられたソースコードからはわかりませんが、フォームから渡される$to, $from, $body を代入すれば良いのでは?


my $mailto= $to;
みたいな。

あるいはフォームから取得した変数をそのまま使えば良いと思います。

ただしフォームで渡されてくるメールアドレスの正当生チェックや、文字コードの変換もしないとです。
またバッファオーバーフローやクロスサイトスクリプティング、コマンドインジェクションなどへの対策も必要です。
対策済みでしたら失礼。
    • good
    • 0
この回答へのお礼

コメントありがとうございます。
説明不足ですね;;
質問のコードはmailform.pl
下記のコードはmail.pl
#!/usr/bin/perl -w
use Encode qw(from_to encode);
use Net::SMTP;
use strict;
my $from = 'xxxx@xxxxx.jp';
my $mailto= 'xxxx@xxxxx.jp';
my $mailcc= 'xxxx@xxxxx.jp';

my $subject = 'ホームページからのお問い合わせ';
from_to($subject, 'shiftjis', 'iso-2022-jp');
encode('MIME-Header-ISO_2022_JP', $subject);

my $header = << "MAILHEADER";
From: $from
To: $mailto
CC: $mailcc
Subject: $subject
Mime-Version: 1.0
Content-Type: text/plain; charset = 'ISO-2022-JP"
Content-Trensfer-Encoding: 7bit
MAILHEADER

my $message = "テスト";

from_to($message, 'shiftjis', 'iso-2022-jp');

my $smtp = Net::SMTP->new('xxxx-xxxx.jp');
if ( !$smtp ) {
print "メールサーバーにアクセスできません!";
exit;
}
#メール送信
$smtp->mail($from);
$smtp->to($mailto);
$smtp->to($mailcc);
$smtp->data();
$smtp->datasend($header);
$smtp->datasend($message);
$smtp->dataend();
$smtp->quit;

mailform.plからmail.plへの受け渡しができないです

$to;
では同じコード内ではできることを確認しました・・
同じコード内でsubを使えればいいのですが、使いかたが・・

お礼日時:2016/11/02 09:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!