• Publicidad

Enviar Mail con archivo adjunto

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Notapor explorer » 2006-06-26 15:41 @695

  • 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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Notapor marfperu » 2006-06-27 16:18 @721

Hola, explorer. Hice la reinstalación del Perl, me bajé la última versión desde la web http://www.ActiveState.com y luego con el PPM instalé el módulo MIME::Entity. También el CGI::Carp para revisar los errores. Ahora parece que ya no estamos tan mal, pero boto un solo error que dice lo siguiente.

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


Ese número de línea pertenece a esta parte del código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     # Adjuntamos el fichero si lo hay
  2.     if ( $fichero ) {
  3.         $msg->attach(
  4.                     Type    => uploadInfo($fichero)->{'Content-Type'},
  5.                     Data    => [ $contenido ],
  6.                     Encoding=> 'base64',
  7.         );
  8.     }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La pantalla de error se pinta un formulario HTML que es la que se crea en el código del enviar.cgi y en nombre muestra el nombre que mando, el mensaje también se muestra todo el contenido pero en el input type file no muestra nada. De repente por ahí puede estar el error.
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Notapor explorer » 2006-06-28 06:52 @328

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. Type => uploadInfo($fichero)->{'Content-Type'},
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. Type => uploadInfo($fichero)->{'Content-Type'} || 'application/msword',
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

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...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor marfperu » 2006-06-28 10:07 @463

Sigue saliendo el mismo error a pesar que le pongo esos valores que me has dado, y no creo que sea problema de la antigüedad del navegador porque es el iexplorer 6 más 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 envío aparece la pantalla en html que el código 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 más abajo muestra los datos a enviar y ahí sí aparece la ruta del adjunto, ahora cuando ahí en esa pantalla le doy al botón examinar y ingreso la ruta y hago el envío ahí sí funciona.
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Notapor explorer » 2006-06-28 11:43 @530

¿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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor marfperu » 2006-06-28 11:56 @538

Sí, esa es la misma línea, la 88, y esa línea corresponde a toda la función:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     if ( $fichero ) {
  2.         $msg->attach(
  3.                     Type => uploadInfo($fichero)->{'Content-Type'} || 'application/octet-stream',
  4.                     Data    => [ $contenido ],
  5.                     Encoding=> 'base64',
  6.         );
  7.     }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

No entiendo por qué a mi no me funciona, en todo caso no sé si podrías mandarme una copia del código que a ti sí te funciona. de repente algo se me está escapando.
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Notapor explorer » 2006-06-28 12:29 @562

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:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1.  $nombre = param('nombre');
    2.  $fichero = param('file');
    3.  $mensaje = param('todo');
    Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
    Solución:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1.  $nombre = param('nombre');
    2.  $fichero = param('fichero');
    3.  $mensaje = param('mensaje');
    Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
  • 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 Solución con MIME::Entity, pues ese es el que funciona, y cambies los campos de correo electrónico con los tuyos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor marfperu » 2006-06-28 12:43 @571

Hummmmm... no creo que ese sea el problema. Ya me había percatado de esos errores anteriormente y los había corregido. Puse todo exactamente como tu lo enviaste. Por si acaso este es mi código final. Con respecto a tus pruebas te cuento que me llegaron dos correos: uno sin adjunto y otro con adjunto que era un txt. Acá está mi código final por si acaso para que le des una mirada y a pesar de eso sigue mostrando ese mismo error. De repente acá encuentras algún error en mi código que está haciendo que no funcione bien.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\perl\bin\perl.exe -w
  2.  
  3. use CGI ':standard';
  4. use CGI::Carp qw(fatalsToBrowser);
  5. use MIME::Entity;
  6. use warnings;
  7. use strict;
  8.  
  9. # Variables
  10. my $nombre  = "No hay nombre";
  11. my $mensaje = "No hay mensaje";
  12. my $fichero = "No hay fichero";
  13.  
  14. # Pintamos la página web
  15. print
  16.         header,
  17.         start_html('Envío de consultas'),
  18.             h1({align=>'center'},'Envío de consultas'),
  19.             hr({width=>'80%'}),
  20.             start_multipart_form,
  21.                 table(
  22.                     Tr({valign=>'top'},
  23.                         td("Nombre:"),
  24.                         td(textfield(   -name=>'nombre',
  25.                                         -size=>40,
  26.                                         -maxlength=>80)),
  27.                     ),
  28.                     Tr({valign=>'top'},
  29.                         td("Mensaje:"),
  30.                         td(textarea(    -name=>'mensaje',
  31.                                         -default=>'',
  32.                                         -rows=>10,
  33.                                         -columns=>50)),
  34.                     ),             
  35.                     Tr({valign=>'top'},
  36.                         td("Currículum:"),
  37.                         td(filefield(   -name=>'fichero',
  38.                                         -default=>'Nombre del fichero a enviar',
  39.                                         -size=>50,
  40.                                         -maxlength=>80)),
  41.                     ),
  42.                 ),
  43.                 submit,
  44.             end_form,
  45.         ;
  46.  
  47. # Comprobamos si el usuario nos ha pasado algún parámetro
  48. if ( param() ) {
  49.  
  50.     $nombre  = param('nombre');
  51.     $fichero = param('fichero');
  52.     $mensaje = param('mensaje');
  53.  
  54.     # Los sacamos en pantalla, para comprobar
  55.     print
  56.             hr,
  57.             p("Datos enviados:"),
  58.             p,"Nombre: $nombre",br,"Mensaje: $mensaje",br,"Fichero: $fichero",
  59.     ;
  60.  
  61.     # Leemos el fichero enviado
  62.     my $contenido = '';
  63.     my $fh = upload('fichero');
  64.     if ( defined($fh) ) {
  65.         my ($bytes,$buffer);
  66.         while ( $bytes = read($fh,$buffer, 8192) ) {
  67.             $contenido .= $buffer;
  68.         }
  69.     }
  70.  
  71.     # Creamos el correo electrónico
  72.     my $msg = MIME::Entity->build(
  73.                     Type    => "multipart/mixed",
  74.                     From    => '[email protected]',
  75.                     To      => '[email protected]',
  76.                     Subject => "Únete a nosotros - $nombre",
  77.     );
  78.  
  79.     # Adjuntamos el mensaje si lo hay
  80.     if ( $mensaje ) {
  81.         $msg->attach(
  82.                     Data    => [ $mensaje, "\r\n"x2 ],
  83.         );
  84.     }
  85.  
  86.     # Adjuntamos el fichero si lo hay
  87.     if ( $fichero ) {
  88.         $msg->attach(
  89.                     Type => uploadInfo($fichero)->{'Content-Type'} || 'application/octet-stream',
  90.                     Data    => [ $contenido ],
  91.                     Encoding=> 'base64',
  92.         );
  93.     }  
  94.  
  95.     # Tercera forma de envío, con el smtpsend de Mail::Internet
  96.    $msg->smtpsend(
  97.                    Host    => 'mail.makros.biz',
  98.                    Hello   => 'mail.makros.biz',
  99.                    MailFrom=> '[email protected]',
  100.    );
  101.  
  102. }
  103.  
  104. print end_html;
  105.  
  106. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Notapor marfperu » 2006-06-28 13:05 @586

Otra cosa que también probé fue enviarlo directamente de la línea de comando pensando que la transferencia de variables de mi formulario al código de enviar.pl estaba mal pero lo probé por línea de comandos y me botó exactamente el mismo error:

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 sí me siguen llegando con los adjuntos pero acá no funcionan. No entiendo por qué.
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Notapor explorer » 2006-06-28 13:29 @603

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...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados

cron