Come ottenere & # 8220; Devi prima emettere un comando STARTTLS & # 8221; quando si tenta di inviare e-mail
-
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.
$ cd vendor / plugins
$ svn export http://code.openrain.com/rails/action_mailer_tls/
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à.
- ActionMailer :: Base.smtp_settings = {
- : indirizzo = > " smtp.gmail.com " ;,
- : port = > 587,
- : domain = > " domain.com " ;,
- : nome_utente = > " user@domain.com" ;,
- : password = > " password " ;,
- : autenticazione = > : semplice
- }
Qualunque suggerimento per una soluzione migliore per parlare con Gmail sarebbe apprezzato.
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.