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

I have migrated users from old forum database. Is there any way to send password reset e-mails in bulk? I’ve tried to use API but got You have performed this action too many times, try again later. after requesting to send about 3 reset emails… (other API actions work fine)

I’d be happy to use ruby console or API if you can please advise how to go around that rate limit. It is probably limit per IP address as I’ve investigated.

[updated]

Seems like RateLimiter for ‘forgot_password’ is unfortunately hardcoded so I went ruby script way…

For mass reseting (sending out tokens for password reset to all users) you can do

cd /var/discourse
./launcher enter app

Then create new file mass-password-reset.rb using your favourite editor with following script:

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

And then run it with rails r mass-password-reset.rb

5 « J'aime »

Awesome, thanks! I recently migrated data from my old forum and when tried to manually reset passwords for my users (not too many of them), ran into error message. Discourse logs didn’t show anything, tried to rebuild app and it didn’t help. Then tried your script and now via outsourced email sending service (and Sidekiq) I see that these mails are sending out. So, thanks again! :slight_smile:

2 « J'aime »

Tried this but the data model has now changed (due to secondary email I think). Email addresses are now in User Email object I think.

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 !