2006-06-23 12:49 @576 |
|
|
marfperu
Perlero Nuevo
|
Registrado: 2006-06-23 12:43 @571 Mensajes: 12
|
|
|
Enviar Mail con archivo adjunto
|
Hola a Todos. Soy algo nuevo en Perl y la ves pasada pude programar un envío de e-mail 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 mails 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 e-mail. Código: #!C:\perl\bin\perl.exe -w
use strict; use Mail::Sendmail; use CGI qw(:standard);
my $nombre = param('textnombre'); my $file = param('file'); my $mensaje =param('todo');
# Creamos el hash con nuestro mensajes my %mail = ( To => 'mario.flores@makros.biz', From => 'Web', Subject => 'Consultas', Message => $mensaje, file => $file, Smtp => 'smtpserver' );
# Envíar el mensaje unless (sendmail(%mail)) { print "Location: http://localhost/noenvio.htm \n\n"; # Error! exit(1); }
# Envío correcto. print "Location: http://localhost/envio.htm \n\n";
exit(1);
_________________ Marfperu
|
2006-06-23 14:44 @655 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10250
|
|
|
|
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 PerlSi esto no te lo soluciona, aquí te daremos más pistas.
|
2006-06-23 15:52 @703 |
|
|
marfperu
Perlero Nuevo
|
Registrado: 2006-06-23 12:43 @571 Mensajes: 12
|
|
|
Enviar Mail Con Archivo Adjunto
|
|
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
|
2006-06-23 17:53 @786 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10250
|
|
|
|
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
|
2006-06-23 19:17 @845 |
|
|
marfperu
Perlero Nuevo
|
Registrado: 2006-06-23 12:43 @571 Mensajes: 12
|
|
|
Enviar Mail Con Archivo Adjunto
|
a ver: Primero baje el archivo del modulo MIME:Entity es un archivo entiti.pm que lo ubique en la carpeta site/MIME de la caprte principal del perl Segundo Luego Cree el archivo enviar.cgi que tiene este contenido Código: #!C:\perl\bin\perl.exe -w
use MIME::Entity;
my $file = param('file'); my $mensaje =param('todo');
my $msg = MIME::Entity->build( From => 'Web', To => 'mario.flores@makros.biz', Subject => "Únete a Nosotros-Curriculum", Type => 'text/plain', Encoding => 'base64', Data => $mensaje, );
$msg->attach( Path => $file, Type => 'application/msword', Encoding => 'base64', );
$msg->smtpsend( Host => 'mailserver', Hello => 'localhost', );
Y luego de hacer la prueba me nada una pagina 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 se donde podria estar el error o de que me estoy olvidando te agradeceria cualquier ayuda extra, no se derrepente me estoy olvidandando de algun modulo o no es solo copiarlo, o derrepente hay algun error en el codigo. gracias.
_________________ Marfperu
|
2006-06-23 19:29 @853 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10250
|
|
|
|
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: http://perlenespanol.baboonsoftware.com ... .php?t=673
Última edición por explorer el 2006-06-25 18:23 @807, editado 1 vez en total
|
2006-06-23 19:36 @858 |
|
|
marfperu
Perlero Nuevo
|
Registrado: 2006-06-23 12:43 @571 Mensajes: 12
|
|
|
Enviar Mail Con Archivo Adjunto
|
|
Si, tengo el ActivePerl, mira la verdad soy muy nuevo en perl, el primer codigo que cogi fue el de enviar correo y me trajo muchos problemas para mi buena suerte en ese entonces el modulo de sendmail solo se tuvo que bajar y copiar para que funcione, y el codigo de envio que te mostre en el primer mensaje lo encontre en otro lado y lo pude entender, ahora tengo un requerimiento que ahora sea el envio del mail pero con un adjunto, el problema de que este modulo de Entity si se tenga que instalr puede ser, pero no tengo idea de como instalarlo yo copie todos los modulos que vinieron en el archivo que me baje pero aun asi no funciona te agradeceria me expliques como instalarlo en todo caso para seguir probando el envio, por lo que veo tambien el codigo que te envie esta bien ya que no hay ninguna observacion de tu parte, entonces el problema esta en los modulos.
Explorer ya instalé el módulo con el ppm y probe 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
|
2006-06-25 07:09 @339 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10250
|
|
|
Solución con Mail::Sender
|
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::SenderCódigo: #!/usr/bin/perl use CGI ':standard'; use Mail::Sender; 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 $fh = upload('fichero'); my $fichero_contenidos; my $fichero_type = ""; if ( defined $fh ) { binmode $fh; while ( <$fh> ) { $fichero_contenidos .= $_; } $fichero_type = uploadInfo($fichero)->{'Content-Type'}; }
# Preparamos el correo electrónico my $msg = Mail::Sender->new({ smtp => 'correo.midominio.com', from => 'yo@midominio.com', to => 'el@sudominio.com', subject => 'Consulta enviada desde el web', }); $msg->OpenMultipart({}); $msg->Body({ msg => $mensaje }); $msg->print("\r\n"x2); # sobra? if ( defined $fh ) { $msg->Part({ ctype => $fichero_type, description => $fichero, encoding => 'Base64', disposition => qq(attachment; filename="$fichero"; type="$fichero_type"), msg => $fichero_contenidos, }); } $msg->Close(); }
print end_html;
__END__ 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
|
2006-06-25 14:39 @652 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10250
|
|
|
Solución con Email::Stuff
|
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::StuffCódigo: #!/usr/bin/perl use CGI ':standard'; use Email::Stuff; 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'); my ($bytes,$buffer); while ( $bytes = read($fh,$buffer, 8192) ) { $contenido .= $buffer; }
# Enviamos el correo electrónico Email::Stuff->from ( 'yo@midominio.com' ) ->to ( 'el@tudominio.com' ) ->subject ( 'Fichero enviado desde web' ) ->text_body ( $mensaje ) ->attach ( $contenido, filename=>$fichero ) ->using ( SMTP => 'correo.midominio.com' ) ->send; }
print end_html;
__END__
Última edición por explorer el 2006-06-25 18:32 @814, editado 3 veces en total
|
2006-06-25 18:08 @797 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10250
|
|
|
Solución con MIME::Entity
|
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. Código: #!/usr/bin/perl use CGI ':standard'; use CGI::Carp qw(fatalsToBrowser); use MIME::Entity; use warnings; use diagnostics; use strict;
# Variables my $nombre = undef; my $mensaje = undef; my $fichero = undef; my $contenido = undef; my $fh = undef;
# 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');
# Leemos el fichero enviado if ( $fichero ) { $fh = upload('fichero'); if ( $fh ) { my ($bytes,$buffer); while ( $bytes = read($fh, $buffer, 8192) ) { $contenido .= $buffer; } } else { print "ERROR: NO PUEDO LEER EL FICHERO ENVIADO<br>"; } }
# Sacamos en pantalla información de lo recibido print hr, p("Datos enviados:"), p,"Nombre: $nombre",br,"Mensaje: $mensaje",br,"Fichero: $fichero, tamaño: ", length($contenido) ;
# 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" ], ); }
# Adjuntamos el fichero si lo hay if ( defined($fh) ) { $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__
Última edición por explorer el 2006-06-28 13:30 @604, editado 3 veces en total
|
2006-06-26 10:07 @463 |
|
|
marfperu
Perlero Nuevo
|
Registrado: 2006-06-23 12:43 @571 Mensajes: 12
|
|
|
|
No funciona  , instale el modulo MIME-tools que contiene el entity, con el archivo ppd, asi que supongo esta bien instalado, de ahi use el ultimo código que me enviaste reemplazando los valores especificos, pero aun asi sigue apareciendo la misma pantalla y no envia el correo. Asi es tal cual lo probe, el archivo donde lo guardo se llama enviado.cgi y esta puesto en la carpeta cgi-bin del apache, ya no se que mas hacer.
_________________ Marfperu
|
2006-06-26 10:53 @495 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10250
|
|
|
|
Bueno, entonces hay que mirar otras cosas que no sean Perl. * Instala (si no está) el módulo CGI::Carp, colócalo después del use CGI. De esa manera verás los errores en la ventana del navegador. Colócala así: Código: use CGI::Carp qw(fatalsToBrowser); * ¿El servidor tiene servicio de correo? ¿El servidor de correo admite una dirección como 'Web' como remitente? * ¿Has revisado los logs de actividad del servidor web? ¿Qué ponen? * Desde la línea de comandos ejecuta perl -c script.pl cambiando script.pl por tu programa. Perl te dirá si no hay errores de sintaxis. * Si lo anterior no funciona, iremos de atrás adelante... ¿si quitas toda la parte del programa del if ( param() ) { ... }, el script funciona y sale una tabla en pantalla?
|
2006-06-26 12:06 @546 |
|
|
marfperu
Perlero Nuevo
|
Registrado: 2006-06-23 12:43 @571 Mensajes: 12
|
|
|
|
A Ver, hice lo que me indicaste, ya tenia instalado el modulo cgi::carp, y me muestra errores, lo malo es que siempre sale que falta tal módulo, y mientras los voy poniendo siempre sale que falta otro, primero fue el Mail::internet, lo puse y de ahí salió que faltaba el Mail:Field, de ahí el Mail:Header, de ahí el IO:wrap todos esos los puse, de ahí salió que faltaba el MINE::base64 ese si estaba pero estaba en otra carpeta, lo moví de ubicación y de ahí salió que faltaba el XSloader.pm, lo bajé y lo ubiqué en la carpeta Perl/Lib y salió este último error que la verdad no se que hacer ya. Software error: Código: [Mon Jun 26 12:02:34 2006] Entity.pm: [Mon Jun 26 12:02:34 2006] Entity.pm: [Mon Jun 26 12:02:34 2006] Head.pm: [Mon Jun 26 12:02:34 2006] Head.pm: [Mon Jun 26 12:02:34 2006] Words.pm: [Mon Jun 26 12:02:34 2006] Words.pm: [Mon Jun 26 12:02:34 2006] Base64.pm: [Mon Jun 26 12:02:34 2006] XSLoader.pm: Can't locate loadable object for module MIME::Base64 in @INC (@INC contains: C:\Perl\lib C:\Perl\site\lib .) at C:\Perl\site\lib/MIME/Words.pm line 77 [Mon Jun 26 12:02:34 2006] Entity.pm: [Mon Jun 26 12:02:34 2006] Entity.pm: [Mon Jun 26 12:02:34 2006] Head.pm: [Mon Jun 26 12:02:34 2006] Head.pm: [Mon Jun 26 12:02:34 2006] Words.pm: [Mon Jun 26 12:02:34 2006] Words.pm: BEGIN failed--compilation aborted at C:\Perl\site\lib/MIME/Words.pm line 77. [Mon Jun 26 12:02:34 2006] Entity.pm: [Mon Jun 26 12:02:34 2006] Entity.pm: [Mon Jun 26 12:02:34 2006] Head.pm: [Mon Jun 26 12:02:34 2006] Head.pm: BEGIN failed--compilation aborted at C:\Perl\site\lib/MIME/Head.pm line 118. [Mon Jun 26 12:02:34 2006] Entity.pm: [Mon Jun 26 12:02:34 2006] Entity.pm: BEGIN failed--compilation aborted at C:\Perl\site\lib/MIME/Entity.pm line 224. BEGIN failed--compilation aborted at c:\ARCHIV~1\APACHE~1\apache\cgi-bin\enviado.cgi line 5. Ya no tengo idea que más ver, le quite la sección a partir de if() que me dijiste y me sale el mismo error.
_________________ Marfperu
|
2006-06-26 14:00 @625 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10250
|
|
|
|
|
Si has tenido que bajar e instalar el módulo XSLoader.pm eso significa que tu instalación de Perl ha sufrido un golpe en la naríz o que es muy, muy, viejo.
Mi recomendación es: borra (desinstala) toda la instalación de Perl del ordenador (guardando tus scripts y programas, claro). Bájata la última versión del ActivePerl y la instalas. Y cuando necesites instalar un nuevo módulo, usa de forma ->EXCLUSIVA<- el programa PPM.
El mensaje de error del XSLoader está diciendo que no es que no encuentre el módulo MIME::Base64, sino que lo que no encuentra es el MIME/Base64/Base64.so o MIME/Base64/Base64.dll, es decir, la librería compilada de la que depende el módulo MIME::Base64. En mi ordenador esa librería está en /usr/lib/perl/5.8.8/auto/MIME/Base64.
Por eso existen programas como el PPM, para evitar estos problemas de que si te bajas un módulo y lo colocas 'a mano'. Puede darse el caso, como se vé aquí, de que se nos olvide 'colocar' otro fichero.
|
2006-06-26 14:29 @645 |
|
|
marfperu
Perlero Nuevo
|
Registrado: 2006-06-23 12:43 @571 Mensajes: 12
|
|
|
|
|
Ok supuse eso de que era muy antiguo, lamentablemente el servidor en el cual voy a trabajar tiene esta version, y no puedo instalar uno mas actualizado, como podria hacer, o que modulo puedo usar para poder realizar estos envios de mail con adjunto, como te comente el envio de correo con sendmail si funciono a la perfeccion, otra cosa, tienes alguna direccion donde pueda bajar los modulos pero para windows, porque la pagina de CPAN baja todos para linux y yo trabajo en plataforma windows, el problema es que para instalar en ppm siempre busca un archivo ppd y en los paquetes que bajo de CPAN nunca estan esos archivos, solo logre ubicar el del MIME-tools en otra pagina pero no estan los demas. Ahora lo que voy a hacer es desinstalar el perl y volverlo a instalar con mucho cuidado en mi servidro de prueba y volver a ejecutar todas las recomendaciones que me has dado para ver si logro hacer ese envio.
_________________ Marfperu
|
| 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
|
|
Socializa |
 |
|