Erst „Muss einen STARTTLS-Befehl zuerst ausgeben“, wenn sie versuchen E-Mail senden

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

  •  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.

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

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.

     
      
  1. Action :: Base.smtp_settings = {
  2.   
  3. : Adresse => "smtp.gmail.com",
  4.   
  5. : port => 587
  6.   
  7. : domain => "domain.com",
  8.   
  9. : user_name => "user@domain.com",
  10.   
  11. : Passwort => "Passwort",
  12.   
  13. : authentication =>: plain
  14.   
  15. }
  16.   

Irgendwelche Vorschläge für eine bessere Lösung zu Gmail sprechen würde geschätzt.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top