(mensaje largo. No intentar nada hasta terminar de leerlo)
El mensaje de error dice que $smtps no contiene un valor de objeto, así que es posible que haya fallado la llamada en la línea 14. Quizás sea porque no es 'DEBUG', sino 'Debug':
Using text Syntax Highlighting
explorer@casa:~> perl -MNet::SMTP::SSL -E 'my $smtps = Net::SMTP::SSL->new("smtp.gmail.com", Port => 465, Debug => 1, SSL_verify_mode => SSL_VERIFY_NONE) or warn "$!\n"; say $smtps;'
Net::SMTP::SSL>>> Net::SMTP::SSL(1.01)
Net::SMTP::SSL>>> IO::Socket::SSL(1.81)
Net::SMTP::SSL>>> IO::Socket::INET6(2.69)
Net::SMTP::SSL>>> IO::Socket(1.34)
Net::SMTP::SSL>>> IO::Handle(1.33)
Net::SMTP::SSL>>> Exporter(5.66)
Net::SMTP::SSL>>> Net::Cmd(2.29)
Net::SMTP::SSL=GLOB(0x2212968)<<< 220 mx.google.com ESMTP cu7sm2919957wib.8 - gsmtp
Net::SMTP::SSL=GLOB(0x2212968)>>> EHLO localhost.localdomain
Net::SMTP::SSL=GLOB(0x2212968)<<< 250-mx.google.com at your service, [96.20.64.223]
Net::SMTP::SSL=GLOB(0x2212968)<<< 250-SIZE 35882577
Net::SMTP::SSL=GLOB(0x2212968)<<< 250-8BITMIME
Net::SMTP::SSL=GLOB(0x2212968)<<< 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
Net::SMTP::SSL=GLOB(0x2212968)<<< 250 ENHANCEDSTATUSCODES
Net::SMTP::SSL=GLOB(0x2212968)
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Prueba a hacerlo en tu equipo. Si no sale nada, entonces quizás el problema esté en la misma conexión a Internet.
Como ha dicho Salva antes, no hay nada de especial para enviar un correo
a Gmail. Pero sí es especial
usar Gmail para enviar un correo (a un buzón de Gmail o cualquier otro buzón). En este caso, tenemos que conectarnos vía SSL o TLS, e identificarnos con nuestro nombre de usuario y contraseña.
Esto es justo lo que tienes en tu código: te conectas al servidor de correo de Gmail y te identificas, para poder usar sus servicios y poder enviar un correo a un determinado buzón de Gmail. Pero... parece que estamos dando una vuelta de más. Así es: no es necesario autentificarse en Gmail para enviar un correo en el propio Gmail. Así que con una línea sencilla sería suficiente:
Using text Syntax Highlighting
explorer@casa:~> perl -MMIME::Lite -E 'MIME::Lite->new(From => "root\@jf.dyndns.org", To => "micorreo_en_gmail\@gmail.com", Subject => "Todo va bien...", Data => "Lo que habiamos dicho, todo correcto" )->send("smtp", "smtp.gmail.com", Debug=>1 ); '
MIME::Lite::SMTP>>> MIME::Lite::SMTP
MIME::Lite::SMTP>>> Net::SMTP(2.31)
MIME::Lite::SMTP>>> Net::Cmd(2.29)
MIME::Lite::SMTP>>> Exporter(5.66)
MIME::Lite::SMTP>>> IO::Socket::INET(1.33)
MIME::Lite::SMTP>>> IO::Socket(1.34)
MIME::Lite::SMTP>>> IO::Handle(1.33)
MIME::Lite::SMTP=GLOB(0x18dba50)<<< 220 mx.google.com ESMTP w5sm3500994wif.11 - gsmtp
MIME::Lite::SMTP=GLOB(0x18dba50)>>> EHLO localhost.localdomain
MIME::Lite::SMTP=GLOB(0x18dba50)<<< 250-mx.google.com at your service, [96.20.64.223]
MIME::Lite::SMTP=GLOB(0x18dba50)<<< 250-SIZE 35882577
MIME::Lite::SMTP=GLOB(0x18dba50)<<< 250-8BITMIME
MIME::Lite::SMTP=GLOB(0x18dba50)<<< 250-STARTTLS
MIME::Lite::SMTP=GLOB(0x18dba50)<<< 250 ENHANCEDSTATUSCODES
MIME::Lite::SMTP=GLOB(0x18dba50)<<< 530 5.7.0 Must issue a STARTTLS command first. w5sm3500994wif.11 - gsmtp
SMTP mail() command failed:
5.7.0 Must issue a STARTTLS command first. w5sm3500994wif.11 - gsmtp
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Vemos un fallo: el módulo MIME::Lite no sabe que debe usar el comando STARTTLS que le exige Gmail, y
seguir con parte de la comunicación codificada en TLS (salvo que Salva diga que hay otra forma más sencilla).
Si quisiéramos usar MIME::Lite con soporte de TLS, deberíamos hacer
un apaño grande.
O usar un módulo como
Net::SMTP::TLS.
Ejemplo.
O usar un módulo como
Email::Send::SMTP::TLS (primero lo instalamos):
Using text Syntax Highlighting
root@casa:~ # cpanp install Email::Send::SMTP::TLS
Installing Email::Send::SMTP::TLS (0.04)
Running [/usr/bin/perl -e use strict; BEGIN { my $old = select STDERR; $|++; select $old; $|++; $0 = shift(@ARGV); my $rv = do($0); die $@ if $@; } /root/.cpanplus/5.16.0/build/Email-Send-SMTP-TLS-0.04/Makefile.PL]...
Checking if your kit is complete...
Looks good
Writing Makefile for Email::Send::SMTP::TLS
Writing MYMETA.yml and MYMETA.json
Module 'Email::Send::SMTP::TLS' requires 'Email::Address' to be installed
Module 'Email::Send::SMTP::TLS' requires 'Email::Send' to be installed
Module 'Email::Send' requires 'Email::Simple' to be installed
Module 'Email::Send' requires 'Return::Value' to be installed
Module 'Email::Send::SMTP::TLS' requires 'Net::SMTP::TLS::ButMaintained' to be installed
Module 'Email::Send::SMTP::TLS' installed successfully
No errors installing all modules
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Fíjate, qué curioso, que instala una versión propia de TLS:
Net::SMTP::TLS::ButMaintained. Y se supone que ahora podemos enviar por medio de TLS:
Using text Syntax Highlighting
explorer@casa:~> perl -MEmail::Send -MEmail::Send::SMTP::TLS -E 'my $mailer = Email::Send->new( {mailer => "SMTP::TLS", mailer_args => [ Host => "smtp.gmail.com", Port => 587, User => "micorreo\@gmail.com", Password => "Osh0hri", ]}); use Email::Simple::Creator; my $email = Email::Simple->create(header => [From => "micorreo\@gmail.com", To => "micorreo\@gmail.com", Subject => "Hola!",], body => "Todo va bien...",); eval { $mailer->send($email) }; die "Error sending email: $@" if $@;'
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y sí que llega. (Ejemplo sacado de la sinopsis del módulo Email::Send::SMTP::TLS).
En cambio, si no fuera GMail, para enviar a otros servidores de correo, no habría problemas en usar MIME::Lite...
Using text Syntax Highlighting
explorer@casa:~> perl -MMIME::Lite -E 'MIME::Lite->new(From => "root\@jf.dyndns.org", To => "micorreo\@jferrero.com", Subject => "Todo va bien...", Data => "Lo que habiamos dicho, todo correcto" )->send("smtp", "smtp.jferrero.com", Debug=>1 ); '
MIME::Lite::SMTP>>> MIME::Lite::SMTP
MIME::Lite::SMTP>>> Net::SMTP(2.31)
MIME::Lite::SMTP>>> Net::Cmd(2.29)
MIME::Lite::SMTP>>> Exporter(5.66)
MIME::Lite::SMTP>>> IO::Socket::INET(1.33)
MIME::Lite::SMTP>>> IO::Socket(1.34)
MIME::Lite::SMTP>>> IO::Handle(1.33)
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 220 aprosi310.aprosi.net ESMTP Exim 4.72 Wed, 06 Feb 2013 16:20:38 +0100
MIME::Lite::SMTP=GLOB(0xf24b00)>>> EHLO localhost.localdomain
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250-aprosi310.aprosi.net Hello 223.64.20.96.dynamic.jazztel.es [96.20.64.223]
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250-SIZE 94371840
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250-PIPELINING
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250-AUTH LOGIN
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250-STARTTLS
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250 HELP
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250 OK
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250 Accepted
MIME::Lite::SMTP=GLOB(0xf24b00)>>> DATA
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 354 Enter message, ending with "." on a line by itself
MIME::Lite::SMTP=GLOB(0xf24b00)>>> MIME-Version: 1.0
MIME::Lite::SMTP=GLOB(0xf24b00)>>> Content-Disposition: inline
MIME::Lite::SMTP=GLOB(0xf24b00)>>> Content-Transfer-Encoding: 8bit
MIME::Lite::SMTP=GLOB(0xf24b00)>>> Content-Type: text/plain
MIME::Lite::SMTP=GLOB(0xf24b00)>>> X-Mailer: MIME::Lite 3.028 (F2.84; T1.34; A2.09; B3.13; Q3.13)
MIME::Lite::SMTP=GLOB(0xf24b00)>>> Date: Wed, 6 Feb 2013 16:20:33 +0100
MIME::Lite::SMTP=GLOB(0xf24b00)>>> Subject: Todo va bien...
MIME::Lite::SMTP=GLOB(0xf24b00)>>> Lo que habiamos dicho, todo correcto
MIME::Lite::SMTP=GLOB(0xf24b00)>>> .
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 250 OK id=1U36nf-0005Bk-8x
MIME::Lite::SMTP=GLOB(0xf24b00)>>> QUIT
MIME::Lite::SMTP=GLOB(0xf24b00)<<< 221 aprosi310.aprosi.net closing connection
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
aunque... depende de cada servidor (en algunos pedirán un tiempo de greylisting u otras medidas antispam parecidas).
Y tampoco nos autentificamos, porque el destinatario del buzón está en el mismo dominio que el servidor de correo. En el ejemplo: enviamos un correo a "
[email protected]" a través del servidor "smtp.jferrero.com".
Así que necesitamos un poco de ayuda para enviar a Gmail, usando el propio Gmail.
Como root, instalo la última versión de
Email::Send::SMTP::Gmail
Using text Syntax Highlighting
root@casa:~ # cpanp install Email::Send::SMTP::Gmail
[MSG] No '/root/.cpanplus/custom-sources' dir, skipping custom sources
[MSG] No '/root/.cpanplus/custom-sources' dir, skipping custom sources
[MSG] No '/root/.cpanplus/custom-sources' dir, skipping custom sources
Installing Email::Send::SMTP::Gmail (0.32)
*** Install log written to:
/root/.cpanplus/install-logs/Email-Send-SMTP-Gmail-0.32-1360164571.log
Module 'Email::Send::SMTP::Gmail' installed successfully
No errors installing all modules
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y ya puedo usarlo, incluso desde la línea de comandos:
Using text Syntax Highlighting
explorer@casa:~> perl -MEmail::Send::SMTP::Gmail -E 'my $mail=Email::Send::SMTP::Gmail->new( -smtp=>"smtp.gmail.com",-login=>"micorreo\@gmail.com",-pass=>"O5ishhcr5", -debug => 1); $mail->send(-to=>"micorreo\@gmail.com", -subject=>"Hola!", -body=>"Todo va bien...", -contenttype => "text/plain",); $mail->bye;'
*******************************************************************
Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
is depreciated! Please set SSL_verify_mode to SSL_VERIFY_PEER
together with SSL_ca_file|SSL_ca_path for verification.
If you really don't want to verify the certificate and keep the
connection open to Man-In-The-Middle attacks please set
SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************
at /usr/lib/perl5/site_perl/5.16.0/Email/Send/SMTP/Gmail.pm line 36.
Net::SMTP::SSL>>> Net::SMTP::SSL(1.01)
Net::SMTP::SSL>>> IO::Socket::SSL(1.81)
Net::SMTP::SSL>>> IO::Socket::INET6(2.69)
Net::SMTP::SSL>>> IO::Socket(1.34)
Net::SMTP::SSL>>> IO::Handle(1.33)
Net::SMTP::SSL>>> Exporter(5.66)
Net::SMTP::SSL>>> Net::Cmd(2.29)
Net::SMTP::SSL=GLOB(0x16c1288)<<< 220 mx.google.com ESMTP s10sm3975391wiw.4 - gsmtp
Net::SMTP::SSL=GLOB(0x16c1288)>>> EHLO localhost.localdomain
Net::SMTP::SSL=GLOB(0x16c1288)<<< 250-mx.google.com at your service, [96.20.64.223]
Net::SMTP::SSL=GLOB(0x16c1288)<<< 250-SIZE 35882577
Net::SMTP::SSL=GLOB(0x16c1288)<<< 250-8BITMIME
Net::SMTP::SSL=GLOB(0x16c1288)<<< 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
Net::SMTP::SSL=GLOB(0x16c1288)<<< 250 ENHANCEDSTATUSCODES
Net::SMTP::SSL=GLOB(0x16c1288)>>> AUTH LOGIN
Net::SMTP::SSL=GLOB(0x16c1288)<<< 334 VXNlcg5hbWU6
Net::SMTP::SSL=GLOB(0x16c1288)>>> amZlcgJlcm9AZ21ha6wuY29t
Net::SMTP::SSL=GLOB(0x16c1288)<<< 334 UGFzc3gcmQ6
Net::SMTP::SSL=GLOB(0x16c1288)>>> T2hjcglzaDA1
Net::SMTP::SSL=GLOB(0x16c1288)<<< 235 2.7.0 Accepted
Net::SMTP::SSL=GLOB(0x16c1288)<<< 250 2.1.0 OK s10sm4975391wiw.4 - gsmtp
Net::SMTP::SSL=GLOB(0x16c1288)<<< 250 2.1.5 OK s10sm4975391wiw.4 - gsmtp
Net::SMTP::SSL=GLOB(0x16c1288)>>> DATA
Net::SMTP::SSL=GLOB(0x16c1288)<<< 354 Go ahead s10sm4975391wiw.4 - gsmtp
Net::SMTP::SSL=GLOB(0x16c1288)>>> Subject: Hola!
Net::SMTP::SSL=GLOB(0x16c1288)>>> MIME-Version: 1.0
Net::SMTP::SSL=GLOB(0x16c1288)>>> Content-Type: text/plain; charset=UTF-8
Net::SMTP::SSL=GLOB(0x16c1288)>>> Todo va bien...
Net::SMTP::SSL=GLOB(0x16c1288)>>> .
Net::SMTP::SSL=GLOB(0x16c1288)<<< 250 2.0.0 OK 1360165067 s10sm4975391wiw.4 - gsmtp
Net::SMTP::SSL=GLOB(0x16c1288)>>> QUIT
Net::SMTP::SSL=GLOB(0x16c1288)<<< 221 2.0.0 closing connection s10sm4975391wiw.4 - gsmtp
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y el correo salió.
Ves que sale un aviso de error, por el tema del SSL_verify_mode, pero eso se puede solventar como te dije en el
mensaje anterior.
Resumen: para enviar a servidores de correo usando el protocolo SMTP, no necesitas nada en especial. Si el servidor de correo exige algo (como el caso de Gmail), pues habrá que adaptarse a ello, incluso cambiando de módulo. Para usar Gmail, hay que usar una conexión SSL o TLS. Esto lo ofrece Net::SMTP::SSL o Net::SMTP::TLS, que podemos manejar cómodamente a través de Email::Send::SMTP::Gmail o Email::Send::SMTP::TLS.
Hay otro módulo para enviar a Gmail:
Email::Send::Gmail.
¿Has probado a ejecutar el comando
mail del sistema?
Using text Syntax Highlighting
explorer@casa:~/bin> echo 'Todo bien' |MAILRC=/dev/null mail -v -s "Ok" -S smtp-use-starttls -S ssl-verify=ignore -S smtp-auth=login -S smtp=smtp.gmail.com:587 -S smtp-auth-user='
[email protected]' -S smtp-auth-password='5gshOhcr05'
[email protected]
Resolving host smtp.gmail.com . . . done.
Connecting to 173.194.66.109:587 . . . connected.
220 mx.google.com ESMTP cu7sm4083985wib.8 - gsmtp
>>> EHLO jf.dyndns.org
250-mx.google.com at your service, [96.20.64.223]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
>>> STARTTLS
220 2.0.0 Ready to start TLS
>>> EHLO jf.dyndns.org
250-mx.google.com at your service, [96.20.64.223]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250 ENHANCEDSTATUSCODES
>>> AUTH LOGIN
334 VXNlcm5hbWU6
>>> amZlcnJlcm9AZ21haWwuY29t
334 UGFzc3dvcmQ6
>>> T2hjcmlzaDA1
235 2.7.0 Accepted
250 2.1.0 OK cu7sm4083985wib.8 - gsmtp
250 2.1.5 OK cu7sm4083985wib.8 - gsmtp
>>> DATA
354 Go ahead cu7sm4083985wib.8 - gsmtp
>>> .
250 2.0.0 OK 1360170093 cu7sm4083985wib.8 - gsmtp
>>> QUIT
221 2.0.0 closing connection cu7sm4083985wib.8 - gsmtp
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Otra opción. Dices que tienes el Postfix instalado. Si está bien configurado, se puede usar como transporte de correo, en lugar de usar el protocolo SMTP de forma directa, pero... el resultado sería el mismo (el correo sale desde nuestra propia máquina)... excepto si está configurado para usar un determinado servidor de correo.