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
#========================================