我正在尝试使用PERL / CGI创建表单,并且希望在同一CGI文件中处理该表单中引入的数据

时间:2019-04-24 23:44:51

标签: html forms perl cgi

'我正在尝试使用PERL / CGI创建一个表单,我想处理在同一CGI文件中以该表单引入的数据。这就是我在HTML5方面的代码所拥有的……。”

<body>
   <form action="form.cgi" method="get">
</form>

<h1>Feedback Form</h1>
<p>Please fill out the entire feedback form.</p>
<table>
<tr>
<td><b>To (recipient's e-mail address):</b></td>
</tr>
<tr>
<td><input type = "text" name = "mailTo" size = "40"  /></td>
</tr>
<tr>
<td><b>From (your e-mail address):</b></td>
</tr>
<tr>
<td><input type = "text" name = "mailFrom" size = "40" /></td>
</tr>
<tr>
<td><b>Enter a subject:</b></td>
</tr>
<tr>
<td><input type = "text" name = "subjectLine" size = "40" /></td>
</tr>
<tr>
<td><b>Enter your message:</b></td>
</tr>
<tr>
<td><textarea name = "message" rows = "10" cols = "50"></textarea></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td><input type = "submit" name = "sbutton" value = "Submit" />
<input type = "reset" value = "Reset" /></td>
</tr>
</table>

<br><br><br><br><br> 



</div>
</body></html>

PERL / CGI表单代码

#!/usr/bin/perl
use Modern:: Perl;
use Mail::Sendmail; 

my $mailFrom = email@email'; 

my $subjectLine = "Sample Subject:l 
my $message = "Sample Message!"; 
my %mail = ( To      => $mailTo, 
             From    => $mailFrom, 
             Subject => $subjectLine,
             Message => $message, 
             'Content-Type' => 'text/plain' 
           ); 

if ( sendmail %mail ) 
{
  print "Sucessfully sent mail to $mailTo. Check you box! \n";
}
else 
{
  print "Error sending mail: $Mail::Sendmail::error \n";
}

我花了两个多小时试图弄清楚这段代码。请任何人能帮助我。我为这两个不同的代码制作了两个不同的文件。我觉得自己缺少某些东西,或者缺少一些小东西。

谢谢:)

3 个答案:

答案 0 :(得分:0)

您所有的输入字段都必须位于开始<form>和结束</form>标签之间。

此外,form方法应该是“ post”,而不是“ get”。

您以form.cgi身份拥有的表单操作。该文件在服务器上的什么位置?在典型的设置中,它可能位于cgi-bin目录中,在这种情况下,您可能需要尝试action="/cgi-bin/form.cgi"

希望这些建议有所帮助。

答案 1 :(得分:0)

您正在使用许多没有值的变量-$mailTo$subjectLine$message。我想您已经习惯了PHP,其中的变量会自动为您填充。在Perl中并非如此。您需要自己提取表单字段数据。

在编写CGI程序时,最简单的解决方案可能是使用CGI模块中的param()函数。

use CGI 'param';

my $subjectLine = param('subjectLine'); # etc...

此外,CGI程序需要在发送任何实际输出之前发送“ Content-type”标头。在编写纯文本时,应使用text/plain。 CGI模块还具有header()函数,可在此处为您提供帮助。

# Load both of the functions you're going to use
use CGI ('header', 'param');

# Run this before any other print statements
print header(-type => 'text/plain');

如果您要编写CGI程序,那么花时间阅读documentation for the CGI module将是一个好主意。但是我也建议阅读CGI::Alternatives,因为CGI不再是用Perl编写Web程序的最佳方法。

此外,在您的HTML中,您的</form>结束标记应在所有表单输入之后

答案 2 :(得分:0)

使用您的HTML代码轻松进行perl CGI表单本身here's a small example的调用。 (顺便说一下,所有表单字段都必须用<form>标记括起来,而不是您的方式。是的,表单方法是POST。)

此CGI文件的功能必须根据其访问方式而有所不同。首先,它需要打印出带有空白表单字段的HTML。这是代码中的“ $ html”变量。然后,在提交后,它需要接收表单参数,并对数据进行处理。要通过电子邮件发送,请调用 mailForm 子例程。我的服务器上没有sendmail,因此我只打印了示例中的表单数据。下面的代码将其邮寄。

CGI脚本需要说明在只是作为网页被访问与作为表单动作被调用之间的区别。为此,它将检查名为“ check”的隐藏表单字段。如果定义了“检查”,则表示表单已提交,并且有数据需要收集和处理。如果未定义“检查”,则仅打印出空白表格字段。

也许有更优雅的方法可以做到这一点,但是我只是想演示一个CGI文件,该文件可以处理自己提交的数据,以防将来有人对它感兴趣。确保文件的名称与表单的 action 相同。这是我的示例代码form.cgi

#!/usr/bin/perl        
use CGI::Carp qw(fatalsToBrowser set_message warningsToBrowser);
use CGI qw(:standard);
use strict;                     
use warnings;   

print header(); 

my $cgi = CGI->new();

my $check;
$check = $cgi->param('check') if defined $cgi->param('check');

my $newhtml = '';

if ($check eq "yes") { #collect form data and build email subroutine
my $fromemail = $cgi->param('mailFrom');
my $toemail = $cgi->param('mailTo');
my $subject = $cgi->param('subjectLine');
my $message = $cgi->param('messageBody');

$newhtml = qq{
<html>
<body>
<b>Email sent!</b>
<br>
The from email is from $fromemail<br>
The to email is to $toemail<br>
The subject is $subject<br>
The message is $message<br>
</body>
</html>
 };

sub mailForm {
open(MAIL, "|/usr/sbin/sendmail -t");

print MAIL "To: $toemail\n";
print MAIL "From: $fromemail\n";
print MAIL "Subject: $subject\n\n";

print MAIL $message;

close(MAIL);
}


} #end of if check

my $html = qq{
<html>
<body>
   <form action="form.cgi" method="POST">

<h1>Feedback Form</h1>
<p>Please fill out the entire feedback form.</p>
<table>
<tr>
<td><b>To (recipient's e-mail address):</b></td>
</tr>
<tr>
<td><input type = "text" name = "mailTo" size = "40" maxlength = "50"  /></td>
</tr>
<tr>
<td><b>From (your e-mail address):</b></td>
</tr>
<tr>
<td><input type = "text" name = "mailFrom" size = "40" maxlength = "50" /></td>
</tr>
<tr>
<td><b>Enter a subject:</b></td>
</tr>
<tr>
<td><input type = "text" name = "subjectLine" size = "40" maxlength = "50"></td>
</tr>
<tr>
<td><b>Enter your message:</b></td>
</tr>
<tr>
<td><textarea name = "messageBody" rows = "10" cols = "50" maxlength = "300"></textarea></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td><input type = "submit" name = "sbutton" value = "Submit" />
<input type = "reset" value = "Reset" />
<input type = "hidden" name = "check" value = "yes">
</td>
</tr>
</table>

</form>

<br>

</body></html>
};

#this prints the regular page if no form is submitted
if (!defined $check) {
print $html;
}

#this mails the form data and prints a confirmation page
else {
print $newhtml; 
mailForm();
}

exit 0;