Hallo Discourse Community,
Ich versuche, das Senden von E-Mails zur Passwortzurücksetzung für Benutzer auf unserer selbst gehosteten Discourse-Instanz (Version 3.5.0.beta7-dev) in großen Mengen zu automatisieren. Die Benutzer sind in einer CSV-Datei aufgeführt, die nur custom_username enthält, und ihre E-Mail-Adressen sind in ihren Discourse-Profilen gespeichert. Während die manuelle Passwortzurücksetzung über das Admin-Panel (/u//preferences/security) perfekt funktioniert, schlägt mein Python-Skript, das den Endpunkt /u/{username}/password-reset.json verwendet, beim Senden von E-Mails fehl. Ich wäre dankbar für jeden Rat zur Fehlerbehebung dieses Problems.
Was ich getan habe
-
Benutzererstellung:
- Ich habe erfolgreich Benutzer über den Endpunkt POST /users.json mit einem Python-Skript erstellt. Die Nutzlast ist:
{ "email": "<email>", "username": "<custom_username>", "password": "", "active": true, "approved": true, "send_welcome_message": false }- Benutzer erscheinen im Admin-Panel (/admin/users) und ihre E-Mail-Adressen sind korrekt in ihren Profilen gespeichert.
-
Manuelle Passwortzurücksetzung:
- Vom Admin-Panel aus (/u//preferences/security) sendet das Klicken auf die Schaltfläche “Passwort zurücksetzen” eine E-Mail zur Passwortzurücksetzung an die registrierte E-Mail-Adresse des Benutzers, was bestätigt, dass SMTP und Sidekiq korrekt konfiguriert sind.
-
Programmatische Passwortzurücksetzung:
- Ich verwende ein Python-Skript, um E-Mails zur Passwortzurücksetzung über POST /u/{username}/password-reset.json zu senden. Das Skript:
- Liest
custom_usernameausapproved_users.csv(z. B. kebirx-ustat45947). - Überprüft, ob der Benutzer existiert, über GET /u/{username}.json.
- Sendet eine POST-Anfrage an /u/{username}/password-reset.json.
- Liest
- Vereinfachter Code:
response = requests.post( f"{FORUM_URL}/u/{username}/password-reset.json", headers={"Api-Key": API_KEY, "Api-Username": API_USERNAME}, timeout=10 )- Die Antwort ist 200 OK, aber es werden keine E-Mails gesendet. Es erscheinen keine Fehler in den Skriptprotokollen (discourse_send_welcome_emails.log) oder Sidekiq-Protokollen.
- Ich verwende ein Python-Skript, um E-Mails zur Passwortzurücksetzung über POST /u/{username}/password-reset.json zu senden. Das Skript:
-
Früherer Versuch:
- Ich habe versucht, POST /admin/users/{user_id}/send_welcome-email.json zu verwenden, aber es gab einen 404-Fehler. Ich konnte diesen Endpunkt in der API-Dokumentation nicht finden, also wechselte ich zu /u/{username}/password-reset.json.
Umgebung
-
Discourse-Version: 3.5.0.beta7-dev
-
Einrichtung: Selbst gehostet, erreichbar unter https://forum.kebirxai.tr
-
API-Schlüssel: Admin-zugewiesen mit vollen Berechtigungen
-
CSV-Format:
custom_username kebirx-ustat45947 keb21 -
Protokolle:
- Skriptprotokolle zeigen 200 OK für jeden POST /u/{username}/password-reset.json-Aufruf, aber keine E-Mails werden empfangen.
- Sidekiq-Protokolle (/var/www/discourse/log/sidekiq.log) und Produktionsprotokolle (/var/www/discourse/log/production.log) zeigen keine E-Mail-bezogenen Fehler.
- Manuelle Test-E-Mails von /admin/email funktionieren einwandfrei.
Fragen
- Ist /u/{username}/password-reset.json der richtige Endpunkt, um programmatisch E-Mails zur Passwortzurücksetzung auszulösen? Wenn nicht, welcher Endpunkt wird für Massen-E-Mails zur Passwortzurücksetzung empfohlen?
- Warum könnte der Endpunkt 200 OK zurückgeben, aber keine E-Mails senden? Könnte dies mit API-Berechtigungen, Sidekiq-Warteschlangenproblemen oder SMTP-Konfigurationen zusammenhängen, die spezifisch für API-ausgelöste E-Mails sind?
- Ratenbegrenzung: Ich verarbeite Benutzer in Stapeln von 25, um Ratenbegrenzungen zu vermeiden. Gibt es spezifische Ratenbegrenzungen für /u/{username}/password-reset.json?
- Alternative Ansätze: Gibt es eine effizientere Möglichkeit, E-Mails zur Passwortzurücksetzung für mehrere Benutzer auszulösen, ohne einzelne API-Aufrufe zu tätigen? Zum Beispiel ein Massenendpunkt oder ein Sidekiq-Job?
- Fehlersuche: Welche Protokolle oder Einstellungen sollte ich überprüfen, um festzustellen, warum API-ausgelöste E-Mails nicht gesendet werden, obwohl manuelle Zurücksetzungen funktionieren?
Zusätzliche Hinweise
- Die manuelle Zurücksetzung über das Admin-Panel funktioniert, daher scheinen SMTP (konfiguriert in app.yml) und Sidekiq funktionsfähig zu sein.
- Ich habe überprüft, dass Benutzer existieren und ihre E-Mail-Adressen im Admin-Panel korrekt sind.
- Es erscheinen keine Fehler in den Skript- oder Serverprotokollen, was die Fehlersuche erschwert.
Jeder Vorschlag zur Fehlerbehebung, zu alternativen Endpunkten oder zu Best Practices für Massen-E-Mails zur Passwortzurücksetzung wäre sehr willkommen. Wenn es undokumentierte APIs, Plugins oder Konfigurationsanpassungen gibt, lassen Sie es mich bitte wissen. Vielen Dank!