Pergunta

Estou recebendo um erro ao tentar usar o plugin action_mailer_tls para se comunicar com o Gmail em meu aplicativo Rails:

Must issue a STARTTLS command first

Outros parecem ter encontrado este mesmo problema :

O problema é que o Gmail exige TLS autenticação, mas o padrão do Ruby biblioteca net / SMTP não suporta TLS.

O artigo recomenda seguir estes passos, o que eu fiz:

É claro que há um plugin útil criado por Marc Chung para superar esta barreira. Você pode encontrá-lo aqui e adicioná-lo manualmente ao seu projeto ou você pode exportá-lo para o seu plugin diretório.

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

De qualquer maneira certificar-se de que você precisa 'Smtp_tls'

Agora tudo que você precisa é atualizar seu smtp_settings se você não tiver feito isso já.

  1. ActionMailer :: Base.smtp_settings = {
  2. : endereço => "smtp.gmail.com",
  3. : port => 587,
  4. : domain => "domain.com",
  5. : user_name => "user@domain.com",
  6. : password => "password",
  7. : autenticação =>: plain
  8. }

Todas as sugestões para uma melhor solução para falar com Gmail seria apreciada.

Foi útil?

Solução

Eu costumava solução de Alexandre Pomozov falar com o Gmail do meu aplicativo Rails. Eu acredito que o artigo original se foi, mas alguém tem reproduzido o cache do Google aqui .

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

(add depois de tudo)

    require “smtp_tls”

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

Use ActionMailer como normal.

Outras dicas

Com o Ruby 1.8.7 e Rails 2.3.4 (embora ele foi lá para vários lançamentos), eu tive sucesso sem a necessidade de plugins ActionMailer TLS-específicas usando a opção :enable_starttls_auto. A configuração da amostra (do ambiente de produção) fica assim:

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"
}

Eu tinha habilitado STARTTLS usando :enable_starttls_auto => true mas ainda tenho o mesmo erro. Finalmente eu era capaz de resolvê-lo sem fazer uma única alteração no código. Se você estiver usando smtp.gmail.com para enviar e-mails, você tem que primeiro permite que aplicativos menos seguros para usar seu e-mail para enviar mails. Para isso, faça login com a sua conta a partir da qual você deseja enviar e-mail e vá para este link e ligar o acesso a aplicações menos seguras.
Edit:. Se você não tem permissão para alterar as configurações para aplicativos menos seguros, então você deve entrar em contato com o titular da conta de administrador desse domínio para alterar as configurações para permitir que os usuários para aplicativos menos seguros
Se você tem os direitos de administrador, você pode permitir que os usuários alterem suas configurações de aplicativos menos seguros que você pode mudá-lo a partir de https://admin.google.com/domainname.com/AdminHome#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess
PS:. Não se esqueça de mudar o nome do domínio no link acima

Espero que isso heps !!

Estou correndo trilhos 2.3.4 e embora eu pensei (de pesquisando em torno) você não necessita de quaisquer plugins e necessária apenas a linha

: enable_starttls_auto => true,

Na verdade, eu só tenho isso para o trabalho quando eu usei a solução Alexander Pomozov postado por ski acima (grande agradecimento a vocês). Quaisquer comentários a respeito de porque? seria ótimo, mas eu estou apenas feliz ele funciona.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top