Envoyer des e-mails de réinitialisation de mot de passe en masse ?

J’ai migré les utilisateurs depuis l’ancienne base de données du forum. Existe-t-il un moyen d’envoyer des e-mails de réinitialisation de mot de passe en masse ? J’ai essayé d’utiliser l’API, mais j’ai reçu le message « Vous avez effectué cette action trop de fois, réessayez plus tard » après avoir demandé l’envoi d’environ 3 e-mails de réinitialisation. (Les autres actions de l’API fonctionnent correctement)

Je serais ravi d’utiliser la console Ruby ou l’API si vous pouvez m’indiquer comment contourner cette limite de débit. Il s’agit probablement d’une limite par adresse IP, comme je l’ai constaté.

[mis à jour]

Il semble que le RateLimiter pour ‘forgot_password’ soit malheureusement codé en dur, alors j’ai opté pour la solution du script Ruby…

Pour une réinitialisation en masse (envoi de jetons de réinitialisation de mot de passe à tous les utilisateurs), vous pouvez procéder comme suit :

cd /var/discourse
./launcher enter app

Ensuite, créez un nouveau fichier mass-password-reset.rb avec votre éditeur préféré en utilisant le script suivant :

User.all.each do |u|
  email_token = u.email_tokens.create(email: u.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)
  sleep(5)
end

Enfin, exécutez-le avec rails r mass-password-reset.rb.

5 « J'aime »

Super, merci ! J’ai récemment migré des données depuis mon ancien forum et, en essayant de réinitialiser manuellement les mots de passe de mes utilisateurs (il n’y en a pas trop), j’ai rencontré un message d’erreur. Les journaux de Discourse ne montraient rien, j’ai tenté de reconstruire l’application sans succès. Ensuite, j’ai essayé votre script et maintenant, via le service d’envoi d’e-mails externalisé (et Sidekiq), je vois que ces e-mails sont envoyés. Merci encore ! :slight_smile:

2 « J'aime »

J’ai essayé cela, mais le modèle de données a changé (à cause de l’email secondaire, je pense). Les adresses email se trouvent désormais dans l’objet User Email, je crois.

2 « J'aime »

Salut, as-tu trouvé une solution à ce problème ? J’étais sur le point d’essayer ce script, mais j’ai vu ton message et je me demande maintenant si tu as réussi à contourner le problème.

Je pense que la meilleure option est toujours de leur faire réinitialiser leur mot de passe via le lien de réinitialisation du mot de passe. Y a-t-il une raison pour laquelle votre utilisateur ne peut pas le faire ?

Non, ce serait juste une question d’expérience utilisateur. Nous avons migré notre ancien forum vanilla et je pense que la meilleure expérience pour les anciens utilisateurs serait de recevoir un e-mail disant « Hé, nous avons migré de notre forum vers une nouvelle plateforme. Vous pouvez vous connecter via ce lien : {link} ».

Je corrige ici - ce script fonctionne. J’ai juste eu à :

cd /var/discourse
sudo ./launcher enter app

Ensuite, créer le fichier :

// créer le fichier
touch password.rb

Puis ajouter le code suivant :

email_token = nil

User.all.each do |u|
  email_token = u.email_tokens.create(email: u.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)
  sleep(5)
end

Et enfin, l’exécuter :

rails r password.rb

Cela a fonctionné pour moi :slight_smile:.

2 « J'aime »

Ah désolé, j’ai voulu revenir là-dessus hier quand j’ai réalisé que vous vouliez faire une opération en masse et non une opération unique. Je suis content que vous ayez trouvé la solution. :slight_smile: :+1:

Je vais diviser ce problème pour qu’il soit plus facile à trouver dans les recherches futures. :mag_right:

3 « J'aime »

Salut, je ne sais pas si c’est toujours le meilleur endroit pour poser cette question, mais sauriez-vous combien de temps dure l’e-mail de réinitialisation de mot de passe ? Je sais qu’il expire dans 3 ou 4 jours, mais j’ai besoin de le savoir car je vais inviter mes utilisateurs d’un ancien forum et j’ai besoin d’envoyer un message les informant que l’e-mail peut expirer après n jours, j’ai donc besoin de l’heure précise. Merci

Comment exécutons-nous cette commande par utilisateur ou juste pour une liste d’utilisateurs dans un fichier texte ? J’ai environ 8000 utilisateurs à transférer. Je crée les utilisateurs sans problème avec l’API, mais ensuite les e-mails ne sont pas envoyés en raison de la limitation de débit codée en dur. J’ai également défini mon adresse IP sur ACCEPT dans la section IP filtrées, mais toujours rien. Est-ce quelque chose qui ne peut être fait que dans la console Rails ?

Merci !

Je serais également intéressé par l’adaptation du script ci-dessus pour l’envoyer à 1 seul utilisateur, afin que je puisse le tester avant de l’envoyer à tout le monde.

Je pense qu’utiliser un script d’importation serait une meilleure idée pour créer autant d’utilisateurs, mais c’est hors sujet :upside_down_face:
Quoi qu’il en soit, vous atteindriez la limite de débit si vous envoyiez également l’e-mail dans le script.

Si vous souhaitez ralentir le processus d’envoi d’e-mails, vous pouvez ajouter un sleep(x) (x en secondes) dans la boucle ruby, et il doit être adapté à la ou aux limites de débit.

Si vous avez l’intention de laisser votre script s’exécuter pendant un certain temps, utilisez un gestionnaire de session tel que screen ou tmux.

user = User.find_by(username: 'alehandrof')

if user
  email_token = user.email_tokens.create(email: user.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: user.id, email_token: email_token.token)
end

Il n’est pas nécessaire de créer un fichier Ruby pour cela ; vous pouvez l’exécuter dans la console Rails (./launcher enter app puis rails c).

2 « J'aime »

Merci pour votre aide @Canapin !