aktxyz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
2007-Feb-08 22:15 UTC
giving back ... gmail
just a quick hack, but useful...
This blog shows how to send mail via gmail.
http://blog.pomozov.info/posts/how-to-send-actionmailer-mails-to-gmailcom.html
It does it by replacing some methods in Net::SMTP with versions that
do the right TLS thing (this likely only works on linux, which is fine
for me).
The annoying thing is that with this lib, you can no longer send to a
"normal" smtp server. So I did this...basically just take the old
path if not a gmail smtp server, take the new path if gmail.
require "openssl"
require "net/smtp"
#=======================================
Net::SMTP.class_eval do
private
#=======================================
def do_start(helodomain, user, secret, authtype)
if @address =~ /smtp.gmail.com/i
do_start_tls(helodomain, user, secret, authtype)
else
do_start_original(helodomain, user, secret, authtype)
end
end
#=======================================
def do_start_original(helodomain, user, secret, authtype)
raise IOError, ''SMTP session already started'' if @started
check_auth_args user, secret, authtype if user or secret
@socket = InternetMessageIO.old_open(@address, @port,
@open_timeout, @read_timeout,
@debug_output)
check_response(critical { recv_response() })
begin
if @esmtp
ehlo helodomain
else
helo helodomain
end
rescue ProtocolError
if @esmtp
@esmtp = false
@error_occured = false
retry
end
raise
end
authenticate user, secret, authtype if user
@started = true
ensure
@socket.close if not @started and @socket and not @socket.closed?
end
#=======================================
def do_start_tls(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)
raise ''openssl library not installed'' unless
defined?(OpenSSL)
starttls
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)
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'')
end
#=======================================
def quit
begin
getok(''QUIT'')
rescue EOFError
end
end
#=======================================
end
#=======================================
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Hmm..... What did you mean "could not send to normal servers"?? Have you seen paragrapth that starts from "Update 2:"??? I use this Net:SMTP hack with Cerberus (http://cerberus.rubyforge.org) for sending to gmail and plain local network smtp servers without any problem. On 9 фев, 01:15, "akt...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org" <akt...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> just a quick hack, but useful... > > This blog shows how to send mail via gmail. > > http://blog.pomozov.info/posts/how-to-send-actionmailer-mails-to-gmai... > > It does it by replacing some methods in Net::SMTP with versions that > do the right TLS thing (this likely only works on linux, which is fine > for me). > > The annoying thing is that with this lib, you can no longer send to a > "normal" smtp server. So I did this...basically just take the old > path if not a gmail smtp server, take the new path if gmail. > > require "openssl" > require "net/smtp" > > #=======================================> > Net::SMTP.class_eval do > > private > > #=======================================> > def do_start(helodomain, user, secret, authtype) > > if @address =~ /smtp.gmail.com/i > do_start_tls(helodomain, user, secret, authtype) > else > do_start_original(helodomain, user, secret, authtype) > end > > end > > #=======================================> > def do_start_original(helodomain, user, secret, authtype) > raise IOError, ''SMTP session already started'' if @started > check_auth_args user, secret, authtype if user or secret > > @socket = InternetMessageIO.old_open(@address, @port, > @open_timeout, @read_timeout, > @debug_output) > check_response(critical { recv_response() }) > begin > if @esmtp > ehlo helodomain > else > helo helodomain > end > rescue ProtocolError > if @esmtp > @esmtp = false > @error_occured = false > retry > end > raise > end > authenticate user, secret, authtype if user > @started = true > ensure > @socket.close if not @started and @socket and not @socket.closed? > end > > #=======================================> > def do_start_tls(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) > > raise ''openssl library not installed'' unless defined?(OpenSSL) > starttls > 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) > > 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'') > end > > #=======================================> > def quit > begin > getok(''QUIT'') > rescue EOFError > end > end > > #=======================================> > end > > #=======================================--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
It blows my mind that secure SMTP is *still* not part of Rails. This hack is nice but it just feels creepy to have to use it ... maybe it''s just me. Ever since Google Apps for Your Domain ( http://www.google.com/a ) came out, I''ve stopped worrying about managing my own installs of mail servers. Ask anyone and they''ll tell you that managing these devils is the bane of server maintenance. Anyways, I really, really, really hope that someone up high thinks about adding support for secure SMTP so that we can take advantage of GMail and all the other secure-only options out there. -Chris On Feb 15, 4:04 pm, "Anatol Pomozov" <anatol.pomo...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hmm..... > > What did you mean "could not send to normal servers"?? Have you seen > paragrapth that starts from "Update 2:"??? > > I use this Net:SMTPhack with Cerberus (http://cerberus.rubyforge.org) > for sending togmailand plain local networksmtpservers without any > problem. > > On 9 фев, 01:15, "akt...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org" <akt...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > just a quick hack, but useful... > > > This blog shows how to send mail viagmail. > > >http://blog.pomozov.info/posts/how-to-send-actionmailer-mails-to-gmai... > > > It does it by replacing some methods in Net::SMTPwith versions that > > do the right TLS thing (this likely only works on linux, which is fine > > for me). > > > The annoying thing is that with this lib, you can no longer send to a > > "normal"smtpserver. So I did this...basically just take the old > > path if not agmailsmtpserver, take the new path ifgmail. > > > require "openssl" > > require "net/smtp" > > > #=======================================> > > Net::SMTP.class_eval do > > > private > > > #=======================================> > > def do_start(helodomain, user, secret, authtype) > > > if @address =~ /smtp.gmail.com/i > > do_start_tls(helodomain, user, secret, authtype) > > else > > do_start_original(helodomain, user, secret, authtype) > > end > > > end > > > #=======================================> > > def do_start_original(helodomain, user, secret, authtype) > > raise IOError, ''SMTPsession already started'' if @started > > check_auth_args user, secret, authtype if user or secret > > > @socket = InternetMessageIO.old_open(@address, @port, > > @open_timeout, @read_timeout, > > @debug_output) > > check_response(critical { recv_response() }) > > begin > > if @esmtp > > ehlo helodomain > > else > > helo helodomain > > end > > rescue ProtocolError > > if @esmtp > > @esmtp = false > > @error_occured = false > > retry > > end > > raise > > end > > authenticate user, secret, authtype if user > > @started = true > > ensure > > @socket.close if not @started and @socket and not @socket.closed? > > end > > > #=======================================> > > def do_start_tls(helodomain, user, secret, authtype) > > raise IOError, ''SMTPsession 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) > > > raise ''openssl library not installed'' unless defined?(OpenSSL) > > starttls > > 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) > > > 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'') > > end > > > #=======================================> > > def quit > > begin > > getok(''QUIT'') > > rescue EOFError > > end > > end > > > #=======================================> > > end > > > #=======================================--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On 2/22/07, Chris Grant <cdgonline-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > It blows my mind that secure SMTP is *still* not part of Rails. This > hack is nice but it just feels creepy to have to use it ... maybe it''s > just me. > > Ever since Google Apps for Your Domain ( http://www.google.com/a ) > came out, I''ve stopped worrying about managing my own installs of mail > servers. Ask anyone and they''ll tell you that managing these devils > is the bane of server maintenance. > > Anyways, I really, really, really hope that someone up high thinks > about adding support for secure SMTP so that we can take advantage of > GMail and all the other secure-only options out there.I eventually gave up and used python to check gmail :) -- Rick Olson http://weblog.techno-weenie.net http://mephistoblog.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---