Archivo para la etiqueta ‘linkedin

Gwibber 2 en Portage   Leave a comment

Recién salido del horno Gwibber 2.29.92.1 R1 enviado a Portage, por fin después de tanto tiempo se pudo hacer la actualización, a disfrutarlo Gentoo users:D

De Screenshots

Publicado marzo 15, 2010 por Sergio D. Rodríguez Inclan en General

Etiquetado con

Enviar un correo usando el SMTP de Gmail, y Ruby + ActionMailer   3 comments

Desde hace muchos dias he estado buscando la manera de enviar correos usando Ruby, probe con varios ejemplos de internet, usando gemas y demas, ninguno funciono, hasta ahora.

El principal problema de usar Gmail, es que necesita autentificar por SSL/TLS, pero encontre un codigo en la lista de usuarios de Rails de Vancouver, lo modifique un poco, lo probe y voila! funciona de mil maravillas.

Aqui esta el archivo de correo (message.rb):

require action_mailer
require smtp_tls

class AnnounceMailer < ActionMailer::Base

def message(recipient)
from tu_correo@loquesea.com
recipients recipient
subject Aca va el subject
body <<EOS
Hola,

Este es un mensaje de muestra.

Saludos.
EOS
end
end

# Probar si se creo bien imprimiendo el mensaje.
puts AnnounceMailer.create_message( receptor@loquesea.com )

ActionMailer::Base.smtp_settings = {
:address => smtp.gmail.com,
:port => 587,
:authentication => :plain,
:user_name => tuUsuariode@gmail.com,
:password => secreto
}

# Enviar el mensaje
AnnounceMailer.deliver_message( receptor@loquesea.com )

Y aqui esta la libreria para manejar el SMTP con TLS (smtp_tls.rb):

<font color=»#a020f0″>require</font>&nbsp;<font color=»#6a5acd»>&quot;</font><font color=»#ff00ff»>openssl</font><font color=»#6a5acd»>&quot;</font><br>
<font color=»#a020f0″>require</font>&nbsp;<font color=»#6a5acd»>&quot;</font><font color=»#ff00ff»>net/smtp</font><font color=»#6a5acd»>&quot;</font><br>
<br>
<font color=»#2e8b57″><b>Net</b></font>::<font color=»#2e8b57″><b>SMTP</b></font>.class_eval <font color=»#a52a2a»><b>do</b></font><br>
<font color=»#a52a2a»><b>private</b></font><br>
<font color=»#a020f0″>def</font>&nbsp;<font color=»#008b8b»>do_start</font>(helodomain, user, secret, authtype)<br>
<font color=»#a52a2a»><b>raise</b></font>&nbsp;<font color=»#2e8b57″><b>IOError</b></font>, <font color=»#6a5acd»>'</font><font color=»#ff00ff»>SMTP session already started</font><font color=»#6a5acd»>'</font>&nbsp;<font color=»#a52a2a»><b>if</b></font>&nbsp;<font color=»#008b8b»>@started</font><br>
check_auth_args user, secret, authtype <font color=»#a52a2a»><b>if</b></font>&nbsp;user <font color=»#a52a2a»><b>or</b></font>&nbsp;secret<br>
<br>
sock = timeout(<font color=»#008b8b»>@open_timeout</font>) { <font color=»#2e8b57″><b>TCPSocket</b></font>.open(<font color=»#008b8b»>@address</font>, <font color=»#008b8b»>@port</font>) }<br>
<font color=»#008b8b»>@socket</font>&nbsp;= <font color=»#2e8b57″><b>Net</b></font>::<font color=»#2e8b57″><b>InternetMessageIO</b></font>.new(sock)<br>
<font color=»#008b8b»>@socket</font>.read_timeout = <font color=»#ff00ff»>60</font>&nbsp;<font color=»#0000ff»>#@read_timeout</font><br>
<font color=»#0000ff»>#@socket.debug_output = STDERR #@debug_output</font><br>
<br>
check_response(critical { recv_response() })<br>
do_helo(helodomain)<br>
<br>
<font color=»#a52a2a»><b>if</b></font>&nbsp;starttls<br>
&nbsp;&nbsp;<font color=»#a52a2a»><b>raise</b></font>&nbsp;<font color=»#6a5acd»>'</font><font color=»#ff00ff»>openssl library not installed</font><font color=»#6a5acd»>'</font>&nbsp;<font color=»#a52a2a»><b>unless</b></font>&nbsp;<font color=»#a52a2a»><b>defined?</b></font>(<font color=»#2e8b57″><b>OpenSSL</b></font>)<br>
&nbsp;&nbsp;ssl = <font color=»#2e8b57″><b>OpenSSL</b></font>::<font color=»#2e8b57″><b>SSL</b></font>::<font color=»#2e8b57″><b>SSLSocket</b></font>.new(sock)<br>
&nbsp;&nbsp;ssl.sync_close = <font color=»#ff00ff»>true</font><br>
&nbsp;&nbsp;ssl.connect<br>
&nbsp;&nbsp;<font color=»#008b8b»>@socket</font>&nbsp;= <font color=»#2e8b57″><b>Net</b></font>::<font color=»#2e8b57″><b>InternetMessageIO</b></font>.new(ssl)<br>
&nbsp;&nbsp;<font color=»#008b8b»>@socket</font>.read_timeout = <font color=»#ff00ff»>60</font>&nbsp;<font color=»#0000ff»>#@read_timeout</font><br>
&nbsp;&nbsp;<font color=»#0000ff»>#@socket.debug_output = STDERR #@debug_output</font><br>
&nbsp;&nbsp;do_helo(helodomain)<br>
<font color=»#a52a2a»><b>end</b></font><br>
<br>
authenticate user, secret, authtype <font color=»#a52a2a»><b>if</b></font>&nbsp;user<br>
<font color=»#008b8b»>@started</font>&nbsp;= <font color=»#ff00ff»>true</font><br>
<font color=»#a52a2a»><b>ensure</b></font><br>
<font color=»#a52a2a»><b>unless</b></font>&nbsp;<font color=»#008b8b»>@started</font><br>
&nbsp;&nbsp;<font color=»#0000ff»># authentication failed, cancel connection.</font><br>
&nbsp;&nbsp;<font color=»#008b8b»>@socket</font>.close <font color=»#a52a2a»><b>if</b></font>&nbsp;<font color=»#a52a2a»><b>not</b></font>&nbsp;<font color=»#008b8b»>@started</font>&nbsp;<font color=»#a52a2a»><b>and</b></font>&nbsp;<font color=»#008b8b»>@socket</font>&nbsp;<font color=»#a52a2a»><b>and</b></font>&nbsp;<font color=»#a52a2a»><b>not</b></font>&nbsp;<font color=»#008b8b»>@socket</font>.closed?<br>
&nbsp;&nbsp;<font color=»#008b8b»>@socket</font>&nbsp;= <font color=»#ff00ff»>nil</font><br>
<font color=»#a52a2a»><b>end</b></font><br>
<font color=»#a020f0″>end</font><br>
<br>
<font color=»#a020f0″>def</font>&nbsp;<font color=»#008b8b»>do_helo</font>(helodomain)<br>
&nbsp;<font color=»#a52a2a»><b>begin</b></font><br>
&nbsp;&nbsp;<font color=»#a52a2a»><b>if</b></font>&nbsp;<font color=»#008b8b»>@esmtp</font><br>
&nbsp;&nbsp;&nbsp;&nbsp;ehlo helodomain<br>
&nbsp;&nbsp;<font color=»#a52a2a»><b>else</b></font><br>
&nbsp;&nbsp;&nbsp;&nbsp;helo helodomain<br>
&nbsp;&nbsp;<font color=»#a52a2a»><b>end</b></font><br>
<font color=»#a52a2a»><b>rescue</b></font>&nbsp;<font color=»#2e8b57″><b>Net</b></font>::<font color=»#2e8b57″><b>ProtocolError</b></font><br>
&nbsp;&nbsp;<font color=»#a52a2a»><b>if</b></font>&nbsp;<font color=»#008b8b»>@esmtp</font><br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color=»#008b8b»>@esmtp</font>&nbsp;= <font color=»#ff00ff»>false</font><br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color=»#008b8b»>@error_occured</font>&nbsp;= <font color=»#ff00ff»>false</font><br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color=»#a52a2a»><b>retry</b></font><br>
&nbsp;&nbsp;<font color=»#a52a2a»><b>end</b></font><br>
&nbsp;&nbsp;<font color=»#a52a2a»><b>raise</b></font><br>
<font color=»#a52a2a»><b>end</b></font><br>
<font color=»#a020f0″>end</font><br>
<br>
<font color=»#a020f0″>def</font>&nbsp;<font color=»#008b8b»>starttls</font><br>
getok(<font color=»#6a5acd»>'</font><font color=»#ff00ff»>STARTTLS</font><font color=»#6a5acd»>'</font>) <font color=»#a52a2a»><b>rescue</b></font>&nbsp;<font color=»#a52a2a»><b>return</b></font>&nbsp;<font color=»#ff00ff»>false</font><br>
<font color=»#a52a2a»><b>return</b></font>&nbsp;<font color=»#ff00ff»>true</font><br>
<font color=»#a020f0″>end</font><br>
<br>
<font color=»#a020f0″>def</font>&nbsp;<font color=»#008b8b»>quit</font><br>
<font color=»#a52a2a»><b>begin</b></font><br>
&nbsp;&nbsp;getok(<font color=»#6a5acd»>'</font><font color=»#ff00ff»>QUIT</font><font color=»#6a5acd»>'</font>)<br>
<font color=»#a52a2a»><b>rescue</b></font>&nbsp;<font color=»#2e8b57″><b>EOFError</b></font>, <font color=»#2e8b57″><b>OpenSSL</b></font>::<font color=»#2e8b57″><b>SSL</b></font>::<font color=»#2e8b57″><b>SSLError</b></font><br>
<font color=»#a52a2a»><b>end</b></font><br>
<font color=»#a020f0″>end</font><br>
<font color=»#a52a2a»><b>end</b></font><br>
</font><

require «openssl«
require «net/smtp«

Net::SMTP.class_eval do
private
def do_start(helodomain, user, secret, authtype)
raise IOError, SMTP session already started if @started
check_auth_args user, secret, authtype if user or secret

sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
@socket = Net::InternetMessageIO.new(sock)
@socket.read_timeout = 60 #@read_timeout
#@socket.debug_output = STDERR #@debug_output
check_response(critical { recv_response() })
do_helo(helodomain)
if starttls
raise openssl library not installed unless defined?(OpenSSL)
ssl = OpenSSL::SSL::SSLSocket.new(sock)
ssl.sync_close = true
ssl.connect
@socket = Net::InternetMessageIO.new(ssl)
@socket.read_timeout = 60 #@read_timeout
#@socket.debug_output = STDERR #@debug_output
do_helo(helodomain)
end
authenticate user, secret, authtype if user
@started = true
ensure
unless @started
# authentication failed, cancel connection.
@socket.close if not @started and @socket and not @socket.closed?
@socket = nil
end
end

def do_helo(helodomain)
begin
if @esmtp
ehlo helodomain
else
helo helodomain
end
rescue Net::ProtocolError
if @esmtp
@esmtp = false
@error_occured = false
retry
end
raise
end
end

def starttls
getok(STARTTLS) rescue return false
return true
end

def quit
begin
getok(QUIT)
rescue EOFError, OpenSSL::SSL::SSLError
end
end
end

Para que funcione, se necesita la libreria OpenSSL instalada y la gema ActionMailer o Ruby On Rails que la trae en el paquete, si se usa Windows podria probar con Cygwin.

Espero les sea de utilidad.

PD: Siento las faltas ortograficas estoy en teclado ingles y sin ganas de modificar las X a espaniol 😛

Codigo  original de  http://bit.ly/9r8cx1

Publicado enero 31, 2010 por Sergio D. Rodríguez Inclan en General, Open Source, Ruby & Rails

Etiquetado con