mpgn mpgn - 2 months ago 17
Ruby Question

Redmine : send mail via gmail error SSL_connect or STARTTLS

i try to configure redmine for email notifications

So my configuration in

configuration.yml
is :

production:
email_delivery:
delivery_method: :smtp
smtp_settings:
enable_starttls_auto: true
address: "smtp.gmail.com"
port: '587'
domain: "smtp.gmail.com"
authentication: :plain
user_name: "mymail@gmail.com"
password: "mypass"


According to this tutorial :

http://www.redmine.org/projects/redmine/wiki/EmailConfiguration#Simple-Login-Authentication-default-settings

But when i try : Send a test mail, i have this error :

An error occurred while sending mail (530 5.7.0 Must issue a STARTTLS command first. n7sm25368265eef.5 - gsmtp )


If i have :

production:
email_delivery:
delivery_method: :smtp
smtp_settings:
tls: true
enable_starttls_auto: true
address: "smtp.gmail.com"
port: '587'
domain: "smtp.gmail.com"
authentication: :plain
user_name: "mymail@gmail.com"
password: "mypass"


I have this error :

An error occurred while sending mail (SSL_connect returned=1 errno=0 state=unknown state: unknown protocol)


Any ideas ? Redmine version : 2.0.1, Ruby : 1.9.3

Answer

1.Save the following code within your rails app in lib/smtp_tls.rb:

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

2.Add this code to config/environment.rb (after everything else):

require “smtp_tls”

ActionMailer::Base.smtp_settings = {
:address => “smtp.gmail.com”,
:port => 587,
:authentication => :plain,
:user_name => “someone@openrain.com”,
:password => ’someonesPassword’
} 

3.Use ActionMailer as normal.