Ruby: cliente Pop SSL ó como leer tu cuenta Gmail desde Ruby.
Cómo ya dicen en muchas partes, pero me repito aquí para parecer muy listo y por marcarlo como nota mental, para acceder a tu cuenta Pop en Gmail desde Ruby hay que hacer una ñapa porque la versión actual de Ruby (1.8.6) no admite conexiones Pop bajo SSL.
Si si.. la 1.9 ya tiene el soporte, y dicen por ahí que descargándote el pop.rb de esta versión desde el repositorio y haciéndole un require ya funciona.. pero no, por lo menos a mí no porque me salta alguna dependencia con OpenSSl:
NoMethodError: undefined method `set_params' for #<openssl::ssl::sslcontext:0x210f4d0>; </openssl::ssl::sslcontext:0x210f4d0>
Y no quería seguir tirando de el hilo.
El workarround que más me ha gustado ha sido el de montar un tunel ssh y hacer la petición desde el Net::POP3 al túnel y que el túnel se la haga llegar al pop de Gmail bajo SSL.
No voy a entrar en detalle porque ya lo hacen en muchos sitios.
Actualizado: acabo de ver un sitio dónde explican como usar la implementación pop.rb de la 1.9 sin el problema que me da a mí.
Los pasos resumidos que este post explica son:
1) Descargarte una implementación de la librería POP3: la versión 13778.
2) Ponerla en tu carpeta lib con este nombre por ejemplo: pop_ssl.rb con esto sobreescribiremos la implementación de esta librería que trae ruby por defecto con una versión mayor.
3) Descargarte este fichero y ponerlo también en lib: pop_gmail_client.rb
class PopGmailClient def self.read_account( account_user, account_pass ) mails = [] Net::POP3.enable_ssl(OpenSSL::SSL::VERIFY_NONE) Net::POP3.start( 'pop.gmail.com', 995, account_user, account_pass ) do |pop| pop.each_mail do |m| mails << m.pop end end mails end end
4) Requerirlos desde el environment.rb al final del todo con:
require 'pop_ssl' require 'pop_gmail_client'
Y ya podemos usarlo como queramos:
$ script/console Loading development environment (Rails 2.0.2) >> PopGmailClient.read_account( "fguillen.testing@gmail.com", "xxx" )
O desde ruby directamente:
$ irb >> require 'lib/pop_ssl.rb' => true >> require 'lib/pop_client_gmail.rb' => true >> PopGmailClient.read_account( "fguillen.testing@gmail.com", "xxx" )