Erst „Muss einen STARTTLS-Befehl zuerst ausgeben“, wenn sie versuchen E-Mail senden
-
08-07-2019 - |
Frage
Ich erhalte eine Fehlermeldung beim Versuch, die action_mailer_tls
Plugin zu verwenden, um mit Google Mail in meiner Rails-Anwendung zu kommunizieren:
Must issue a STARTTLS command first
Andere scheinen angetroffen zu haben das gleiche Problem
Das Problem ist, dass Google Mail TLS erfordert Authentifizierung aber der Standard Rubin net / smtp Bibliothek nicht TLS unterstützen.
Der Artikel empfiehlt die folgenden Schritte ausführen, was ich getan habe:
Natürlich gibt es ein hilfreiches Plugin von Marc Chung erstellt zu überwinden diese Barriere. Sie können es hier finden und fügen Sie es manuell zu einem Projekt oder Sie kann es zu einem Plugin exportieren Verzeichnis.
$ cd vendor/plugins
$ svn export http://code.openrain.com/rails/action_mailer_tls/
So oder so stellen Sie sicher, Sie benötigen 'Smtp_tls'
Alles was Sie jetzt brauchen, ist zu aktualisieren Sie Ihre smtp_settings wenn Sie nicht getan haben, bereits.
- Action :: Base.smtp_settings = {
- : Adresse => "smtp.gmail.com",
- : port => 587
- : domain => "domain.com",
- : user_name => "user@domain.com",
- : Passwort => "Passwort",
- : authentication =>: plain
- }
Irgendwelche Vorschläge für eine bessere Lösung zu Gmail sprechen würde geschätzt.
Lösung
Ich benutzte Alexander Pomozov Lösung auf Google Mail von meiner Rails-Anwendung zu sprechen. Ich glaube, der Original-Artikel ist weg, aber jemand hat die Google-Cache hier .
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
(hinzufügen, nachdem alles andere)
require “smtp_tls”
ActionMailer::Base.smtp_settings = {
:address => “smtp.gmail.com”,
:port => 587,
:authentication => :plain,
:user_name => “someone@openrain.com”,
:password => ’someonesPassword’
}
Mit Action als normal.
Andere Tipps
Mit Ruby-1.8.7 und Rails 2.3.4 (obwohl es mehrere Versionen der dort gewesen ist), ich habe Erfolg für TLS-spezifische Action Plugins ohne die Notwendigkeit, hatte durch die :enable_starttls_auto
Option. Eine Probe config (aus der Produktionsumgebung) sieht wie folgt aus:
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"
}
Ich hatte starttls aktiviert :enable_starttls_auto => true
verwenden, aber immer noch die gleichen Fehler. Schließlich war ich in der Lage, es zu lösen, ohne eine einzige Änderung im Code zu machen. Wenn Sie smtp.gmail.com verwenden Mail zu senden, müssen Sie zuerst erlauben weniger sichere Apps Ihre E-Mail zu verwenden, Mails zu versenden. Dazu melden Sie sich mit Ihrem Konto, von dem Sie E-Mails wollen und gehen schicken
diesen Link und wiederum auf den Zugang auf weniger sichere Apps.
Edit:. Wenn Sie nicht berechtigt sind die Einstellungen zu ändern, um weniger sichere Apps, dann sollten Sie die Admin-Konto Inhaber dieser Domain kontaktieren Sie die Einstellungen zu ändern, um die Benutzer für weniger sichere Apps zu ermöglichen
Wenn Sie die Admin-Rechte haben, können Sie den Benutzern erlauben, ihre weniger sichere App-Einstellungen ändern Sie es von https://admin.google.com/domainname.com/AdminHome#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess
PS:. Vergessen Sie nicht, die Domain Namen in dem obigen Link zu ändern
Hope this heps !!
Ich bin mit Schienen 2.3.4 und obwohl ich dachte (von googeln um) benötigen Sie haben keine Plugins und benötigt nur die Zeile
: enable_starttls_auto => true,
ich es tatsächlich bekam nur zu arbeiten, wenn ich die Alexander Pomozov Lösung von Ski geschrieben oben verwendet (große Dankeschön an euch). Jegliche Kommentare, warum? wäre toll, aber ich bin einfach nur glücklich, es funktioniert.