Banda Ancha EU

Comunidad de usuarios
de fibra, móvil y ADSL

hosting en interdominios
218 lecturas y 13 respuestas
  • Formulario

    Saludos a todos. A ver si alguien puede ayudarme

    Cuestión: tengo un formulario en una página web, y su cgi correspondiente. Están alojados en una máquina Linux. Pero por más vueltas que le doy no consigo que funcione. Ya le he dado permisos de ejecución al cgi con chmode (755), y todo lo que me han dicho los administradores, pero debe haber algún error que se me escapa.

    Adjunto el formulario html y el cgi de los c.............

    ESTE ES EL CGI

    -----------------------------------------------------------------------------------

    #!/usr/bin/perl

    # Definicion del programa para enviar correo, debe dejarse sin cambios
    $progmail = '/usr/sbin/sendmail';

    #Usuario al que se enviaran los mensajes. Debe poner su alias de correo electronico
    $ destino = 'manuellopezrey@gmail.com';

    #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);

    # 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;
    }

    # Ahora enviamos el mail al $destino
    open (SALIDA, "|$progmail $destino") || die "No puedo abrir $progmail!\n";
    print SALIDA "Content-type: text/plain; charset=\"utf-8\"\n";
    print SALIDA "To: manuellopezrey\@gmail.com\n";
    print SALIDA "Reply-to: $FORM{'email'} ($FORM{'nombre'})\n";
    print SALIDA "Subject: Enviar a Inedito\n\n";
    print SALIDA "-----------------------------------------------------------------------------\n";
    print SALIDA "Nombre: $FORM{'nombre'}\n";
    print SALIDA "E-mail: $FORM{'email'}\n";
    print SALIDA "Web, blog...: $FORM{'web'}\n";
    print SALIDA "Titulo de la obra que adjuntas: $FORM{'titulo'}\n";
    print SALIDA "-----------------------------------------------------------------------------\n";
    print SALIDA "Si la obra no es tuya\n";
    print SALIDA "Autor: $FORM{'autor'}\n";
    print SALIDA "Titulo: $FORM{'titulo2'}\n";
    print SALIDA "Dónde ha aparecido o ha sido publicada con anterioridad: $FORM{'donde'}\n";
    print SALIDA "Adjunta aquí tu fichero: $FORM{'file'}\n";
    print SALIDA "Comentarios: $FORM{'comentarios'}\n";

    close (SALIDA);

    print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n";
    print "n";
    print "<head>\n";
    print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
    print "<!-- InstanceBeginEditable name=\"doctitle\" -->\n";
    print "<TITLE>\n";
    print "Enviar a Inedito\"n";
    print " <!-- Plantilla - Etiquetas meta y link del head -->";
    print " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
    print " </head>\"n";
    print " <body>\"n"
    print "<h2>Tu formulario se ha enviado correctamente. Muchas gracias.</h2>\n";
    print "</body>\n";
    print "\n";
    print "</html>\n";

    -----------------------------------------------------------------------------------

    Y aqui podeis ver el formulario (descargandolo)

    www.filefront.com/14445227/formulario.jpg

    Este tema lleva más de 6 meses inactivo. Es recomendable que abras un nuevo tema para retomar la conversación.
    • Boca de Pez Boca de Pez
      6

      A la próxima, no uses un alojamiento público de ficheros…

      A la próxima, no uses un alojamiento público de ficheros generalista, sino uno especializado en imágenes, para que se puedan ver sin descargarlas.

    • Boca de Pez Boca de Pez
      6

      Del primer vistazo, estas líneas están mal, ¡revisa la…

      Del primer vistazo, estas líneas están mal, ¡revisa la sintaxis!

      print "Enviar a Inedito\"n";

      print " \"n";
      print "

      \"n"

      Y esta sobra:

      print "\n";

    • Boca de Pez Boca de Pez
      6

      Otra que sobra al principio de la respuesta: print "n";…

      Otra que sobra al principio de la respuesta: print "n";

      Además ten en cuenta que no hay retornos de carro en los títulos de una página HTML y que se debe usar < T I T L E / > para cerrarlo

      ¿Demasiado corta-pega sin entender PERL o HTML? :|

        • Gracias por las respuestas, compañero. Ya he hecho los…

          Gracias por las respuestas, compañero.

          Ya he hecho los cambios que me dices, pero el servidor tarda en pillar los cambios, por lo cual tendre que esperar a ver. Ya te contaré cosas :-/

          Con el HTML me voy defendiendo (modestamente hablando), pero de PERL ni pajolera idea :( :D. Vamos sobreviviendo como podemos

          Salu2

          • Boca de Pez Boca de Pez
            6
            ¿Cómo que "el servidor tarda en pillar los cambios"? ¿Por qué…

            ¿Cómo que "el servidor tarda en pillar los cambios"? ¿Por qué no es instantáneo? Es un fichero Perl, no es una aplicación Java que necesita recargarse.

            Que yo sepa (corregidme si estoy equivocado) el fichero .pl se ejecuta en tiempo real y no se cachea, ¿no?

            • Hola a todos. Me decís que siga este hilo para mi problema…

              Hola a todos.

              Me decís que siga este hilo para mi problema del formulario y el cgi. Así lo hago, y quiero decir que con las indicaciones que me habeis dado no me funciona. Hice las correcciones que se me dijeron, pero nada. Así que os remito al primer mensaje de este hilo.

              Y sí, soy una chica. Por eso pongo desesperada en femenino, como bien observó alguien en el otro hilo.

              ;) Gracias a todos.

              • Boca de Pez Boca de Pez
                6
                Hola, Soy el que te andaba respondiendo. Yo no sé Perl como…

                Hola,

                Soy el que te andaba respondiendo. Yo no sé Perl como para hacer un programa, pero el llevar 25 años con ordenadores me hacen ver cosas raras (a veces veo muertos y eso) que cantan a la legua. Por ejemplo, si una variable en Perl se ve que se designa con un símbolo $ delante ... no pongas un espacio entre el $ y el nombre de la variable:

                #Usuario al que se enviaran los mensajes. Debe poner su alias de correo electronico
                $ destino = 'manuellopezrey@gmail.com';

                El espacio entre $ y destino sobra. Te comenté hace unos días que revisases esas sintaxis extrañas.

                También, si los símbolos =~ definen un operador ... ten en cuenta que aquí también has metido un espacio de más:

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

                Si no conoces el lenguaje, supongo que habrás copiado ese trozo de código desde otra página. Revisalo bien.

                Tampoco estás diciendo cómo se comporta cuando falla. Solo dices que falla, pero eso no nos da información. Pon mensajes intermedios en el código que digan "he llegado hasta el punto 1" ... "he llegado hasta el punto 2" ... "he llegado hasta el punto 3"; esa es la forma más antigua de debug.

                Revisa también logs del servidor web que llama al CGI, a ver si te da información adicional. El "die" te tendría que mandar el mensaje de "No puedo abrir /usr/sbin/sendmail" a ese log.

                Por cierto, ¿se ejecuta sendmail o no se ejecuta?. No nos lo dices. ¿Está sendmail en la ruta correcta? ¿Funciona llamandolo directamente desde la consola? ¿Tienes shell en esa máquina para probar esto último? Son muchas cosas.

                • Hola, mil gracias por responderme. Te cuento: Ya he corregido…

                  Hola,

                  mil gracias por responderme. Te cuento:

                  Ya he corregido lo que me dices de la sintaxis. He vuelto a subir el cgi y no hace nada. Cuando digo que no funciona me refiero a que al dar al botón "enviar" del formulario el navegador va a una página que es:

                  manuellopezrey.com/cgi-bin/formularioinedito.cgi

                  pero está en blanco.

                  Yo creo que no puedo revisar los logs del servidor ya que no tengo acceso, solo a ftp.

                  Sobre si se ejecuta sendmail, doy por hecho que no, al salir esta página que te digo en blanco.

                  Según lo que poco que sé, el sendmail sí está en la ruta correcta.

                  ¿Cómo se le llama directamente desde la consola, por favor?

                  Ten en cuenta que yo no tengo acceso a ese servidor, solo me proporciona hosting para un sitio web.

                  Lo que no comprendo es lo siguiente: yo he hecho unos formularios con sus cgis correpondientes en una maquina unix a la que sí tenía acceso para dar permisos a los cgis, ejecutar la orden que te decía si tenían fallos, etc. Y funcionan perfectamente. Estos modelos son los que he usado, para, como tú muy bien dices, "copiar y pegar" gran parte del asunto, y aunque no sé perl entiendo cómo funciona el tema como concepto. ¿Por qué en esta máquina linux no va? ¿Crees que puede ser ese el motivo?

                  Muchas gracias y saludos.

                  • Acabo de encontrar un taller sencillo de PERL y CGI en…

                    Acabo de encontrar un taller sencillo de PERL y CGI en Internet. Lo voy a estudiar a ver si por mi parte saco algo en limpio. Ya iré contando mis progresos.

                    Saludos.

                  • Boca de Pez Boca de Pez
                    6
                    En servidores ajenos es complicado hacer las cosas, sobre…

                    En servidores ajenos es complicado hacer las cosas, sobre todo cuando no te han proporcionado acceso por telnet (que es lo que me refería con lo de "consola" o "shell") para que puedas moverte libremente, aunque con los privilegios adecuados, por el sistema. En esos casos de alojamiento, suelen definir en sus condiciones de contrato qué se puede hacer y qué no, y qué recursos hay disponibles.

                    Ten en cuenta que ni siquiera se puede garantizar que sendmail exista; no es un componente clave del sistema, y por supuesto no es el único MUA (Mail User Agent) ni el único MTA (Mail Transport Agent) que existen en el mercado, aunque sí sea el más extendido junto con qmail.

                    Es muy difícil tratar a ciegas este asunto, y menos de manera remota.

                  • Boca de Pez Boca de Pez
                    6
                    Yo otra vez. Perdón por entrar como BocaDePez. Lo primero que…

                    Yo otra vez. Perdón por entrar como BocaDePez.

                    Lo primero que tendrías que probar es quitar la línea OPEN y el canal SALIDA de los print siguientes, para ver si el CGI saca por pantalla correctamente todos los campos del formulario que supuestamente iban a ir reenviados por correo.

                    Y cuando veas que todo es correcto, solo entonces centrarte en el posible problema del sendmail. Ten en cuenta que ahí tienes un "die" (morir) y que el programa puede estar muriendo sin sacar nada por pantalla, justo por eso, porque no haya sendmail o no esté donde piensas.

                    También centrarte en los posibles problemas de seguridad. ¿Y si a alguien se le ocurre subir un fichero de 100 megas? ¿Lo imprimirías en el correo? ¿Y si es binario? Creo que tendrías que empezar a buscar librerías PERL de gestión de correo adicionales, antes de poder meterte en berenjenales complicados.

                    Un saludo.

                    • Pues sí, es difícil tratar esto así. Lo que no termino de…

                      Pues sí, es difícil tratar esto así. Lo que no termino de comprender es cómo a estas alturas unos señores que te dan un hosting para un sitio web normalito no tienen incorporado un servicio de formularios. Este es el problema en realidad, porque los que no sabemos también queremos tener formularios sin necesidad de rompernos la cabeza. Ya, me dirás que hubiese elegido otra compañía de hosting, pero esto ya era así cuando yo llegué.

                      Si te digo la verdad, y perdón por la expresión, es un mierda de alojamiento.

                      Muchas gracias por tu interés. Saludos.