尝试发送电子邮件时,“必须先发出STARTTLS命令”

时间:2009-10-29 02:48:05

标签: ruby-on-rails gmail

尝试使用action_mailer_tls插件在我的Rails应用中与Gmail通信时出现错误:

Must issue a STARTTLS command first

其他人似乎遇到了this same problem

  

问题是Gmail需要TLS   身份验证但标准的Ruby   net / smtp库不支持TLS。

本文建议按照以下步骤操作:

  

当然有一个有用的插件   由Marc Chung创造以克服这一点   屏障。你可以在这里找到它   手动将其添加到您的项目或您   可以将其导出到您的插件   。目录

     
      
  1. $ cd vendor/plugins
  2.   
  3. $ svn export http://code.openrain.com/rails/action_mailer_tls/
  4.         

    无论哪种方式确保您需要   'smtp_tls'

         

    现在您只需要更新您的   smtp_settings,如果你还没有这样做   已经

         
        
    1. ActionMailer :: Base.smtp_settings = {
    2.   
    3. :address => “smtp.gmail.com”,
    4.   
    5. :port => 587,
    6.   
    7. :domain => “domain.com”,
    8.   
    9. :user_name => “user@domain.com”,
    10.   
    11. :password => “密码”,
    12.   
    13. :authentication => :plain
    14.   
    15. }
    16.   

任何有关更好地与Gmail通信的解决方案的建议都将受到赞赏。

4 个答案:

答案 0 :(得分:10)

我使用Alexander Pomozov的解决方案从我的Rails应用程序与Gmail交谈。我相信原始文章已经消失,但有人已经复制了Google缓存over here

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

到config / environment.rb

(添加其他所有内容后)

    require “smtp_tls”

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

正常使用ActionMailer。

答案 1 :(得分:5)

使用Ruby 1.8.7和Rails 2.3.4(虽然已经有多个版本),但我已经成功,而不需要使用:enable_starttls_auto选项来使用特定于TLS的ActionMailer插件。示例配置(来自生产环境)如下所示:

ActionMailer::Base.smtp_settings = {
  :enable_starttls_auto => true,
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => "domain.com",
  :authentication => :plain,
  :user_name => "username@domain",
  :password => "secret"
}

答案 2 :(得分:1)

我使用Option Explicit Sub find() Dim WS_Count As Integer Dim i As Integer Dim myValue As Variant Dim Rng As Range Dim wkb As Workbook Dim lastrow As Long WS_Count = Worksheets.Count myValue = InputBox("Please enter the value that you want to look for:") For i = 1 To WS_Count With Worksheets(i).UsedRange Set Rng = .find(What:=myValue) If Not Rng Is Nothing Then MsgBox ("The value" & " " & myValue & " " & "found in" & " " & ActiveWorkbook.Worksheets(i).Name & " " & Rng.Address) 'do whatever you want with the string found... Else MsgBox ("Nothing found in" & " " & ActiveWorkbook.Worksheets(i).Name) End If End With Next i End Sub 启用了starttls,但仍然遇到了同样的错误。最后,我能够在不对代码进行任何更改的情况下解决它。如果您使用smtp.gmail.com发送邮件,则必须首先允许安全性较低的应用程序使用您的电子邮件发送邮件。为此,请使用您要从中发送邮件的帐户登录并转到 this link开启对不太安全的应用的访问权限 编辑:如果您不允许将设置更改为安全性较低的应用,则应联系该域的管理员帐户持有者以更改设置,以允许用户使用安全性较低的应用。
如果您拥有管理员权限,则可以允许用户更改其不太安全的应用设置,您可以从https://admin.google.com/domainname.com/AdminHome#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess更改它 PS:不要忘记更改上述链接中的域名。

希望这会好起来!!

答案 3 :(得分:0)

我正在运行rails 2.3.4虽然我认为(从谷歌搜索)你不需要任何插件,只需要线路

:enable_starttls_auto =>真,

当我使用上面滑雪发布的Alexander Pomozov解决方案时,我实际上只能使用它(对你们来说很重要)。有什么评论为什么?会很棒,但我很高兴它有效。