Problem beim programmatischen Massenversand von Passwort-Reset-E-Mails über /u/{username}/password-reset.json Kategorie: Development (API/Plugins)

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

  1. 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.
  2. 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.
  3. 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_username aus approved_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.
    • 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.
  4. 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

  1. 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?
  2. 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?
  3. Ratenbegrenzung: Ich verarbeite Benutzer in Stapeln von 25, um Ratenbegrenzungen zu vermeiden. Gibt es spezifische Ratenbegrenzungen für /u/{username}/password-reset.json?
  4. 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?
  5. 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!

1 „Gefällt mir“

Ich glaube, du brauchst keinen API-Schlüssel? Ich bin mir nicht sicher, ob du ein Passwort anfordern kannst, wenn du eingeloggt bist.