# Tls

**URL:** <https://rubytalk.org/t/tls/40819>\
**Category:** ruby-talk\
**Created:** [21 September 2007 18:10 UTC](https://rubytalk.org/t/tls/40819 "2007-09-21T18:10:04Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Sean\_Nakasone](https://avatars.discourse-cdn.com/v4/letter/s/e9a140/32.png) [@Sean\_Nakasone](https://rubytalk.org/u/Sean_Nakasone)\
**Post date:** [21 September 2007 18:10 UTC](https://rubytalk.org/t/tls/40819/1 "2007-09-21T18:10:04Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Alexey\_Verkhovsky1](https://avatars.discourse-cdn.com/v4/letter/a/919ad9/32.png) [@Alexey\_Verkhovsky1](https://rubytalk.org/u/Alexey_Verkhovsky1)\
**Post date:** [21 September 2007 18:41 UTC](https://rubytalk.org/t/tls/40819/2 "2007-09-21T18:41:05Z")

</div>

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

> **···**
>
> --  
> Alexey Verkhovsky  
> CruiseControl.rb [[http://cruisecontrolrb.thoughtworks.com](http://cruisecontrolrb.thoughtworks.com)]  
> RubyWorks [[http://rubyworks.thoughtworks.com](http://rubyworks.thoughtworks.com)]

---

<div class="post-metadata">

**Author:** ![Francis\_Cianfrocca](https://avatars.discourse-cdn.com/v4/letter/f/7bcc69/32.png) [@Francis\_Cianfrocca](https://rubytalk.org/u/Francis_Cianfrocca)\
**Post date:** [21 September 2007 19:20 UTC](https://rubytalk.org/t/tls/40819/3 "2007-09-21T19:20:56Z")

</div>

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

> **···**
>
> On 9/21/07, Sean Nakasone \<seannakasone@yahoo.com\> wrote:
> 
> > Anyone know if ruby supports TLS in SMTP? can you please provide code  
> > snippets?

---

<div class="post-metadata">

**Author:** ![a11](https://yyz1.discourse-cdn.com/flex029/user_avatar/rubytalk.org/a11/32/8169_2.png) [@a11](https://rubytalk.org/u/a11)\
**Post date:** [21 September 2007 19:59 UTC](https://rubytalk.org/t/tls/40819/4 "2007-09-21T19:59:17Z")

</div>

require "openssl"  
require "net/smtp"

Net::SMTP.class\_eval do  
&nbsp;&nbsp;&nbsp;private  
&nbsp;&nbsp;&nbsp;def do\_start(helodomain, user, secret, authtype)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise IOError, 'SMTP session already started' if @started  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check\_auth\_args user, secret, authtype if user or secret

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock = timeout(@open\_timeout) { TCPSocket.open(@address, @port) }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket = Net::InternetMessageIO.new(sock)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.read\_timeout = 60 #@read\_timeout  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.debug\_output = STDERR #@debug\_output

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check\_response(critical { recv\_response() })  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do\_helo(helodomain)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise 'openssl library not installed' unless defined?(OpenSSL)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starttls  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssl = OpenSSL::SSL::SSLSocket.new(sock)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssl.sync\_close = true  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssl.connect  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket = Net::InternetMessageIO.new(ssl)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.read\_timeout = 60 #@read\_timeout  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.debug\_output = STDERR #@debug\_output  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do\_helo(helodomain)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authenticate user, secret, authtype if user  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@started = true  
&nbsp;&nbsp;&nbsp;ensure  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unless @started  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# authentication failed, cancel connection.  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.close if not @started and @socket and not @socket.closed?  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket = nil  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;def do\_helo(helodomain)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @esmtp  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ehlo helodomain  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helo helodomain  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rescue Net::ProtocolError  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @esmtp  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@esmtp = false  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@error\_occured = false  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retry  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;def starttls  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getok('STARTTLS')  
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;def quit  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getok('QUIT')  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rescue EOFError  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;end  
end

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

> **···**
>
> On Sep 21, 2007, at 12:10 PM, Sean Nakasone wrote:
> 
> > Anyone know if ruby supports TLS in SMTP? can you please provide code snippets?
> 
> --  
> we can deny everything, except that we have the possibility of being better. simply reflect on that.  
> h.h. the 14th dalai lama

---

<div class="post-metadata">

**Author:** ![Sean\_Nakasone](https://avatars.discourse-cdn.com/v4/letter/s/e9a140/32.png) [@Sean\_Nakasone](https://rubytalk.org/u/Sean_Nakasone)\
**Post date:** [27 September 2007 09:40 UTC](https://rubytalk.org/t/tls/40819/5 "2007-09-27T09:40:03Z")

</div>

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

msgstr = \<\<END\_OF\_MESSAGE

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

require 'openssl'  
require 'net/smtp'

Net::SMTP.class\_eval do  
&nbsp;&nbsp;&nbsp;private  
&nbsp;&nbsp;&nbsp;def do\_start(helodomain, user, secret, authtype)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise IOError, 'SMTP session already started' if @started  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check\_auth\_args user, secret, authtype if user or secret

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock = timeout(@open\_timeout) { TCPSocket.open(@address,  
@port) }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket = Net::InternetMessageIO.new(sock)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.read\_timeout = 60 #@read\_timeout  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.debug\_output = STDERR #@debug\_output

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check\_response(critical { recv\_response() })  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do\_helo(helodomain)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise 'openssl library not installed' unless defined?(OpenSSL)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starttls  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssl = OpenSSL::SSL::SSLSocket.new(sock)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssl.sync\_close = true  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssl.connect  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket = Net::InternetMessageIO.new(ssl)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.read\_timeout = 60 #@read\_timeout  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.debug\_output = STDERR #@debug\_output  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do\_helo(helodomain)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authenticate user, secret, authtype if user  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@started = true  
&nbsp;&nbsp;&nbsp;ensure  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unless @started  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# authentication failed, cancel connection.  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket.close if not @started and @socket and not  
@socket.closed?  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@socket = nil  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;def do\_helo(helodomain)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @esmtp  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ehlo helodomain  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helo helodomain  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rescue Net::ProtocolError  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @esmtp  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@esmtp = false  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@error\_occured = false  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retry  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;def starttls  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getok('STARTTLS')  
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;def quit  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getok('QUIT')  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rescue EOFError  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;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|  
&nbsp;&nbsp;smtp.send\_message msgstr,  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'from\_email@domain.com',  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'to\_email@domain.com',  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'another\_to\_email@domain.com'  
end

# you need to substitute:  
# [mail.domain.com](http://mail.domain.com) - with the mail server on your domain.  
# your\_account  
# your\_pass  
# [from\_email@domain.com](mailto:from_email@domain.com)  
# [to\_email@domain.com](mailto:to_email@domain.com)  
# [another\_to\_email@domain.com](mailto:another_to_email@domain.com)

> **···**
>
> Subject: This is my subject.
