Massenhaft Passwort-Reset-E-Mails senden?

Ich habe Benutzer aus der alten Forum-Datenbank migriert. Gibt es eine Möglichkeit, Passwort-Zurücksetzungs-E-Mails im Bulk zu versenden? Ich habe versucht, die API zu nutzen, aber nach dem Anfordern von etwa 3 Zurücksetzungen erhielt ich die Meldung: „Sie haben diese Aktion zu oft ausgeführt. Versuchen Sie es später erneut." (Andere API-Aktionen funktionieren einwandfrei.)

Ich würde gerne die Ruby-Konsole oder die API verwenden, wenn Sie mir bitte raten können, wie man dieses Rate-Limit umgehen kann. Es handelt sich wahrscheinlich um ein Limit pro IP-Adresse, wie ich recherchiert habe.

[updated]

Es scheint, als wäre der RateLimiter für „forgot_password" leider hartkodiert, daher habe ich mich für den Weg über ein Ruby-Skript entschieden…

Für das Massenzurücksetzen (Versenden von Token zur Passwort-Zurücksetzung an alle Benutzer) können Sie Folgendes tun:

cd /var/discourse
./launcher enter app

Erstellen Sie dann mit Ihrem bevorzugten Editor eine neue Datei namens mass-password-reset.rb mit folgendem Skript:

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

Führen Sie es anschließend mit rails r mass-password-reset.rb aus.

5 „Gefällt mir“

Toll, danke! Ich habe kürzlich Daten von meinem alten Forum migriert und beim manuellen Zurücksetzen der Passwörter für meine Benutzer (es sind nicht allzu viele) eine Fehlermeldung erhalten. Die Discourse-Logs zeigten nichts an, ich habe versucht, die App neu zu erstellen, aber das half nicht. Dann habe ich dein Skript ausprobiert, und jetzt sehe ich über den ausgelagerten E-Mail-Versanddienst (und Sidekiq), dass diese Mails versendet werden. Also, nochmals vielen Dank! :slight_smile:

2 „Gefällt mir“

Ich habe es versucht, aber das Datenmodell hat sich geändert (vermutlich aufgrund der sekundären E-Mail-Adresse). E-Mail-Adressen befinden sich nun meiner Meinung nach im Objekt „User Email".

2 „Gefällt mir“

Hallo, hast du etwas zur Lösung dieses Problems gefunden? Ich wollte gerade dieses Skript ausprobieren, habe aber deine Nachricht gesehen und frage mich nun, ob du es geschafft hast, das Problem zu umgehen.

Ich denke, die beste Option ist immer noch, sie ihr Passwort über den Link zum Zurücksetzen des Passworts zurücksetzen zu lassen. Gibt es einen Grund, warum Ihr Benutzer dies nicht tun kann?

Nein, es wäre nur eine Frage der Benutzererfahrung. Wir haben unser altes Vanilla-Forum migriert und ich denke, die beste Erfahrung für die alten Benutzer wäre, eine E-Mail zu erhalten, in der steht: „Hallo, wir sind von unserem Forum auf eine neue Plattform umgezogen. Sie können sich über diesen Link anmelden: {link}“.

Nur zur Richtigstellung – dieses Skript funktioniert. Ich musste nur:\n\ncd /var/discourse\nsudo ./launcher enter app\n\n\nDann die Datei erstellen:\n\n// Datei erstellen\ntouch password.rb\n\n\nDann den folgenden Code hinzufügen:\n\nemail_token = nil\n\nUser.all.each do |u|\n email_token = u.email_tokens.create(email: u.email)\n Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)\n sleep(5)\nend\n\n\nUnd schließlich ausführen:\n\nrails r password.rb\n\n\nEs hat für mich funktioniert :slight_smile:."

2 „Gefällt mir“

Entschuldigung, ich wollte gestern darauf zurückkommen, als mir klar wurde, dass Sie eine Massen- und keine Einzelaktion durchführen wollten. Ich bin froh, dass Sie es trotzdem herausgefunden haben. :slight_smile: :+1:

Ich werde dieses Problem aufteilen, um es in zukünftigen Suchen leichter auffindbar zu machen. :mag_right:

3 „Gefällt mir“

Hallo, ich bin mir nicht sicher, ob dies immer noch der beste Ort ist, um das zu fragen, aber wissen Sie zufällig, wie lange die E-Mail zum Zurücksetzen des Passworts gültig ist? Ich weiß, dass sie in 3 oder 4 Tagen abläuft, aber ich muss es wissen, da ich meine Benutzer von einem alten Forum einladen werde und eine Nachricht senden muss, die sie darüber informiert, dass die E-Mail nach n Tagen abgelaufen sein kann, daher benötige ich die genaue Zeit. Prost

Wie führen wir diesen Befehl pro Benutzer oder nur für eine Liste von Benutzern in einer Textdatei aus? Ich muss etwa 8000 Benutzer übertragen. Ich erstelle die Benutzer problemlos mit der API, aber dann gehen die E-Mails aufgrund der hartcodierten Ratenbegrenzung nicht raus. Ich habe auch meine IP-Adresse in den gefilterten IPs auf AKZEPTIEREN gesetzt, aber es funktioniert immer noch nicht. Kann dies nur in der Rails-Konsole erfolgen?

Vielen Dank!

Ich wäre auch daran interessiert, das obige Skript so anzupassen, dass es nur an 1 Benutzer gesendet wird, damit ich es testen kann, bevor ich es an alle sende.

Ich denke, die Verwendung eines Import-Skripts wäre eine bessere Idee, um so viele Benutzer zu erstellen, aber das ist ein anderes Thema :upside_down_face:
Auf jeden Fall würden Sie das Ratenlimit erreichen, wenn Sie die E-Mail auch im Skript senden.

Wenn Sie den E-Mail-Versand verlangsamen möchten, können Sie in der Ruby-Schleife ein sleep(x) (x in Sekunden) hinzufügen, und es muss an die Ratenbegrenzung(en) angepasst werden.

Wenn Sie beabsichtigen, Ihr Skript eine Weile laufen zu lassen, verwenden Sie einen Sitzungsmanager wie screen oder 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

Es ist nicht notwendig, eine Ruby-Datei dafür zu erstellen; Sie können sie in der Rails-Konsole ausführen (./launcher enter app dann rails c).

2 „Gefällt mir“

Vielen Dank für die Hilfe @Canapin!