Obtention de & # 8220; Doit d'abord émettre une commande STARTTLS & # 8221; en essayant d'envoyer un email
-
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.
$ cd vendor / plugins
$ svn export http://code.openrain.com/rails/action_mailer_tls/
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à.
- ActionMailer :: Base.smtp_settings = {
- : address = > "smtp.gmail.com",
- : port = > 587,
- : domain = > "domaine.com",
- : nom_utilisateur = > " user@domain.com" ;,
- : mot de passe = > "mot de passe",
- : authentication = > : plaine
- }
Toutes les suggestions concernant une meilleure solution pour communiquer avec Gmail seraient les bienvenues.
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.