2010-06-03 7 views
2

Existe-t-il un moyen d'utiliser gmail comme serveur SMTP sur rails 2.3.5/ruby 1.9.1?Ruby, RoR, gmail et NET :: SMTP

Mes paramètres smtp pour actionmailer sont

options = { 
    :address    => "smtp.gmail.com", 
    :port     => 587, 
    :domain    => 'REMOVED', 
    :user_name   => 'REMOVED', 
    :password    => 'REMOVED', 
    :authentication  => 'plain', 
    :enable_starttls_auto => true } 

et ce résultat dans l'erreur

Net::SMTPAuthenticationError: 530 5.7.0 Must issue a STARTTLS command first. 

Répondre

2

Essayez ceci:

#config/initializers/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 

    if RUBY_VERSION == "1.8.6" 
     check_auth_args user, secret, authtype if user or secret 
    else 
     check_auth_args user, secret if user or secret 
    end 

    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 
+1

Il vous manque un 'end' à la fin et il faut changer 'si RUBY_VERSION ==" 1.8.6 "' à si RUBY_VERSION == "1.8.6" || RUBY_VERSION == "1.9.1" 'parce qu'il semble que tout ce qui est en train d'être patché ici a eu une régression et que vous obtenez un' ArgumentError '(mauvais nombre d'arguments (2 pour 3)) '. Autre que cela a fonctionné. Merci! – anshul

+0

Ah, je n'ai jamais utilisé Ruby 1.9.1, mais je suppose que 1.9.1 utilise le même check_auth_args que 1.8.7. Merci pour la correction! – porkeypop

Questions connexes