Ayuda HTML + CGI

ivanfdez
07 de Septiembre del 2003
Hola,

quería pediros ayuda acerca de un pequeño problema que me trae de cabeza con un formulario html:

se trata de un formulario simple, con cinco o seis sampos simples a rellenar (nombre, apellidos, email, ...) y los envío a un script CGI escrito en PERL que me separa esos datos y me los envía por mail a mi dirección particular. El problema es que dicho script me manda el correo pero con los campos en blanco.

Este es el código del formulario (como véis, es de lo más simple):

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Alta Usuario</title>
</head>
<body>
<FORM ACTION=../cgi-bin/procesa_form.cgi METHOD=POST>

&nbsp;<div align="left">
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="102%" id="AutoNumber1">
<tr>
<td width="22%" align="right">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
<tr>
<td width="22%" align="right">

<B> Usuario:</B></td>
<td width="20%"> <input type=text NAME=usuario size=20></td>
<td width="20%">
<p align="left"><B>@eltruebano.com</B></td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
<tr>
<td width="22%" align="right">
<B> Password:</B></td>
<td width="20%"> <input type=password NAME=password size=20></td>
<td width="20%">
<p align="right">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
<tr>
<td width="22%" align="right">
<B>Repite password:</B></td>
<td width="20%"><input type=password NAME=password2 size=20></td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
<tr>
<td width="22%" align="right">

<B> Nombre:</B></td>
<td width="20%"> <input type=text NAME=nombre size=20></td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
<tr>
<td width="22%" align="right">
<B> Apellidos:</B></td>
<td width="40%" colspan="2"> <input type=text NAME=apellidos size=40></td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
<tr>
<td width="22%" align="right">
<B> E-mail de contacto:</B></td>
<td width="40%" colspan="2"> <input type=text NAME=email size=40></td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
<tr>
<td width="22%" align="right">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
<tr>
<td width="22%" align="right">&nbsp;</td>
<td width="20%">
<p align="center">

<input type=submit value="Enviar" style="float: left"></td>
<td width="20%"><input type=reset value="Borrar"></td>
<td width="20%">&nbsp;</td>
<td width="20%">&nbsp;</td>
</tr>
</table>
</div>
<p align="center">&nbsp;</p>
</FORM>
</body>
</html>

Si, ya sé que está dentro de una tabla, pero era para hacerlo más estético. A continuación el contenido del script:

#!/usr/bin/perl -w

# Definicion del programa para enviar correo
$progmail = '/usr/lib/sendmail';

# Usuario al que se enviaran los mensajes
$destino = '[email protected]';

# Indica que se trata de un documento HTML
print "Content-type: text/htmlnn";

# Obtiene la entrada
read(STDIN, $buffer, $ENV{'CONTENT_LENGHT'});

# Divide las variables entre nombre y valor
@pairs = split(/&/, $buffer);

# Obtiene todas las variables y sus valores
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

$FORM{$name} = $value;
}

# Si el campo usuario esta en blanco, se llama a la funcion que la trata
# &blank_response unless $FORM{'usuario'};

# Si el campo password esta en blanco hacemos otro tanto
# &blank_response unless $FORM{'password'};

# Imprime el titulo y la cabecera
print "<Head><Title>Gracias</Title></Head>";
print "<Body><H1>Muchas Gracias. En breve tendra activa su cuenta</H1>";

# Imprime el texto a mostrar
#print "Vuelva a la <A HREF="www.eltruebano.com">pagina inicial</A>, si lo desea.<P>";

# Ahora enviamos el mail al $destino
open (SALIDA, "|$progmail $destino") || die "No puedo abrir $progmail!n";
print SALIDA "Reply-to: $FORM{'email'}n";
print SALIDA "Subject: Peticion de alta en eltruebano.comnn";
print SALIDA "NOMBRE $FORM{'nombre'}nAPELLIDOS $FORM{'apellidos'}nLOGIN $FORM{'usuario'}nPASSWORD $FORM{'password'}nPASSWORD $FORM{'password2'}n";
print SALIDA "EMAIL $FORM{'email'}nn";
print SALIDA "---------------------------------------------------------n";
close (SALIDA);

# -----------------------------------------------------------------------------------
# Subrutina blank_response para campos en blanco
sub blank_response
{
print "ERROR: Ha dejado algun campo obligatorio en blanco, de manera que sus datos no seran";
print " enviados a www.eltruebano.com. Por favor vuelva a introducirlos o vuelva";
print " a la <A HREF="http://www.eltruebano.com">pagina inicial</A> si lo desea.<P>";
exit;
}

Como podréis ver, tengo algún campo comentado, ya que siempre me daba que no había introducido ningún dato (por lo que el script llega a procesar los datos del formulario, pero es como si el formulario no enviase los datos correctamente al CGI)

¿Alguien me puede echar una mano? Ya he reescrito el formulario y no doy con el problema.

Un saludo y gracias de antemano,
Iván Fdez.