Autor
|
Tema: [Perl] Error al enviar Mail (Leído 7,548 veces)
|
DeMoNcRaZy
Desconectado
Mensajes: 420
$~*|_
|
Buenas,Estoy intentando mandar un mail a través de Perl pero me salta un error como si me faltase dicho módulo instalado. Tengo esto: use Mail::Sendmail; %mail=(To => 'su_direccion@alli.com', From => 'mi_direccion@aqui.com', Message => "Mensaje de prueba" ); if(sendmail %mail){ print "Mail enviado correctamente.\n"; } else{ print "Error al enviar mail: $Mail::Sendmail::error\n"; }
Y me da este error: Can't locate Mail/Sendmail.pm in @INC (you may need to install the Mail::Sendmail module) (@INC contains: /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at probe.pl line 1. BEGIN failed--compilation aborted at probe.pl line 1. He intentado probar de otras formas pero me da error parecido. ¿Esto es que necesito instalar un módulo no? (you may need to install the Mail::Sendmail module) A ser así, ¿cómo podría instalarlo? (Linux Mint) Gracias. Saludos!
|
|
|
En línea
|
Esta página web no está disponible - Google Chrome
|
|
|
explorer
Desconectado
Mensajes: 102
Analista/Programador Perl
|
Puedes arrancar el Synaptic y buscar por el paquete libmail-sendmail-perl
O desde la línea de comandos, siendo root, ejecutar
apt-get install libmail-sendmail-perl
|
|
|
En línea
|
|
|
|
DeMoNcRaZy
Desconectado
Mensajes: 420
$~*|_
|
Gracias por la respuesta, Acabo de instalar dicho paquete, pero ahora me dice lo siguiente: Error al enviar mail: connect to localhost failed (Conexión rehusada) connect to localhost failed connect to localhost failed (Conexión rehusada) no (more) retries! Supuestamente habrá que modificar el stmp no? ¿Dónde se encuentra dicho archivo? ¿Y el stmp de gmail? Gracias. Saludos!
|
|
|
En línea
|
Esta página web no está disponible - Google Chrome
|
|
|
|
DeMoNcRaZy
Desconectado
Mensajes: 420
$~*|_
|
Estoy probando como bien dice hay: use Mail::Sendmail; print "Testing Mail::Sendmail version $Mail::Sendmail::VERSION\n"; print "Default server: $Mail::Sendmail::mailcfg{smtp}->[0]\n"; print "Default sender: $Mail::Sendmail::mailcfg{from}\n"; %mail = ( To => 'correo@gmail.com', From => 'correo@gmail.com', Bcc => 'Someone <correo@gmail.com>, Someone else her@there.com', # only addresses are extracted from Bcc, real names disregarded Cc => 'Yet someone else <correo@gmail.com>', # Cc will appear in the header. (Bcc will not) Subject => 'Test message', 'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION", ); $mail{Smtp} = 'smtp.gmail.com'; $mail{'X-custom'} = 'My custom additionnal header'; $mail{'mESSaGE : '} = "The message key looks terrible, but works."; # cheat on the date: $mail{Date } = Mail ::Sendmail::time_to_date( time() - 86400 ); if (sendmail %mail) { print "Mail sent OK.\n" } else { print "Error sending mail: $Mail::Sendmail::error \n" } print "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;
Y el resultado: Testing Mail::Sendmail version 0.79_16 Default server: localhost Default sender: Error sending mail: MAIL FROM: error (530 5.7.0 Must issue a STARTTLS command first. g15sm4632205wiv.22 - gsmtp ) Server said: 530 5.7.0 Must issue a STARTTLS command first. g15sm4632205wiv.22 - gsmtp
$Mail::Sendmail::log says: Mail::Sendmail v. 0.79_16 - Sat Jun 27 23:52:46 2015 Date: Fri, 26 Jun 2015 23:52:46 +0200 Server: smtp.gmail.com Port: 25 From: correo@gmail.com Subject: Test message Y el archivo Sendmail.pm no me deja escribir en él. También probé así: use Mail::Sendmail; $mail{smtp } = [qw(smtp .gmail .com )]; $mail{from} = 'correo@gmail.com'; $mail{port} = 587; %mail=(To => 'correo@gmail.com', From => 'correo@hotmail.com', Message => "Mensaje de prueba" ); if(sendmail %mail){ print "Mail enviado correctamente.\n"; } else{ print "Error al enviar mail: $Mail::Sendmail::error\n"; }
Y me da este resultado: Error al enviar mail: connect to localhost failed (Conexión rehusada) connect to localhost failed connect to localhost failed (Conexión rehusada) no (more) retries!
|
|
|
En línea
|
Esta página web no está disponible - Google Chrome
|
|
|
explorer
Desconectado
Mensajes: 102
Analista/Programador Perl
|
Para modificar el archivo Sendmail.pm (algo muy raro) debes cambiar los permisos de escritura o ser administrador del sistema (root), ya que seguro que el archivo se ha instalado con permisos de escritura restringida al stuff. Si no te deja conectarte al servidor localhost (tu ordenador) es, quizás, porque no tienes instalado ningún servidor SMTP. Y aunque lo instales, debes recordar que debes configurarlo para enseñarle qué transporte debe realizar del correo local. Yo también uso Linux Mint. Tengo instalado el postfix como gestor de transporte de correo (MTA) (se instala por defecto). Para configurarlo, te vale con editar el archivo /etc/postfix/main.cf o ejecutas el asistente dpkg-reconfigure postfix. Como los correos enviados desde una línea residencial suelen ser filtrados por los principales servidores de correo, lo ideal es configurar el MTA para que envíe el correo a nuestro servidor de correo normal. En el postfix indicamos que queremos usar un smarthost externo, indicamos nuestro servidor de correo, nombre de usuario y contraseña, y listo. Para comprobar que todo va bien, ejecutas el comando mail -s "Prueba" yusetist@tucorreo.com < /dev/nullY ver si llega. A partir de ahí ya podemos usar nuestros programas usando localhost como MTA. De todas formas, para enviar correo a Gmail no debería haber ningún problema. El problema puede estar en usar Gmail para el envío correo. Como ves, Gmail te pide usar el comando STARTTLS, para iniciar un autenticación codificada. Lo mejor, entonces, es usar un módulo específico, como Email::Send::SMTP::Gmail.
|
|
|
En línea
|
|
|
|
DeMoNcRaZy
Desconectado
Mensajes: 420
$~*|_
|
Buenas, Gracias por la respuesta. Este es el archivo: smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = yusetist alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = yusetist, localhost.localdomain, , localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = all ¿De hay qué tendría que modificar exactamente? Acá: use Mail::Sendmail; $mail{smtp } = [qw(smtp .gmail .com )]; $mail{port} = 587; %mail=(To => 'correo', From => 'correo', Message => "Mensaje de prueba" ); if(sendmail %mail){ print "Mail enviado correctamente.\n"; } else{ print "Error al enviar mail: $Mail::Sendmail::error\n"; }
¿Tendría que hacer uso de postfix o ya usando la funcion $mail de Mail::Sendmail es suficiente? Gracias. Saludos!
|
|
|
En línea
|
Esta página web no está disponible - Google Chrome
|
|
|
explorer
Desconectado
Mensajes: 102
Analista/Programador Perl
|
No soy bueno configurando el Postfix. Lo mio es el Exim4 Te aconsejo que arranques el asistente. De mi archivo, veo que las líneas interesantes son estas: smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = jferrero.noip.geek mydestination = Arcanus, localhost.localdomain, localhost, jferrero.noip.geek relayhost = correo.joaquinferrero.com mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 default_transport = smtp relay_transport = smtp smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd smtp_sasl_security_options = De ahí sacamos que mi "smarthost" es el indicado por la entrada "relayhost". Ahí es donde se conectará para enviar el correo que se genere en mi máquina, que está indicada en la entrada "myhostname". Como mi servidor de correo necesita autenticación, están puestas además las opciones "smtp_sasl_*" para indicar en qué archivo se guardan las credenciales. En /etc/postfix/sasl/sasl_passwd hay una línea así: correo.joaquinferrero.com explor@joaquinferrero.com:Nan&&telovewebon donde se indican las credenciales (usuario:contraseña) para cada servidor externo. Con esto, ya puedo escribir un programa así de sencillo: #!/usr/bin/perl use Mail::Sendmail; my %mail = ( From => 'explorer@jferrero.noip.geek', To => 'explor@joaquinferrero.com', Message => "Este es un mensaje muy cortito", ); sendmail (%mail) or die $Mail::Sendmail::error;
Y Mail::Sendmail usará el MTA local para enviarme el correo a mi buzón externo. Si, en cambio, no quiero usar el servidor local, puedo usar algún otro servidor externo, de forma directa: #!/usr/bin/perl use Mail::Sendmail; my %mail = ( smtp => 'correo.joaquinferrero.com', From => 'explorer@jferrero.noip.geek', To => 'explor@joaquinferrero.com', Message => "Un mensaje muy cortito", ); sendmail (%mail) or die $Mail::Sendmail::error;
Pero... no nos estamos identificando en el servidor destino (y tampoco lo permite hacer este módulo), así que para él somos un correo que llega de procedencia desconocida, y estaremos sujetos a sus reglas. En mi caso, me ha rechazado la recepción del correo y me ha metido en una lista gris, por ser sospechoso de ser correo basura. No puedo volver a intentarlo hasta pasados unos minutos. 2015-06-28 19:59:32 1Z9Grc-0007Vb-7Y H=(Arcanus) [37.101.173.131] F=<explorer@jferrero.noip.geek> temporarily rejected after DATA: message from explorer@jferrero.noip.geek over [37.101.173.131] will be GreyListed as it scores 7.2 spam pointsEs mejor usar otros módulos más modernos para el envío de correo, ya que permiten la autenticación, y así podemos enviar correo usando nuestro servidor de correo personal. Mail::Sendmail está sin actualizar desde el 2003, mientras que Mail::Sender se actualizó hace un año, y tiene más opciones de envío.
|
|
|
En línea
|
|
|
|
DeMoNcRaZy
Desconectado
Mensajes: 420
$~*|_
|
Buenas,Acabo de configurar dicho archivo: mtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = smtp.gmail.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = yusetist, localhost.localdomain, , localhost, smtp.gmail.com relayhost = mycorreo@gmail.com mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = all Y tengo esto: #!/usr/bin/perl use Mail::Sendmail; my %mail = ( From => 'sanchezgarciatomas@gmail.com', To => 'sanchezgarciatomas@gmail.com', Message => "Este es un mensaje muy cortito", ); if(sendmail %mail){ } else{ sendmail (%mail) or die $Mail::Sendmail::error; }
Lo ejecuto y todo correcto me manda el if (Mail enviado), pero reviso mi correo y no me llegó nada. Tal vez puede ser por mala configuración del archivo o por que está des-actualizado con bien mencionas. ------------------------------------------------------------------------------------------------------------------- Para usar Mail::Sender me descargo Exim4 en el gestor de paquetes? Y luego que archivo tendría que configurar con lo que me has descrito en el anterior mensaje. Probaré a usarlo ya que está actualizado como según has mencionado y será mejor y evitaremos más problemas ocasionales. Gracias por las respuestas. Saludos!
|
|
|
En línea
|
Esta página web no está disponible - Google Chrome
|
|
|
explorer
Desconectado
Mensajes: 102
Analista/Programador Perl
|
Sí, has configurado el archivo, pero no el de las credenciales (usuario y contraseña) para poder usar el servidor smtp.gmail.com.
Si no quieres complicarte la vida, agrega la opción
smtp => 'smtp.gmail.com',
(o el nombre de otro servidor de correo) y así Mail::Sendmail usará ese en lugar de tu MTA local. Mira mi último ejemplo.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Enviar mail vba
Programación Visual Basic
|
Ch3ck
|
4
|
4,815
|
3 Junio 2005, 00:56 am
por Ch3ck
|
|
|
Enviar mail por BAT!!!!
Scripting
|
elecktra
|
2
|
3,173
|
8 Agosto 2008, 07:11 am
por leogtz
|
|
|
mail(), error raro al intentar enviar mail !
PHP
|
Diabliyo
|
4
|
4,890
|
25 Enero 2010, 06:04 am
por Diabliyo
|
|
|
Enviar mail sin formato mime (plain text)
.NET (C#, VB.NET, ASP)
|
dep_serg
|
1
|
2,539
|
6 Febrero 2015, 07:10 am
por __Alvaro 2015__
|
|