
El CGI está escrito en lenguaje Perl, que es un lenguaje muy sencillo de utilizar y que permite escribir programas de escasa dificultad con poco código.
Veamos primero cual será el formulario:
Será un formulario en el que se pida al usuario la introducción de ciertos datos y el envio de comentarios, el formulario será el siguiente:


<form action="nombre.cgi" method=post>
Nombre: <input type=text name=nombre size=30><p>
Apellidos: <input type=text name=apellido size=50s><p>
Email: <input type=text name=email size=20><p>
Estamento: <select name=estamento>
<option value=pas>PAS
<option value=pdi>PDI
</select>
<p>
Introduzca sus comentarios:
<p>
<textarea name=comentar rows=5 cols=80>
</textarea>
<input type=submit value="Enviar">
</form>

Para ello crearemos un programa con la extensión .cgi que será el que se especifique en el atributo ACTION de la instrucción FORM.
El contenido de este programa escrito en lenguaje perl es el siguiente:

#!/usr/local/bin/perl -- -*-perl-*-
# Definición del programa para enviar correo, debe dejarse sin cambios.
$progmail = '/usr/lib/sendmail';
# Usuario al que se enviarán los mensajes. Deberá poner su alias de correo electrónico.
$destino = '___________@uca.es';
# Indica que se trata de un documento HTML
print "Content-type: text/html\n\n";


# Obtiene la entrada
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
# Divide las variables entre nombre y valor.
@pairs = split(/&/, $buffer);
# Optiene 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 la respuesta es vacia, se llama a una función que la trata
&blank_response unless $FORM{'comentar'};


# Imprime el título y la cabecera
print "<Head><Title>Gracias</Title></Head>";
print "<Body><H1>Muchas Gracias, sus comentarios serán bienvenidos</H1>";
# Imprime el texto del texto a mostar.
print "Gracias por enviar sus comentarios a <I>__________</I>!<P>";
print "Vuelva a la <A HREF=\"__________\">página inicial</A>, si lo desea.<P>";

Cada línea la formará una instrucción print y entre comillas el texto HTML que se quiere que aparezca. En caso que la instrucción HTML tenga comillas, deberá incluir la secuencia de escape \" como se ve en el ejemplo.

# Ahora enviamos el mail al $destino
open (SALIDA, "|$progmail $destino") || die "No puedo abrir $progmail!\n";
print SALIDA "Reply-to: $FORM{'email'} ($FORM{'nombre'} $FORM{'apellidos'})\n";
print SALIDA "Subject: Comentarios al formulario de prueba ($FORM{'nombre'} $FORM{'apellidos'})\n\n";
print SALIDA "$FORM{'nombre'} $FORM{'apellidos'} del $FORM{'estamento'}envio \n";
print SALIDA "El siguiente comentario::\n\n";
print SALIDA "------------------------------------------------------------\n";
print SALIDA "$FORM{'comentar'}";
print SALIDA "\n------------------------------------------------------------\n";
close (SALIDA);

En la línea que comienza como Reply-to: se incluirá la dirección de correo a la que se debe replicar el mail, normalmente la dirección de correo de quién envió el formulario.
En la línea que comienza con Subject: Se incluirá el texto que se desea que aparezca como subject del mensaje, que será un texto que le ayuda a identificar el origen del mensaje.
Y luego se incluirán las respuestas al formulario, el orden que lo ponga es indiferente, siendo el formato que utilice el que se mostrará en el mensaje que usted reciba, en este caso como respuesta del formulario se obtendría por correo electrónico:
Date: Thu, 30 May 96 12:55:53 +0200
From: Servidor WWW de la UCA
Reply-To: usuario@uca.es (Nombre del usuario)
Subject: Comentarios al formulario de prueba (Nombre del usuario)
Apparently-To: destino@uca.es
Nombre del usuario del PDI envio
El siguiente comentario:
------------------------------------------------------------
Texto del comentario.
------------------------------------------------------------

# ------------------------------------------------------------
# subrutina blank_response para comentarios en blanco
sub blank_response
{
print "Sus comentarios estan en blanco, de manera que no seran";
print " enviados a __________. Por favor vuelva a introducirlos o vuelva";
print " a la <A HREF=\"__________\">página inicial</A> si lo desea.<P>";
exit;
}

Por tanto uniendo los trozos formaremos el programa que trataba el formulario anterior. Sobre este mismo programa se pueden introducir pequeñas modificaciones que permitan tratar practicamente cualquier tipo de formulario. Sí se desea que en vez de enviar un mail se genere un fichero donde se acumulen los comentarios, bastará cambiar la linea que ejecuta la instrucción open y cambiar el destino donde se realiza la salida.
Por ejemplo con cada comentario crearemos un fichero html en el que se irán acumulando en formato html los comentarios enviados, la forma de hacerlo será:

# Ahora enviamos la salida al fichero: /usr/local/etc/httpd/htdocs/dept/dept_img/datos/respuestas.htm
open (SALIDA, ">> /usr/local/etc/httpd/htdocs/dept/dept_img/datos/respuestas.htm") || die "No puedo abrir el fichero!\n";
print SALIDA "<hr>\n"
print SALIDA "<b>$FORM{'nombre'} $FORM{'apellidos'}</b> del <i>$FORM{'estamento'}</i> envio <br>\n";
print SALIDA "El siguiente comentario:<p>\n\n";
print SALIDA "<pre>\n"
print SALIDA "------------------------------------------------------------\n";
print SALIDA "$FORM{'comentar'}";
print SALIDA "\n------------------------------------------------------------\n";
print SALIDA "</pre>\n"
close (SALIDA);

11:32 merlin> chmod 775 datos
|
Se puede cambiar de forma que el formato de salida sea todo lo vistoso que se desee, creando así por ejemplo un libro de firmas con comentarios.
