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 -~----------~----~----~----~------~----~------~--~---