Come ottenere & # 8220; Devi prima emettere un comando STARTTLS & # 8221; quando si tenta di inviare e-mail

StackOverflow https://stackoverflow.com/questions/1641354

  •  08-07-2019
  •  | 
  •  

Domanda

Ricevo un errore durante il tentativo di utilizzare il plug-in action_mailer_tls per comunicare con Gmail nella mia app Rails:

Must issue a STARTTLS command first

Altri sembrano aver riscontrato questo stesso problema :

  

Il problema è che Gmail richiede TLS   autenticazione ma lo standard Ruby   La libreria net / smtp non supporta TLS.

L'articolo raccomanda di seguire questi passaggi, che ho fatto:

  

Naturalmente c'è un utile plugin   creato da Marc Chung per superare questo   barriera. Puoi trovarlo qui e   aggiungilo manualmente al tuo progetto o a te   puoi esportarlo nel tuo plugin   directory.

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

In entrambi i casi assicurati di averne bisogno   'Smtp_tls'

     

Ora tutto ciò che serve è aggiornare il tuo   smtp_settings se non l'hai ancora fatto   già.

     
      
  1. ActionMailer :: Base.smtp_settings = {
  2.   
  3. : indirizzo = > " smtp.gmail.com " ;,
  4.   
  5. : port = > 587,
  6.   
  7. : domain = > " domain.com " ;,
  8.   
  9. : nome_utente = > " user@domain.com" ;,
  10.   
  11. : password = > " password " ;,
  12.   
  13. : autenticazione = > : semplice
  14.   
  15. }
  16.   

Qualunque suggerimento per una soluzione migliore per parlare con Gmail sarebbe apprezzato.

È stato utile?

Soluzione

Ho usato la soluzione di Alexander Pomozov per parlare con Gmail dalla mia app Rails. Credo che l'articolo originale sia sparito ma qualcuno ha riprodotto la cache di Google qui .

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

(aggiungi dopo tutto il resto)

    require “smtp_tls”

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

Usa ActionMailer normalmente.

Altri suggerimenti

Con Ruby 1.8.7 e Rails 2.3.4 (anche se è stato utilizzato per diverse versioni), ho avuto successo senza la necessità di plug-in ActionMailer specifici di TLS utilizzando l'opzione : enable_starttls_auto . Un esempio di configurazione (dall'ambiente di produzione) è simile al seguente:

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

Avevo abilitato starttls usando : enable_starttls_auto = > true ma ha ancora lo stesso errore. Finalmente sono stato in grado di risolverlo senza apportare una singola modifica al codice. Se stai utilizzando smtp.gmail.com per inviare la posta, devi prima consentire alle app meno sicure di utilizzare la tua e-mail per inviare la posta. Per questo, accedi con il tuo account da cui vuoi inviare la posta e vai a questo link e attiva l'accesso ad app meno sicure.
Modifica: se non ti è consentito modificare le impostazioni in app meno sicure, contatta il titolare dell'account amministratore di quel dominio per modificare le impostazioni per consentire agli utenti di app meno sicure.
Se disponi dei diritti di amministratore puoi consentire agli utenti di modificare le impostazioni dell'app meno sicure, puoi cambiarlo da https://admin.google.com/domainname.com/AdminHome#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess
PS: non dimenticare di cambiare il nome di dominio nel link sopra.

Spero che questo coglione !!

Sto usando le rotaie 2.3.4 e anche se ho pensato (da google a cercare) non hai richiesto alcun plugin e hai richiesto solo la linea

: enable_starttls_auto = > vero,

In realtà l'ho fatto funzionare solo quando ho usato la soluzione Alexander Pomozov pubblicata da Ski sopra (grazie a voi ragazzi). Qualche commento sul perché? sarebbe fantastico ma sono solo felice che funzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top