Forum: Ruby on Rails giving back ... gmail

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Aec10c73877ea116bab759e060b2fcb3?d=identicon&s=25 aktxyz@gmail.com (Guest)
on 2007-02-08 23:16
(Received via mailing list)
just a quick hack, but useful...

This blog shows how to send mail via gmail.

http://blog.pomozov.info/posts/how-to-send-actionm...

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

#========================================
1c46e952a61c99d9eae4f21037a088fd?d=identicon&s=25 Anatol Pomozov (anatol)
on 2007-02-15 23:05
(Received via mailing list)
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.
6856e946eaec76892a99123ebf64c684?d=identicon&s=25 Chris Grant (Guest)
on 2007-02-22 07:32
(Received via mailing list)
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
821395fe70906c8290df7f18ac4ac6cf?d=identicon&s=25 Rick Olson (Guest)
on 2007-02-22 09:21
(Received via mailing list)
On 2/22/07, Chris Grant <cdgonline@gmail.com> wrote:
> 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
This topic is locked and can not be replied to.