Obtendo “Deve emitir um comando STARTTLS primeiro” ao tentar enviar email
-
08-07-2019 - |
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.
$ cd vendor/plugins
$ 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á.
- ActionMailer :: Base.smtp_settings = {
- : endereço => "smtp.gmail.com",
- : port => 587,
- : domain => "domain.com",
- : user_name => "user@domain.com",
- : password => "password",
- : autenticação =>: plain
- }
Todas as sugestões para uma melhor solução para falar com Gmail seria apreciada.
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.