Obtention de & # 8220; Doit d'abord émettre une commande STARTTLS & # 8221; en essayant d'envoyer un email

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

  •  08-07-2019
  •  | 
  •  

Question

Un message d'erreur s'affiche lorsque j'essaie d'utiliser le plug-in action_mailer_tls pour communiquer avec Gmail dans mon application Rails:

Must issue a STARTTLS command first

D'autres semblent avoir rencontré le même problème :

  

Le problème est que Gmail nécessite TLS.   authentification mais le Ruby standard   La bibliothèque net / smtp ne prend pas en charge TLS.

L'article recommande de suivre ces étapes, ce que j'ai fait:

  

Bien sûr, il existe un plugin utile   créé par Marc Chung pour surmonter cette   barrière. Vous pouvez le trouver ici et   ajoutez-le manuellement à votre projet ou vous   peut l'exporter vers votre plugin   répertoire.

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

Dans les deux cas, assurez-vous d'avoir besoin   'smtp_tls'

     

Il ne vous reste plus qu'à mettre à jour votre   smtp_settings si vous ne l'avez pas déjà fait   déjà.

     
      
  1. ActionMailer :: Base.smtp_settings = {
  2.   
  3. : address = > "smtp.gmail.com",
  4.   
  5. : port = > 587,
  6.   
  7. : domain = > "domaine.com",
  8.   
  9. : nom_utilisateur = > " user@domain.com" ;,
  10.   
  11. : mot de passe = > "mot de passe",
  12.   
  13. : authentication = > : plaine
  14.   
  15. }
  16.   

Toutes les suggestions concernant une meilleure solution pour communiquer avec Gmail seraient les bienvenues.

Était-ce utile?

La solution

J'ai utilisé la solution d'Alexander Pomozov pour parler à Gmail à partir de mon application Rails. Je crois que l'article original a disparu, mais quelqu'un a reproduit le cache de Google. ici .

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

(ajouter après tout le reste)

    require “smtp_tls”

    ActionMailer::Base.smtp_settings = {
    :address => “smtp.gmail.com”,
    :port => 587,
    :authentication => :plain,
    :user_name => “someone@openrain.com”,
    :password => ’someonesPassword’
    } 

Utilisez ActionMailer normalement.

Autres conseils

Avec Ruby 1.8.7 et Rails 2.3.4 (même si cela existe depuis plusieurs versions), j'ai eu du succès sans avoir besoin de plugins ActionMailer spécifiques à TLS en utilisant l'option : enable_starttls_auto . Un exemple de configuration (de l'environnement de production) se présente comme suit:

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"
}

J'avais activé les starttls en utilisant : enable_starttls_auto = > true mais a toujours la même erreur. Enfin, j'ai pu résoudre le problème sans apporter un seul changement dans le code. Si vous utilisez smtp.gmail.com pour envoyer des messages, vous devez d'abord autoriser les applications moins sécurisées à utiliser votre messagerie pour envoyer des messages. Pour cela, connectez-vous avec votre compte à partir duquel vous voulez envoyer un courrier et allez à ce lien et activer l'accès vers des applications moins sécurisées.
Modifier: si vous n'êtes pas autorisé à modifier les paramètres pour définir des applications moins sécurisées, contactez le titulaire du compte administrateur de ce domaine pour modifier les paramètres afin d'autoriser les utilisateurs pour des applications moins sécurisées.
Si vous disposez des droits d'administrateur, vous pouvez autoriser les utilisateurs à modifier les paramètres de leurs applications moins sécurisées. Vous pouvez le modifier de https://admin.google.com/domainname.com/AdminHome#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess
PS: N'oubliez pas de changer le nom de domaine dans le lien ci-dessus.

J'espère que ça va!

Je suis sous rails 2.3.4 et bien que je pensais (en cherchant dans Google) que vous n’aviez besoin d’aucun plugin et que vous ne demandiez que la ligne

: enable_starttls_auto = > vrai,

En fait, cela ne fonctionne que lorsque j'ai utilisé la solution Alexander Pomozov publiée par ski ci-dessus (merci beaucoup à vous les gars). Des commentaires sur pourquoi? Ce serait génial, mais je suis simplement heureux que cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top