# Tls

**URL:** <https://www.ruby-forum.com/t/tls/115212>\
**Category:** Ruby\
**Created:** [September 21, 2007, 8:10pm UTC](https://www.ruby-forum.com/t/tls/115212 "2007-09-21T20:10:37Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![sean\_n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@sean\_n](https://www.ruby-forum.com/u/sean_n)\
**Post date:** [September 21, 2007, 8:10pm UTC](https://www.ruby-forum.com/t/tls/115212/1 "2007-09-21T20:10:37Z")

</div>

Anyone know if ruby supports TLS in SMTP? can you please provide code  
snippets?

---

<div class="post-metadata">

**Author:** ![sean\_n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@sean\_n](https://www.ruby-forum.com/u/sean_n)\
**Post date:** [September 21, 2007, 8:41pm UTC](https://www.ruby-forum.com/t/tls/115212/2 "2007-09-21T20:41:40Z")

</div>

[http://svn.nanorails.com/plugins/action\_mailer\_tls/](http://svn.nanorails.com/plugins/action_mailer_tls/)

---

<div class="post-metadata">

**Author:** ![sean\_n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@sean\_n](https://www.ruby-forum.com/u/sean_n)\
**Post date:** [September 21, 2007, 9:59pm UTC](https://www.ruby-forum.com/t/tls/115212/3 "2007-09-21T21:59:49Z")

</div>

On Sep 21, 2007, at 12:10 PM, Sean N. wrote:

> Anyone know if ruby supports TLS in SMTP? can you please provide  
> code snippets?

require “openssl”  
require “net/smtp”

Net::SMTP.class\_eval do  
private  
def do\_start(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

a @ [http://drawohara.com/](http://drawohara.com/)

---

<div class="post-metadata">

**Author:** ![sean\_n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@sean\_n](https://www.ruby-forum.com/u/sean_n)\
**Post date:** [September 21, 2007, 9:21pm UTC](https://www.ruby-forum.com/t/tls/115212/4 "2007-09-21T21:21:44Z")

</div>

On 9/21/07, Sean N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Anyone know if ruby supports TLS in SMTP? can you please provide code  
> snippets?

Look in Ruby/EventMachine- there is now an SMTP client and server and  
both  
support TLS.

---

<div class="post-metadata">

**Author:** ![sean\_n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@sean\_n](https://www.ruby-forum.com/u/sean_n)\
**Post date:** [September 27, 2007, 11:40am UTC](https://www.ruby-forum.com/t/tls/115212/5 "2007-09-27T11:40:27Z")

</div>

# thanks, it works. here’s the entire code.

msgstr = \<\<END\_OF\_MESSAGE  
Subject: This is my subject.

This is a test message.  
The quick  
brown fox.  
END\_OF\_MESSAGE

require ‘openssl’  
require ‘net/smtp’

Net::SMTP.class\_eval do  
private  
def do\_start(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

Net::SMTP.start(‘[smtp.gmail.com](http://smtp.gmail.com)’, 587, ‘[mail.domain.com](http://mail.domain.com)’,  
‘your\_account’, ‘your\_pass’, :login) do |smtp|  
smtp.send\_message msgstr,  
‘removed\_email\_address@domain.invalid’,  
‘removed\_email\_address@domain.invalid’,  
‘removed\_email\_address@domain.invalid’  
end

# you need to substitute:

# [mail.domain.com](http://mail.domain.com) - with the mail server on your domain.

# your\_account

# your\_pass

# removed\_email\_address@domain.invalid

# removed\_email\_address@domain.invalid

# removed\_email\_address@domain.invalid
