diff --git a/.gitignore b/.gitignore index 2baaee2..cbebfe1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ config/database.yml +config/initializers/smtp_settings.rb coverage db/schema.* db/*.sqlite3 diff --git a/config/environments/production.rb b/config/environments/production.rb index 27119d2..0b9713b 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,3 +1,4 @@ +require 'smtp_tls' # Settings specified here will take precedence over those in config/environment.rb # The production environment is meant for finished, "live" apps. @@ -25,4 +26,7 @@ # config.action_mailer.raise_delivery_errors = false # Enable threaded mode -# config.threadsafe! \ No newline at end of file +# config.threadsafe! + +config.action_mailer.raise_delivery_errors = true +config.action_mailer.delivery_method = :smtp \ No newline at end of file diff --git a/lib/smtp_tls.rb b/lib/smtp_tls.rb new file mode 100755 index 0000000..074b2db --- /dev/null +++ b/lib/smtp_tls.rb @@ -0,0 +1,67 @@ +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) + + if starttls + raise 'openssl library not installed' unless defined?(OpenSSL) + 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) + end + + 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') rescue return false + return true +end + +def quit + begin + getok('QUIT') + rescue EOFError, OpenSSL::SSL::SSLError + end +end +end