Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: DeMoNcRaZy en 27 Junio 2015, 22:07 pm



Título: [Perl] Error al enviar Mail
Publicado por: DeMoNcRaZy en 27 Junio 2015, 22:07 pm
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:

Código
  1. use Mail::Sendmail;
  2.  
  3.   %mail=(To => 'su_direccion@alli.com',
  4.                From => 'mi_direccion@aqui.com',
  5.                Message => "Mensaje de prueba"
  6.         );
  7.  
  8.   if(sendmail %mail){
  9.      print "Mail enviado correctamente.\n";
  10.   }
  11.   else{
  12.      print "Error al enviar mail: $Mail::Sendmail::error\n";
  13.   }

Y me da este error:

Código:
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?
Código:
 (you may need to install the Mail::Sendmail module) 

A ser así, ¿cómo podría instalarlo? (Linux Mint)
Gracias.

Saludos!


Título: Re: [Perl] Error al enviar Mail
Publicado por: explorer en 27 Junio 2015, 23:15 pm
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


Título: Re: [Perl] Error al enviar Mail
Publicado por: DeMoNcRaZy en 27 Junio 2015, 23:27 pm
Gracias por la respuesta,

Acabo de instalar dicho paquete, pero ahora me dice lo siguiente:

Código:
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!


Título: Re: [Perl] Error al enviar Mail
Publicado por: Eleкtro en 27 Junio 2015, 23:39 pm
Supuestamente habrá que modificar el stmp no?

Lee el F.A.Q y/o la referencia y descripción del módulo antes de descargar y probar nada.

Cita de: http://search.cpan.org/~mivkovic/Mail-Sendmail-0.79/Sendmail.pm
LIMITATIONS

No suport for the SMTP AUTH extension.

The SMTP server has to be set manually in Sendmail.pm or in your script, unless you have a mail server on localhost.

http://search.cpan.org/~mivkovic/Mail-Sendmail-0.79/Sendmail.pm



¿Y el stmp de gmail?

puerto SMTP = 587
SSL activado

también puedes usar este módulo que ya parece hacer esa tarea de forma automatizada:
http://search.cpan.org/~peco/Email-Send-SMTP-Gmail-0.1.1/lib/Email/Send/SMTP/Gmail.pm

Saludos!


Título: Re: [Perl] Error al enviar Mail
Publicado por: DeMoNcRaZy en 28 Junio 2015, 00:08 am
Estoy probando como bien dice hay:

Código
  1. use Mail::Sendmail;
  2.  
  3.  print "Testing Mail::Sendmail version $Mail::Sendmail::VERSION\n";
  4.  print "Default server: $Mail::Sendmail::mailcfg{smtp}->[0]\n";
  5.  print "Default sender: $Mail::Sendmail::mailcfg{from}\n";
  6.  
  7.  %mail = (
  8.      To      => 'correo@gmail.com',
  9.      From    => 'correo@gmail.com',
  10.      Bcc     => 'Someone <correo@gmail.com>, Someone else her@there.com',
  11.      # only addresses are extracted from Bcc, real names disregarded
  12.      Cc      => 'Yet someone else <correo@gmail.com>',
  13.      # Cc will appear in the header. (Bcc will not)
  14.      Subject => 'Test message',
  15.      'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION",
  16.  );
  17.  
  18.  
  19.  $mail{Smtp} = 'smtp.gmail.com';
  20.  $mail{'X-custom'} = 'My custom additionnal header';
  21.  $mail{'mESSaGE : '} = "The message key looks terrible, but works.";
  22.  # cheat on the date:
  23.  $mail{Date} = Mail::Sendmail::time_to_date( time() - 86400 );
  24.  
  25.  if (sendmail %mail) { print "Mail sent OK.\n" }
  26.  else { print "Error sending mail: $Mail::Sendmail::error \n" }
  27.  
  28.  print "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;

Y el resultado:

Código:
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í:

Código
  1. use Mail::Sendmail;
  2.  
  3.      $mail{smtp} = [qw(smtp.gmail.com)];
  4.      $mail{from} = 'correo@gmail.com';
  5.      $mail{port} = 587;
  6.  
  7.      %mail=(To => 'correo@gmail.com',
  8.                   From => 'correo@hotmail.com',
  9.                   Message => "Mensaje de prueba"
  10.            );
  11.  
  12.      if(sendmail %mail){
  13.         print "Mail enviado correctamente.\n";
  14.      }
  15.      else{
  16.         print "Error al enviar mail: $Mail::Sendmail::error\n";
  17.      }

Y me da este resultado:

Código:
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!


Título: Re: [Perl] Error al enviar Mail
Publicado por: explorer en 28 Junio 2015, 01:17 am
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/null

Y 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 (https://metacpan.org/pod/Email::Send::SMTP::Gmail).


Título: Re: [Perl] Error al enviar Mail
Publicado por: DeMoNcRaZy en 28 Junio 2015, 12:10 pm
Buenas,

Gracias por la respuesta.

Este es el archivo:

Código:
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á:

Código
  1. use Mail::Sendmail;
  2.  
  3.      $mail{smtp} = [qw(smtp.gmail.com)];
  4.      $mail{port} = 587;
  5.  
  6.      %mail=(To => 'correo',
  7.                   From => 'correo',
  8.                   Message => "Mensaje de prueba"
  9.            );
  10.  
  11.      if(sendmail %mail){
  12.         print "Mail enviado correctamente.\n";
  13.      }
  14.      else{
  15.         print "Error al enviar mail: $Mail::Sendmail::error\n";
  16.      }

¿Tendría que hacer uso de postfix o ya usando la funcion $mail de Mail::Sendmail es suficiente?

Gracias.


Saludos!


Título: Re: [Perl] Error al enviar Mail
Publicado por: explorer en 28 Junio 2015, 20:11 pm
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:
Código:
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í:
Código:
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:
Código
  1. #!/usr/bin/perl
  2. use Mail::Sendmail;
  3.  
  4. my %mail = (
  5.    From    => 'explorer@jferrero.noip.geek',
  6.    To      => 'explor@joaquinferrero.com',
  7.    Message => "Este es un mensaje muy cortito",
  8. );
  9.  
  10. 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:
Código
  1. #!/usr/bin/perl
  2. use Mail::Sendmail;
  3.  
  4. my %mail = (
  5.    smtp    => 'correo.joaquinferrero.com',
  6.  
  7.    From    => 'explorer@jferrero.noip.geek',
  8.    To      => 'explor@joaquinferrero.com',
  9.    Message => "Un mensaje muy cortito",
  10. );
  11.  
  12. 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 points

Es 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 (https://metacpan.org/pod/Mail::Sender) se actualizó hace un año, y tiene más opciones de envío.



Título: Re: [Perl] Error al enviar Mail
Publicado por: DeMoNcRaZy en 29 Junio 2015, 01:31 am
Buenas,

Acabo de configurar dicho archivo:

Código:
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:

Código
  1.    #!/usr/bin/perl
  2.    use Mail::Sendmail;
  3.  
  4.    my %mail = (
  5.       From    => 'sanchezgarciatomas@gmail.com',
  6.       To      => 'sanchezgarciatomas@gmail.com',
  7.       Message => "Este es un mensaje muy cortito",
  8.    );
  9.  
  10.    if(sendmail %mail){
  11.       print "Mail enviado";
  12.    }
  13.    else{
  14.       sendmail(%mail) or die $Mail::Sendmail::error;
  15.    }

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!


Título: Re: [Perl] Error al enviar Mail
Publicado por: explorer en 1 Julio 2015, 11:45 am
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.