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

#========================================

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.

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 2/22/07, Chris G. [email protected] 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 :slight_smile:


Rick O.
http://weblog.techno-weenie.net
http://mephistoblog.com