# Giving back ... gmail

**URL:** <https://www.ruby-forum.com/t/giving-back-gmail/84976>\
**Category:** Rails\
**Created:** [February 8, 2007, 11:16pm UTC](https://www.ruby-forum.com/t/giving-back-gmail/84976 "2007-02-08T23:16:21Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [February 8, 2007, 11:16pm UTC](https://www.ruby-forum.com/t/giving-back-gmail/84976/1 "2007-02-08T23:16:21Z")

</div>

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](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

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

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [February 15, 2007, 11:05pm UTC](https://www.ruby-forum.com/t/giving-back-gmail/84976/2 "2007-02-15T23:05:20Z")

</div>

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](http://cerberus.rubyforge.org))  
for sending to gmail and plain local network smtp servers without any  
problem.

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [February 22, 2007, 7:32am UTC](https://www.ruby-forum.com/t/giving-back-gmail/84976/3 "2007-02-22T07:32:39Z")

</div>

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](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

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [February 22, 2007, 9:21am UTC](https://www.ruby-forum.com/t/giving-back-gmail/84976/4 "2007-02-22T09:21:52Z")

</div>

On 2/22/07, Chris G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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 O.  
[http://weblog.techno-weenie.net](http://weblog.techno-weenie.net)  
[http://mephistoblog.com](http://mephistoblog.com)
