Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Enviar Mail con archivo adjunto Responder al tema
Nuevo tema


Página 2 de 2  [ 25 mensajes ]  Ir a página Anterior  1, 2
 
Nota 2006-06-26 15:41 @695
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
* He arrancado mi WindowsXP.
* Me he conectado a www.activestate.com, entro en descargas de ActivePerl.
* Me bajo ActivePerl 5.8.8.817 para WindowsXP (o la última versión que exista).
* Lo instalo.
* Voy a Inicio->Programas->ActivePerl->Documentación. Arranca el navegador con toda la documentación.
En la parte izquierda aparece, abajo, toda la lista de módulos instalados.
En la parte de MIME, sólo hay dos, el Base64 y otro más, así que me toca instalar el MIME::Entity.
* Voy a Inicio->Programas->ActivePerl y arranco Perl Package Manager.
* Lo primero es poner la palabra help:
Imagen
* Como no estoy seguro de cómo se llama el paquete, hago una búsqueda:
Imagen
* Localizo lo que busco. Se llama MIME-tools en la posición 15.
* Lo instalo con install 15 o install MIME-tools:
Imagen
* Una vez todo instalado, voy a ver si arranca el programa que usa el módulo MIME::Entity. Primero miramos la sintaxis:
Imagen
* Y ahora queda por arrancarlo directamente. Lo probaré desde la línea de comandos y sin adjuntar un fichero, para ver si funciona sin errores.
Le pasaré dos argumentos como si lo hubiese ejecutado desde el web, como si fuera un cgi:
Imagen
* El resultado es un correo personalizado que recibo en mi Suse Linux:
Imagen
Naturalmente, para que este último paso funcione, mi servidor de correo (en otra máquina) permite que se puedan enviar correos desde mi WindowsXP.

Tiempo total: 7 minutos (5 minutos para bajar el Activestate e instalarlo, 1 minuto para bajar las MIME-tools, 1 minuto para hacer las pruebas).

Fíjate si merece la pena o no tener un Perl en condiciones...


Última edición por explorer el 2006-08-22 16:18 @721, editado 1 vez en total

Nota 2006-06-27 16:18 @721

Perlero Nuevo
Registrado: 2006-06-23 12:43 @571
Mensajes: 12
Hola explorer, hice la reinstalacion del perl, me baje la ultima version desde la web www.ActiveState.com y luego con el ppm instale el modulo MIME::Entity tambien el CGI::Carp para revisar los errores, ahora parece que ya no estamos tan mal, pero boto un solo error que dice lo siguiente.

Citar:
Can't use an undefined value as a HASH reference at c:\ARCHIV~1\APACHE~1\apache\cgi-bin\enviar.cgi line 88.


ese numero de linea pertenece a esta parte del codigo:

Código:
    # Adjuntamos el fichero si lo hay
    if ( $fichero ) {
        $msg->attach(
                    Type    => uploadInfo($fichero)->{'Content-Type'},
                    Data    => [ $contenido ],
                    Encoding=> 'base64',
        );
    }


la pantalla de error se pinta un formulario html que es la que se crea en el codigo del enviar.cgi y en nombre muestra el nombre que mando, el mensaje tambien se muestra todo el contenido pero en el inpute type file no muestra nada derrepente por ahi puede estar el error.

_________________
Marfperu


Nota 2006-06-28 06:52 @328
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Es muy posible que tu navegador de internet no esté enviando las cabeceras MIME al cgi y éste no sepa qué tipo (Content-Type) de archivo está enviando el usuario.

El fallo entonces no es el del programa, sino del navegador utilizado, que será antiguo. La línea que creo que da el error es:
Código:
Type => uploadInfo($fichero)->{'Content-Type'},

Seguramente el módulo CGI, al intentar rellenar la información para uploadInfo() no encuentre el tipo MIME del documento y deje el campo Content-Type sin nada.

Ahora viene una pregunta de diseño de la web: ¿Qué tipo de ficheros quieres que la gente envíe? ¿De uno o de varios tipos distintos?

Supongamos que decides que todos los ficheros recibidos han de ser del tipo Documentos de Micro$oft Word, entonces cambiaríamos la línea por:
Código:
Type => uploadInfo($fichero)->{'Content-Type'} || 'application/msword',

Si en vez de Word, prefieres que la gente envíe documentos pdf, debes cambiarlo por 'application/pdf'. Si no estás seguro, entonces hay que indicar un valor genérico, como podría ser 'application/octet-stream'.

Seguro que hay otra forma para saber el Content-Type del documento...


Nota 2006-06-28 10:07 @463

Perlero Nuevo
Registrado: 2006-06-23 12:43 @571
Mensajes: 12
Sigue saliendo el mismo error a pesar que le pongo esos valores que me has dado, y no creo que sea problema de la antiguedad del navegador porque es el iexplorer 6 mas moderno a ese es el 7 pero es beta, a parte que la idea es que esto funcione en un entorno web, ahora los ficheros que quiero enviar son .doc ahora, lo particular es que cuando hago el envio aparece la pantalla en html que el codigo me manda a pintar, sale el textbox con el nombre, el textbox con el mensaje pero en el textbox del <input type=file nunca aparece nada a pesar de que mas abajo muestra los datos a enviar y ahi si aparece la ruta del adjunto, ahora cuando ahi en esa pantalla le doy al boton examinar y ingreso la ruta y hago el envio ahi si funciona.

_________________
Marfperu


Nota 2006-06-28 11:43 @530
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
¿Es la línea del error la que estamos hablando o es otra? Si el error dice que está en la línea 88, yo he supuesto que era esa.

Lo he probado en mi WindowsXP a mi no me falla. El Explorer 6 sí que devuelve el MIME correcto.

Otra cosa, el que no salga el nombre del fichero por segunda vez es un tema de seguridad en los navegadores modernos, que siempre lo borran.


Nota 2006-06-28 11:56 @538

Perlero Nuevo
Registrado: 2006-06-23 12:43 @571
Mensajes: 12
Si esa es la misma linea la 88 y esa linea corresponde a toda la funcion:

if ( $fichero ) {
$msg->attach( <--------------------Linea 88
Type => uploadInfo($fichero)->{'Content-Type'} || 'application/octet-stream',
Data => [ $contenido ],
Encoding=> 'base64',
);
}


no entiendo porque a mi no me funciona, en todo caso no se si podrias mandarme una copia del codigo que a ti si te funciona derrepente algo se me esta escanpando.

_________________
Marfperu


Nota 2006-06-28 12:29 @562
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
He revisado el código de tu programa, el último que has publicado. Lo he copiado y pegado a mi máquina y tenía varios errores:

* En la sección de lectura de los parámetros, no coinciden los nombres que se usan en el formulario html con los que luego usas para intentar leerlos.
Así, en el formulario yo uso los campos 'nombre', 'mensaje' y 'fichero'. Pero en tu programa insistes en leer:
Código:
$nombre = param('nombre');
$fichero = param('file');
$mensaje = param('todo');
Solución:
Código:
$nombre = param('nombre');
$fichero = param('fichero');
$mensaje = param('mensaje');

* El otro problema está al final, que usas dos métodos para enviar el correo. Salvo que quieras recibir dos correos, es mejor que sólo uses un método cada vez.

Te sale mucho más rápido que copies el código que dejé en el mensaje 4409 de la página anterior, el que tiene puesto el Asunto Solucion con MIME::Entity, pues ese es el que funciona, y cambies los campos de correo electrónico con los tuyos.


Nota 2006-06-28 12:43 @571

Perlero Nuevo
Registrado: 2006-06-23 12:43 @571
Mensajes: 12
mmmmm no creo que ese sea el problema yo ya me habia percatado de esos errores anteriormente y los habia corregido puse todo exactamente como tu lo enviaste por si acaso este es mi codigo final, con respecto a tus pruebas te cuento que me llegaron dos correos uno sin adjunto y otro con adjunto que era un txt aca esta mi codigo final por si acaso para que le des una mirada y a pesar de eso sigue mostrando ese mismo error derrepente aca encuentras algun error en mi codigo que esta haciendo que no funcione bien.

Código:
#!C:\perl\bin\perl.exe -w

use CGI ':standard';
use CGI::Carp qw(fatalsToBrowser);
use MIME::Entity;
use warnings;
use strict;

# Variables
my $nombre  = "No hay nombre";
my $mensaje = "No hay mensaje";
my $fichero = "No hay fichero";

# Pintamos la página web
print
        header,
        start_html('Envío de consultas'),
            h1({align=>'center'},'Envío de consultas'),
            hr({width=>'80%'}),
            start_multipart_form,
                table(
                    Tr({valign=>'top'},
                        td("Nombre:"),
                        td(textfield(   -name=>'nombre',
                                        -size=>40,
                                        -maxlength=>80)),
                    ),
                    Tr({valign=>'top'},
                        td("Mensaje:"),
                        td(textarea(    -name=>'mensaje',
                                        -default=>'',
                                        -rows=>10,
                                        -columns=>50)),
                    ),         
                    Tr({valign=>'top'},
                        td("Currículum:"),
                        td(filefield(   -name=>'fichero',
                                        -default=>'Nombre del fichero a enviar',
                                        -size=>50,
                                        -maxlength=>80)),
                    ),
                ),
                submit,
            end_form,
        ;

# Comprobamos si el usuario nos ha pasado algún parámetro
if ( param() ) {

    $nombre  = param('nombre');
    $fichero = param('fichero');
    $mensaje = param('mensaje');

    # Los sacamos en pantalla, para comprobar
    print
            hr,
            p("Datos enviados:"),
            p,"Nombre: $nombre",br,"Mensaje: $mensaje",br,"Fichero: $fichero",
    ;

    # Leemos el fichero enviado
    my $contenido = '';
    my $fh = upload('fichero');
    if ( defined($fh) ) {
        my ($bytes,$buffer);
        while ( $bytes = read($fh,$buffer, 8192) ) {
            $contenido .= $buffer;
        }
    }

    # Creamos el correo electrónico
    my $msg = MIME::Entity->build(
                    Type    => "multipart/mixed",
                    From    => 'web@tottus.com.pe',
                    To      => 'mario.flores@makros.biz',
                    Subject => "Únete a nosotros - $nombre",
    );

    # Adjuntamos el mensaje si lo hay
    if ( $mensaje ) {
        $msg->attach(
                    Data    => [ $mensaje, "\r\n"x2 ],
        );
    }

    # Adjuntamos el fichero si lo hay
    if ( $fichero ) {
        $msg->attach(
                    Type => uploadInfo($fichero)->{'Content-Type'} || 'application/octet-stream',
                    Data    => [ $contenido ],
                    Encoding=> 'base64',
        );
    } 

    # Tercera forma de envío, con el smtpsend de Mail::Internet
   $msg->smtpsend(
                   Host    => 'mail.makros.biz',
                   Hello   => 'mail.makros.biz',
                   MailFrom=> 'web@tottus.com.pe',
   );

}

print end_html;

__END__

_________________
Marfperu


Nota 2006-06-28 13:05 @586

Perlero Nuevo
Registrado: 2006-06-23 12:43 @571
Mensajes: 12
Otra cosa que tambien probe fue enviarlo derectamente de la linea de comando pensando que la transferencia de variales de mi formulario al codigo de enviar.pl estaba mal pero lo probe por linea de comandos y me voto exactamente el mismo error:


Código:
Can't use an undefined value as a HASH reference at c:\ARCHIV~1\APACHE~1\apache\cgi-bin\enviar.cgi line 88.


tus correos si me siguen llegando con los adjuntos pero aca no funcionan no entiendo porque

_________________
Marfperu


Nota 2006-06-28 13:29 @603
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
He cambiado el código del mensaje 4409. He agregado y cambiado algunas cosas, sobre todo un par de controles para verificar que todo va bien. Y en caso de que algo falle, use diagnostics; nos de más información. Prueba...


Responder al tema  [ 25 mensajes ]  Ir a página Anterior  1, 2

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO