• Publicidad

Enviar Mail con archivo adjunto

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

Enviar Mail con archivo adjunto

Notapor marfperu » 2006-06-23 12:49 @576

Hola a todos. Soy algo nuevo en Perl y la vez pasada pude programar un envío de correo en Perl y la verdad me causó muchos problemas pero finalmente me funcionó. El problema es que ahora necesito que ese mismo código me sirva para enviar correos pero con archivos adjuntos.

Quisiera que me ayuden a ver cómo lo puedo hacer ya que no tengo idea y los ejemplos que encontré no son muy claros. Gracias de antemano. Acá les pego el código que uso para envío de correo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\perl\bin\perl.exe -w
  2.  
  3. use strict;
  4. use Mail::Sendmail;
  5. use CGI qw(:standard);
  6.  
  7. my $nombre = param('textnombre');
  8. my $file = param('file');
  9. my $mensaje =param('todo');
  10.  
  11.  
  12. # Creamos el hash con nuestro mensajes
  13. my %mail = (
  14.     To => '[email protected]',
  15.     From => 'Web',
  16.     Subject => 'Consultas',
  17.     Message => $mensaje,
  18.     file => $file,
  19.     Smtp => 'smtpserver'
  20. );
  21.  
  22. # Enviar el mensaje
  23. unless (sendmail(%mail)) {
  24.     print "Location: http://localhost/noenvio.htm \n\n";
  25.     # Error!
  26.     exit(1);
  27. }
  28.  
  29. # Envío correcto.
  30. print "Location: http://localhost/envio.htm \n\n";
  31.  
  32. exit(1);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Publicidad

Notapor explorer » 2006-06-23 14:44 @655

Bienvenido al foro. Aquí intentaremos ayudarte. Lo primero que deberías ver serían los tutoriales y si no encuentras nada, prueba a Buscar en este mismo foro. Por ejemplo, buscando por la palabra adjunto, ha salido la respuesta:

¡Respondida!

Más pistas:
* sendmail
* Problemas al enviar mail con Perl

Si esto no te lo soluciona, aquí te daremos más pistas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Enviar Mail Con Archivo Adjunto

Notapor marfperu » 2006-06-23 15:52 @703

Bueno yo uso el módulo de Sendmail, no el MIME::Entity en todo caso guiandote del código que puse en el primer mensaje, podrias decirme como hacerlo con el MIME:Entity?

ok y ese modulo donde lo consigo lo estoy buscando en internet y no lo encuentro, otra pregunta seria, donde ubico el cuerpo del mensaje, no veo la variable que tenga ese valor.
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Notapor explorer » 2006-06-23 17:53 @786

El cómo instalarlo depende de tu sistema operativo.

Como regla general, primero debes buscar los módulos que se hayan empaquetado para tu sistema. En Windows, se suele usar el gestor ppm que viene con ActiveState.

En Linux, depende de tu distribución. Por ejemplo, en Debian, hay muchos paquetes con módulos. El que te interesa se llama libmime-perl, por lo que haciendo un apt-get install libmime-perl se instalará sin problemas. El resto de distribuciones puede tener el mismo nombre o no. En Suse se llama perl-MIME-tools.

Si no encuentras el nombre correcto del paquete, siempre se puede probar a instalar con el comando cpan MIME::Entity.

Como solución, final, queda bajárselo de donde están todos los paquetes, CPAN: MIME-tools.
Última edición por explorer el 2006-07-13 05:39 @277, 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Enviar Mail Con Archivo Adjunto

Notapor marfperu » 2006-06-23 19:17 @845

Primero bajé el archivo del módulo MIME:Entity. Es un archivo Entity.pm que lo ubiqué en la carpeta site/MIME de la carpeta principal del Perl.

Segundo, creé el archivo enviar.cgi que tiene este contenido:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\perl\bin\perl.exe -w
  2.  
  3. use MIME::Entity;
  4.  
  5. my $file = param('file');
  6. my $mensaje =param('todo');
  7.  
  8. my $msg = MIME::Entity->build(
  9.     From    => 'Web',
  10.     To      => '[email protected]',
  11.     Subject => "Únete a Nosotros-Curriculum",
  12.     Type    => 'text/plain',
  13.     Encoding => 'base64',
  14.     Data   => $mensaje,
  15. );
  16.  
  17. $msg->attach(
  18.     Path     => $file,
  19.     Type     => 'application/msword',
  20.     Encoding => 'base64',
  21. );
  22.  
  23. $msg->smtpsend(
  24.     Host  => 'mailserver',
  25.     Hello => 'localhost',
  26. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y luego de hacer la prueba me da una página de error que dice lo siguiente:

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request


No sé dónde podría estar el error o de qué me estoy olvidando. Te agradecería cualquier ayuda extra, no sé de repente me estoy olvidando de algún módulo o no es solo copiarlo, o de repente hay algún error en el código.

Gracias.
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Notapor explorer » 2006-06-23 19:29 @853

Seguramente el módulo depende de otros.

Los métodos actuales de instalación de módulos no suelen llegar a la fase de "bajarme el módulo y copiarlo al disco", sino que con la ayuda de comandos como cpan o ppm, todo el proceso es automático, incluído la instalación de módulos adicionales.

Ejecuta perl -MMIME::Entity -e 1 para que veas qué módulos faltan.

Veo que estás en Windows. ¿Qué Perl tienes instalado? ¿ActivePerl?

En este foro encontrarás varios mensajes sobre cómo instalar módulos con
PPM.

Por ejemplo, este: viewtopic.php?t=673
Última edición por explorer el 2006-06-25 18:23 @807, 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Enviar Mail Con Archivo Adjunto

Notapor marfperu » 2006-06-23 19:36 @858

Sí, tengo el ActivePerl. Mira: la verdad soy muy nuevo en Perl. El primer código que cogí fue el de enviar correo y me trajo muchos problemas. Para mi buena suerte en ese entonces el módulo de sendmail sólo se tuvo que bajar y copiar para que funcione, y el código de envío que te mostré en el primer mensaje lo encontré en otro lado y lo pude entender. Ahora tengo un requerimiento que ahora sea el envío del correo pero con un adjunto. El problema de que este módulo de Entity si se tenga que instalar puede ser, pero no tengo idea de cómo instalarlo. Yo copié todos los módulos que vinieron en el archivo que me bajé pero aun así no funciona. Te agradecería me expliques cómo instalarlo en todo caso para seguir probando el envío, por lo que veo también el código que te envié. Está bien ya que no hay ninguna observación de tu parte, entonces el problema está en los módulos.

explorer: ya instalé el módulo con el ppm y probé el envío de correo y me vuelve a mostrar la misma pantalla de error. ¿Habrá algún error en el código? Algo anda mal. Ojalá puedas ayudarme.
Marfperu
marfperu
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2006-06-23 12:43 @571

Solución con Mail::Sender

Notapor explorer » 2006-06-25 07:09 @339

Tu programa no funcionaba porque estabas usando la función param(), que viene importada al usar el módulo CGI, así que debes usarlo si quieres que este programa sea un cgi.

He vuelto a leer el primer mensaje y me he dado cuenta de que lo estábamos haciendo mal. Tu no quieres enviar un correo con un adjunto hacia el cliente, si no que quieres RECIBIR un correo electrónico con un texto y un fichero adjunto que te envian DESDE un cliente.

El siguiente ejemplo lo he probado en mi servidor y funciona, usando el módulo Mail::Sender
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use CGI ':standard';
  3. use Mail::Sender;
  4. use warnings;
  5. use strict;
  6.  
  7. # Variables
  8. my $nombre  = "No hay nombre";
  9. my $mensaje = "No hay mensaje";
  10. my $fichero = "No hay fichero";
  11.  
  12. # Pintamos la página web
  13. print
  14.         header,
  15.         start_html('Envío de consultas'),
  16.             h1({align=>'center'},'Envío de consultas'),
  17.             hr({width=>'80%'}),
  18.             start_multipart_form,
  19.                 table(
  20.                     Tr({valign=>'top'},
  21.                         td("Nombre:"),
  22.                         td(textfield(   -name=>'nombre',
  23.                                         -size=>40,
  24.                                         -maxlength=>80)),
  25.                     ),
  26.                     Tr({valign=>'top'},
  27.                         td("Mensaje:"),
  28.                         td(textarea(    -name=>'mensaje',
  29.                                         -default=>'',
  30.                                         -rows=>10,
  31.                                         -columns=>50)),
  32.                     ),
  33.                     Tr({valign=>'top'},
  34.                         td("Currículum:"),
  35.                         td(filefield(   -name=>'fichero',
  36.                                         -default=>'Nombre del fichero a enviar',
  37.                                         -size=>50,
  38.                                         -maxlength=>80)),
  39.                     ),
  40.                 ),
  41.                 submit,
  42.             end_form,
  43.         ;
  44.  
  45. # Comprobamos si el usuario nos ha pasado algún parámetro
  46. if ( param() ) {
  47.  
  48.     $nombre  = param('nombre');
  49.     $fichero = param('fichero');
  50.     $mensaje = param('mensaje');
  51.  
  52.     # Los sacamos en pantalla, para comprobar
  53.     print
  54.             hr,
  55.             p("Datos enviados:"),
  56.             p,"Nombre: $nombre",br,"Mensaje: $mensaje",br,"Fichero: $fichero",
  57.     ;
  58.  
  59.     # Leemos el fichero enviado
  60.     my $fh = upload('fichero');
  61.     my $fichero_contenidos;
  62.     my $fichero_type = "";
  63.     if ( defined $fh ) {
  64.         binmode $fh;
  65.         while ( <$fh> ) {
  66.             $fichero_contenidos .= $_;
  67.         }
  68.         $fichero_type = uploadInfo($fichero)->{'Content-Type'};
  69.     }
  70.  
  71.     # Preparamos el correo electrónico
  72.     my $msg = Mail::Sender->new({
  73.         smtp    => 'correo.midominio.com',
  74.         from    => '[email protected]',
  75.         to      => '[email protected]',
  76.         subject => 'Consulta enviada desde el web',
  77.     });
  78.     $msg->OpenMultipart({});
  79.     $msg->Body({ msg => $mensaje });
  80.     $msg->print("\r\n"x2);  # sobra?
  81.     if ( defined $fh ) {
  82.         $msg->Part({
  83.             ctype => $fichero_type,
  84.             description => $fichero,
  85.             encoding => 'Base64',
  86.             disposition => qq(attachment; filename="$fichero"; type="$fichero_type"),
  87.             msg => $fichero_contenidos,
  88.         });
  89.     }
  90.     $msg->Close();
  91. }
  92.  
  93. print end_html;
  94.  
  95. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Pero tiene que haber formas mucho más cómodas...
Última edición por explorer el 2006-06-25 18:31 @813, editado 4 veces en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Solución con Email::Stuff

Notapor explorer » 2006-06-25 14:39 @652

Esta es otra forma, un poco más sencillo, pero a costa de instalar una docena de módulos, todos de los que depende Email::Stuff
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use CGI ':standard';
  3. use Email::Stuff;
  4. use warnings;
  5. use strict;
  6.  
  7. # Variables
  8. my $nombre  = "No hay nombre";
  9. my $mensaje = "No hay mensaje";
  10. my $fichero = "No hay fichero";
  11.  
  12. # Pintamos la página web
  13. print
  14.         header,
  15.         start_html('Envío de consultas'),
  16.             h1({align=>'center'},'Envío de consultas'),
  17.             hr({width=>'80%'}),
  18.             start_multipart_form,
  19.                 table(
  20.                     Tr({valign=>'top'},
  21.                         td("Nombre:"),
  22.                         td(textfield(   -name=>'nombre',
  23.                                         -size=>40,
  24.                                         -maxlength=>80)),
  25.                     ),
  26.                     Tr({valign=>'top'},
  27.                         td("Mensaje:"),
  28.                         td(textarea(    -name=>'mensaje',
  29.                                         -default=>'',
  30.                                         -rows=>10,
  31.                                         -columns=>50)),
  32.                     ),
  33.                     Tr({valign=>'top'},
  34.                         td("Currículum:"),
  35.                         td(filefield(   -name=>'fichero',
  36.                                         -default=>'Nombre del fichero a enviar',
  37.                                         -size=>50,
  38.                                         -maxlength=>80)),
  39.                     ),
  40.                 ),
  41.                 submit,
  42.             end_form,
  43.         ;
  44.  
  45. # Comprobamos si el usuario nos ha pasado algún parámetro
  46. if ( param() ) {
  47.  
  48.     $nombre  = param('nombre');
  49.     $fichero = param('fichero');
  50.     $mensaje = param('mensaje');
  51.  
  52.     # Los sacamos en pantalla, para comprobar
  53.     print
  54.             hr,
  55.             p("Datos enviados:"),
  56.             p,"Nombre: $nombre",br,"Mensaje: $mensaje",br,"Fichero: $fichero",
  57.     ;
  58.  
  59.     # Leemos el fichero enviado
  60.     my $contenido = '';
  61.     my $fh = upload('fichero');
  62.     my ($bytes,$buffer);
  63.     while ( $bytes = read($fh,$buffer, 8192) ) {
  64.         $contenido .= $buffer;
  65.     }
  66.  
  67.     # Enviamos el correo electrónico
  68.     Email::Stuff->from      ( '[email protected]'             )
  69.                 ->to        ( '[email protected]'             )
  70.                 ->subject   ( 'Fichero enviado desde web'    )
  71.                 ->text_body ( $mensaje                       )
  72.                 ->attach    ( $contenido, filename=>$fichero )
  73.                 ->using     ( SMTP => 'correo.midominio.com' )
  74.                 ->send;
  75. }
  76.  
  77. print end_html;
  78.  
  79. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2006-06-25 18:32 @814, editado 3 veces en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Solución con MIME::Entity

Notapor explorer » 2006-06-25 18:08 @797

Bueno, por fin encontré la forma de hacerlo con el módulo MIME::Entity.

El truco consistió en meter dos adjuntos. Primero el $mensaje de texto y luego el $fichero.

Para enviar el correo pongo tres opciones:
  • La primera es llamando al método send(). El mensaje llegará con el remitente puesto al usuario que corre el servidor web.
  • La segunda es usando una llamada directa a sendmail.
  • Y la tercera es usando el smtpsend que ya tiene el MIME::Entity. Notar que me he visto obligado a poner un campo MailFrom, porque parece ser MIME::Entity no lo coge del From en la función build... La opción Hello depende de la configuración del servidor de correo, si la necesita o no...
El texto que pongo después del mensaje, "\r\n", es para que escriba dos finales de línea. El estándar MIME exige al menos uno, pero yo lo he puesto así porque veía que las partes MIME aparecen dentro del mensaje sin ninguna línea de separación. A mi no me ha dado problemas el quitar ese texto, pero está ahí por si da problemas en algún cliente de correo de Windows, por ejemplo. Yo las pruebas las estoy haciendo con Evolution en Linux y le da igual si está puesto ese texto o no.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use CGI ':standard';
  3. use CGI::Carp qw(fatalsToBrowser);
  4. use MIME::Entity;
  5. use warnings;
  6. use diagnostics;
  7. use strict;
  8.  
  9. # Variables
  10. my $nombre  = undef;
  11. my $mensaje = undef;
  12. my $fichero = undef;
  13. my $contenido = undef;
  14. my $fh = undef;
  15.  
  16. # Pintamos la página web
  17. print
  18.         header,
  19.         start_html('Envío de consultas'),
  20.             h1({align=>'center'},'Envío de consultas'),
  21.             hr({width=>'80%'}),
  22.             start_multipart_form,
  23.                 table(
  24.                     Tr({valign=>'top'},
  25.                         td("Nombre:"),
  26.                         td(textfield(   -name=>'nombre',
  27.                                         -size=>40,
  28.                                         -maxlength=>80)),
  29.                     ),
  30.                     Tr({valign=>'top'},
  31.                         td("Mensaje:"),
  32.                         td(textarea(    -name=>'mensaje',
  33.                                         -default=>'',
  34.                                         -rows=>10,
  35.                                         -columns=>50)),
  36.                     ),
  37.                     Tr({valign=>'top'},
  38.                         td("Currículum:"),
  39.                         td(filefield(   -name=>'fichero',
  40.                                         -default=>'Nombre del fichero a enviar',
  41.                                         -size=>50,
  42.                                         -maxlength=>80)),
  43.                     ),
  44.                 ),
  45.                 submit,
  46.             end_form,
  47.         ;
  48.  
  49. # Comprobamos si el usuario nos ha pasado algún parámetro
  50. if ( param() ) {
  51.  
  52.     $nombre  = param('nombre');
  53.     $fichero = param('fichero');
  54.     $mensaje = param('mensaje');
  55.  
  56.     # Leemos el fichero enviado
  57.     if ( $fichero ) {
  58.         $fh = upload('fichero');
  59.         if ( $fh ) {
  60.             my ($bytes,$buffer);
  61.             while ( $bytes = read($fh, $buffer, 8192) ) {
  62.                 $contenido .= $buffer;
  63.             }
  64.         } else {
  65.             print "ERROR: NO PUEDO LEER EL FICHERO ENVIADO<br>";
  66.         }
  67.     }
  68.  
  69.     # Sacamos en pantalla información de lo recibido
  70.     print
  71.             hr,
  72.             p("Datos enviados:"),
  73.             p,"Nombre: $nombre",br,"Mensaje: $mensaje",br,"Fichero: $fichero, tamaño: ", length($contenido)
  74.     ;
  75.  
  76.     # Creamos el correo electrónico
  77.     my $msg = MIME::Entity->build(
  78.                     Type    => "multipart/mixed",
  79.                     From    => '[email protected]',
  80.                     To      => '[email protected]',
  81.                     Subject => "Únete a nosotros - $nombre",
  82.     );
  83.  
  84.     # Adjuntamos el mensaje si lo hay
  85.     if ( $mensaje ) {
  86.         $msg->attach(
  87.                     Data    => [ $mensaje, "\r\n" ],
  88.         );
  89.     }
  90.  
  91.     # Adjuntamos el fichero si lo hay
  92.     if ( defined($fh) ) {
  93.         $msg->attach(
  94.                     Type => uploadInfo($fichero)->{'Content-Type'} || 'application/octet-stream',
  95.                     Data    => [ $contenido ],
  96.                     Encoding=> 'base64',
  97.         );
  98.     }
  99.     # Tercera forma de envío, con el smtpsend de Mail::Internet
  100.     $msg->smtpsend(
  101.                    Host    => 'mail.makkros.biz',
  102.                    Hello   => 'mail.makkros.biz',
  103.                    MailFrom=> '[email protected]',
  104.    );
  105.  
  106. }
  107.  
  108. print end_html;
  109.  
  110. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2006-06-28 13:30 @604, editado 3 veces en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Web

¿Quién está conectado?

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