Obteniendo & # 8220; Primero debe emitir un comando STARTTLS & # 8221; al intentar enviar un correo electrónico
-
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.
$ cd vendor / plugins
$ svn export http://code.openrain.com/rails/action_mailer_tls/
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.
- ActionMailer :: Base.smtp_settings = {
- : dirección = > " smtp.gmail.com " ;,
- : puerto = > 587,
- : dominio = > " dominio.com " ;,
- : nombre_usuario = > " usuario@dominio.com" ;,
- : contraseña = > " contraseña " ;,
- : autenticación = > : liso
- }
Cualquier sugerencia para una mejor solución para hablar con Gmail sería apreciada.
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.