Pendant ma formation, je travaille sur un site web et nous utilisons Ruby on Rails. Nous devons envoyer des mails aux utilisateurs donc j'ai créé un mailer.
J'ai essayé de mettre le smtp dans les deux development.rb
et environment.rb
config.action_mailer.default_url_options = {Host: '0.0.0.0:3000'}
config.action_mailer.default charset: 'utf-8'
config.action_mailer.delivery_method = 'smtp'
config.action_mailer.perform_deliveries = true
config.action_mailer.smtp_settings = {
adress: $SMTP_SERVER,
port: $PORT,
from: $MAIL,
enable_starttls_auto: true
#authentication: 'login'
}
Il me dit que l'erreur vient de cette ligne de méthode 6
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
# Tell the UserMailer to send a welcome Email after save
UserMailer.welcome_email(@user).deliver_now
format.html { redirect_to(@user, :notice => 'User was successfully created.') }
format.json { render :json => @user, :status => :created, :location => @user }
else
format.html { render :action => "new" }
format.json { render :json => @user.errors, :status => :unprocessable_entity }
end
end
end
J'ai défini le port sur 587
mais je reçois toujours l'erreur:
Errno :: ECONNREFUSED: Connexion refusée - connect (2) pour le port "localhost" 25
Il semble qu'un autre fichier écrase mes paramètres. J'ai également vu qu'il pourrait être lié à ma clé ssh non autorisée par le serveur.
Tu sais ce qui ne va pas?
Merci d'avance
Tout d'abord, lors du développement sur localhost, il est courant pas d'envoyer réellement du courrier, plutôt de le traiter comme un détail de déploiement et de s'en tenir au comportement par défaut Rails qui est de cracher les en-têtes et le contenu du courrier dans la console STDOUT (où vous pouvez vérifier que le texte semble correct). Y a-t-il une raison spécifique pour laquelle vous devez tester l'envoi de messages dans l'environnement de développement?
Deuxièmement, vous avez mentionné que vous définissiez les paramètres SMTP dans development.rb et environment.rb. Vous ne devriez pas avoir besoin de définir ces paramètres deux fois; en général, j'utiliserais development.rb
pour les paramètres spécifiques à l'environnement de développement et environment.rb
uniquement pour les paramètres qui s'appliqueront toujours à tous les environnements (développement, tests et sur le serveur déployé en direct). Donc, si vous définissez les mêmes paramètres dans development.rb et environment.rb, je commencerais par supprimer l'un ou l'autre; la redondance ne fera que rendre votre travail plus difficile sur la route.
Enfin, pour résoudre ce problème, je commencerais par demander Rails quels sont ses paramètres plutôt que d'attendre l'échec de la remise du courrier. Essayez ce qui suit:
Rails console
Rails.configuration.action_mailer.smtp_settings
et comparez le hachage résultant à vos attentes. Ce hachage doit contenir les paramètres de port et de domaine qui sont utilisés lors de l'envoi de tous les messages (dans l'environnement actuel), donc si ActionMailer essaie le mauvais port, je m'attends à ce que le port soit incorrect ici aussi.Où mettez-vous $SMTP_SERVER
, $PORT
et $MAIL
? Y a-t-il une raison pour laquelle vous n'utilisez pas la convention Rails pour les variables d'environnement, ENV['SMTP_SERVER']
etc.?
J'espère que cela vous aidera. Bonne chance!
remplacer
config.action_mailer.delivery_method = 'smtp'
avec
config.action_mailer.delivery_method = :smtp
Assurez-vous que vos Rails.configuration.action_mailer.smtp_settings sont des clés symbolisées
L'application peut utiliser mailcatcher
gem pour tous les e-mails sortants en cours de développement, que vous n'avez pas installés ou que vous n'avez pas exécutés. C'était du moins mon problème. Vérifiez https://mailcatcher.me et suivez les instructions données.
Vous devez supprimer config.action_mailer.perform_deliveries = true
ligne.
Je rencontrais ce problème lors de l'exécution de Sidekiq::Worker.drain_all
dans mes tests RSpec, et ça me rendait fou parce que j'avais config.action_mailer.delivery_method = :test
dans mon config/environments/test.rb
.
La solution consistait à définir config.action_mailer.delivery_method = :test
dans mon config/environments/development.rb
, ce qui prête à confusion parce que l'implication est que mon config/environments/development.rb
remplace mon config/environments/test.rb
dans mes tests RSpec.
Quoi qu'il en soit, cela pourrait résoudre le problème pour les autres.