Я пытаюсь создать форму с помощью PERL / CGI и хочу обработать данные, введенные в этой форме, в одном и том же файле CGI. - PullRequest
0 голосов
/ 25 апреля 2019

'Я пытаюсь создать форму с помощью 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 голосов
/ 25 апреля 2019

Вы используете много переменных, которые не имеют значений - $mailTo, $subjectLine, $message. Я думаю, что вы привыкли к PHP, где переменные, подобные этим, заполняются автоматически для вас. Это не так в Perl. Вам нужно извлечь данные поля формы самостоятельно.

Когда вы пишете CGI-программу, вам проще всего использовать для этого функцию param() из модуля CGI.

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-программы, будет хорошей идеей уделить время прочтению документации для модуля CGI . Но я также рекомендую прочитать CGI :: Alternatives , поскольку CGI больше не является лучшим способом написания веб-программ на Perl.

Кроме того, в вашем HTML ваш закрывающий тег </form> должен идти после всех входных данных формы.

0 голосов
/ 11 мая 2019

Легко иметь сам вызов CGI-формы perl, вот небольшой пример с использованием вашего HTML-кода. (Кстати, все поля формы должны быть заключены в теги <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;
0 голосов
/ 25 апреля 2019

Все ваши поля ввода должны быть между открывающими <form> и закрывающими </form> тегами.

Кроме того, метод формы должен быть "post", а не "get".

Форма действия у вас как form.cgi.Где этот файл находится на вашем сервере?В типичных настройках он может находиться в каталоге cgi-bin, и в этом случае вы можете попробовать action="/cgi-bin/form.cgi".

Надеюсь, что эти предложения помогут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...