2010-06-03 58 views
2

有沒有什麼辦法在rails 2.3.5/ruby 1.9.1上使用Gmail作爲smtp服務器?Ruby,RoR,gmail和NET :: SMTP

actionmailer我的SMTP設置

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

這些結果在錯誤

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

回答

2

試試這個:

#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

你缺少在最後一個'end'和如果將RUBY_VERSION ==「1.8.6」'更改爲'如果RUBY_VERSION ==「1.8.6」|| RUBY_VERSION ==「1.9.1」'因爲看起來無論是在這裏進行猴子修補都有迴歸,並且你得到了一個'ArgumentError(錯誤的參數數量(3)2')。除了它的工作。謝謝! – anshul 2010-06-03 22:31:02

+0

啊,我從來沒有使用Ruby 1.9.1,但我認爲1.9.1使用與1.8.7相同的check_auth_args。 感謝您的修復! – porkeypop 2010-06-04 20:31:01