Obteniendo & # 8220; Primero debe emitir un comando STARTTLS & # 8221; al intentar enviar un correo electrónico

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

  •  08-07-2019
  •  | 
  •  

Pregunta

Recibo un error al intentar usar el complemento action_mailer_tls para comunicarme con Gmail en mi aplicación Rails:

Must issue a STARTTLS command first

Otros parecen haber encontrado este mismo problema :

  

El problema es que Gmail requiere TLS   autenticación pero el Ruby estándar   La biblioteca net / smtp no es compatible con TLS.

El artículo recomienda seguir estos pasos, que hice:

  

Por supuesto, hay un complemento útil   creado por Marc Chung para superar esto   barrera. Puedes encontrarlo aquí y   agregarlo manualmente a su proyecto o usted   puede exportarlo a su complemento   directorio.

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

De cualquier manera, asegúrese de requerir   'smtp_tls'

     

Ahora todo lo que necesitas es actualizar tu   smtp_settings si no lo has hecho   ya.

     
      
  1. ActionMailer :: Base.smtp_settings = {
  2.   
  3. : dirección = > " smtp.gmail.com " ;,
  4.   
  5. : puerto = > 587,
  6.   
  7. : dominio = > " dominio.com " ;,
  8.   
  9. : nombre_usuario = > " usuario@dominio.com" ;,
  10.   
  11. : contraseña = > " contraseña " ;,
  12.   
  13. : autenticación = > : liso
  14.   
  15. }
  16.   

Cualquier sugerencia para una mejor solución para hablar con Gmail sería apreciada.

¿Fue útil?

Solución

Utilicé la solución de Alexander Pomozov para hablar con Gmail desde mi aplicación Rails. Creo que el artículo original se ha ido, pero alguien ha reproducido el caché de Google aquí .

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

(agregar después de todo lo demás)

    require “smtp_tls”

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

Use ActionMailer de manera normal.

Otros consejos

Con Ruby 1.8.7 y Rails 2.3.4 (aunque ha estado allí durante varias versiones), he tenido éxito sin la necesidad de complementos ActionMailer específicos de TLS mediante el uso de la opción : enable_starttls_auto . Una configuración de muestra (del entorno de producción) se ve así:

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

Había habilitado starttls usando : enable_starttls_auto = > verdadero pero aún tiene el mismo error. Finalmente pude resolverlo sin hacer un solo cambio en el código. Si está utilizando smtp.gmail.com para enviar correo, primero debe permitir que las aplicaciones menos seguras usen su correo electrónico para enviar correos. Para eso, inicie sesión con su cuenta desde la que desea enviar correo y vaya a este enlace y active el acceso a aplicaciones menos seguras.
Editar: si no puede cambiar la configuración a aplicaciones menos seguras, debe comunicarse con el titular de la cuenta de administrador de ese dominio para cambiar la configuración y permitir a los usuarios aplicaciones menos seguras.
Si tiene los derechos de administrador, puede permitir que los usuarios cambien la configuración de su aplicación menos segura, puede cambiarla desde https://admin.google.com/domainname.com/AdminHome#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess
PD: No olvides cambiar el nombre de dominio en el enlace de arriba.

¡Espero que esto sea genial!

Estoy ejecutando rails 2.3.4 y aunque pensé (buscando en Google) no necesitabas ningún complemento y solo requerías la línea

: enable_starttls_auto = > cierto,

En realidad solo lo puse a trabajar cuando usé la solución Alexander Pomozov publicada por ski arriba (muchas gracias a ustedes). ¿Algún comentario sobre por qué? sería genial, pero estoy feliz de que funcione.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top