Erstellen eines gestaffelten Benutzers mit einem API-Aufruf

Aktuell nutzen wir einen Workflow, bei dem Benutzer Daten über eine benutzerdefinierte eingehende E-Mail-Adresse einreichen, wodurch ein gestaffelter Benutzer erstellt und eine private Nachricht an eine Discourse-Gruppe gesendet wird.

Ist es möglich, denselben Workflow über API-Aufrufe umzusetzen? Im Wesentlichen: 1) gestaffelten Benutzer erstellen, 2) API-Schlüssel für diesen Benutzer generieren und dann 3) im Namen dieses Benutzers posten? Ich habe in der API-Dokumentation gesehen, wie man Gruppennachrichten für bestehende Benutzer postet, bin mir aber nicht sicher, ob die Schritte 1) und 2) derzeit möglich sind.

Yes, just create a user via the api. They won’t be “staged” at this point since they actually exist. If they ever need to log in, they can just reset their password.

This is also possible


Here is a rough example of how to create a user, active them, and generate an api key for them.
    def create_user
      user = {
        name: example1,
        email: "example1@example.com",
        password: "ZvAmmkcSWQfsPQLBksg7wK59",
        username: example1,
        active: "false",
        approved: "true",
        approved_by_id: 1,
        approved_at: DateTime.now
      }

      new_user = @client.create_user(user)
      id = new_user['user_id']
      @client.activate(id)
      uri = URI.parse(@config.full_discourse_url)
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = true
      request = Net::HTTP::Post.new("/admin/users/#{id}/generate_api_key?api_key=#{@client.api_key}&api_username=#{@client.api_username}")
      response = http.request(request)
      result = JSON.parse(response.body)
    end

Another option instead of generating an api key for each user is you can just instantiate a new discourse client using the same admin api key and just specify the new username:

client = DiscourseApi::Client.new("http://127.0.0.1:3000")
client.api_key = "a71cb5058c6be27e42806ad788bc7b0008af9c15170d1be1827a24c8e8334107"
client.api_username = "system"

... create user here...

client2 = DiscourseApi::Client.new("http://127.0.0.1:3000")
client2.api_key = "a71cb5058c6be27e42806ad788bc7b0008af9c15170d1be1827a24c8e8334107"
client2.api_username = example1

... create post here ...

I’m trying to avoid creating a full-fledged user account and picking a username. Essentially I want to replicate whatever is happening in the email trigger (‘custom incoming email address’ in the group settings) where the sender’s email address will be ‘staged,’ such that if/when they do register, they’ll be able to claim any messages that were created on their behalf via the email trigger.

Does that make sense? Is there a way to ‘spoof’ an incoming email using API calls? Thanks for all your help!

You might just have to generate an email and send that to your Discourse instance.

EDIT: Actually there is an /admin/email/handle_mail POST route that you can send an API request to.

Thank you, this is exactly what I was looking for!

Könntest du bitte spezifizieren, welche Header und Felder in den API-Aufruf an /admin/email/handle_email enthalten sein müssen, um einen gestaffelten Benutzer zu erstellen und ein Thema in seinem Namen zu posten?

Habe ich es richtig verstanden, dass ein solcher Benutzer Benachrichtigungen für neue Beiträge in einem solchen Thema erhält und per E-Mail darauf antworten kann?

Und was passiert, wenn ich versuche, über einen API-Aufruf mit einer E-Mail-Adresse, die einem aktiven Benutzer gehört, einen gestaffelten Benutzer und ein Thema zu erstellen? Wird dieses Thema dann in diesem Fall in seinem Namen erstellt?

Ich habe bereits herausgefunden, dass der richtige Endpunkt /admin/email/handle_mail ist (nicht „handle_email“), kann aber immer noch nicht herausfinden, was in der API-Anfrage stehen sollte.

Der einzige Parameter, den dieser Endpunkt akzeptiert, ist eine gültige email-Nachricht:

curl -i -sS -X POST "http://localhost:3000/admin/email/handle_mail" \
-H "Api-Key: 852b2d8556777aeb62346e0d8b36ed248a89b03f0261165a685c0aae9c8c2fdd" \
-H "Api-Username: system" \
-F "email=Date: Mon, 24 Feb 2020 13:13:34 -0700
From: stageduser2@example.com
To: awesome@example.com
Subject: test email5

This is a sample email message.
"

Stellen Sie sicher, dass Sie email_in korrekt eingerichtet haben und Ihre Kategorie oder Gruppe so konfiguriert ist, dass sie diese E-Mails empfängt:

Ja, das glaube ich.

Ja, das Thema wird im Namen des Benutzers erstellt.

Danke, Blake. Allerdings funktioniert es für mich immer noch nicht. Ich habe eine Antwort von der API erhalten: „E-Mail wurde empfangen und wartet auf die Verarbeitung“, aber in Discourse erscheint nichts – weder ein neues Thema noch ein gestaffelter Benutzer.

Hier ist eine Übersicht der Einstellungen:
Global:

  • email_in: aktiviert
  • email_in_min_trust: 0
  • enable_staged_users: aktiviert

Kategorie:

  • Benutzerdefinierte eingehende E-Mail-Adresse: festgelegt als [my_name]@gmail.com
  • E-Mails von anonymen Benutzern ohne Konto akzeptieren: aktiviert

API-Aufruf:
curl -i -sS -X POST "[my_domain]/admin/email/handle_mail" -H "Content-Type: multipart/form-data;" -H "Api-Key: [...]" -H "Api-Username: system" -F "email=Date: Mon, 24 Feb 2020 13:13:34 -0700 From: [some_name]@gmail.com To: [my_name]@gmail.com Subject: test API email post This is a sample email message."

Was könnte falsch sein?

Läuft dein Sidekiq einwandfrei?

Wie kann ich das überprüfen?

Sie können prüfen, ob Sidekiq läuft, indem Sie /sidekiq aufrufen. Ich vermute jedoch, dass es nun, da die API-Anfrage erfolgreich war, ein Problem mit den Roh-E-Mails gibt. Im Admin-Dashboard finden Sie mehrere Registerkarten, in denen Sie nach E-Mail-Fehlern suchen können:

  • /admin/email/sent
  • /admin/email/skipped
  • /admin/email/bounced
  • /admin/email/received
  • /admin/email/rejected

Prüfen Sie, ob Sie die über API-Aufrufe erstellten E-Mails unter einer dieser Registerkarten finden. Möglicherweise können Sie dort eine zugehörige Fehlermeldung sehen.

Ja, Sidekiq läuft. Ich habe die Registerkarten unter /admin/e-Mail überprüft – es sieht so aus, als würden meine „E-Mails

Ich bin mir nicht sicher. Es sieht so aus, als würde es keines der Felder in deiner E-Mail akzeptieren.

Ich habe Ruby verwendet, um den curl-Befehl zu generieren, und Ruby, um meine E-Mail-Textdatei einzulesen, die ich erstellt habe. Aber ja, es scheint ein Problem mit den Zeilenumbrüchen zu sein.

Kannst du curl eine E-Mail-Datei lesen lassen, die tatsächliche Zeilenumbrüche enthält?

curl -X POST -i -F parametername=@filename host:port/xxx

Du hattest recht – es war ein Problem mit einer neuen Zeile. Ich habe denselben API-Aufruf über Postman getestet, und er hat funktioniert: Ein neuer gestaffelter Benutzer wurde erstellt, und ein Thema wurde in seinem Namen angelegt.

Aber: Es wurde keine E-Mail an die Adresse dieses Benutzers gesendet! Ich habe auch einen Kommentar im Thema hinterlassen – keine E-Mail-Benachrichtigung. Gibt es eine Einstellung, die dies verhindert? Ich habe versucht, eine solche Einstellung zu finden, konnte aber keine finden.

UPD: Es gab tatsächlich eine Einstellung, die das Senden von Beitragsbenachrichtigungen verhindert hat :slight_smile: Jetzt habe ich zwei verschiedene Fragen:

  1. Warum gab es keine E-Mail, die den gestaffelten Benutzer darüber informierte, dass das Thema erstellt wurde, und ihm den Link dazu schickte?
    (Wenn ich wüsste, welche Vorlage ich bearbeiten muss, würde ich auch einige Anweisungen zum Einloggen im Forum hinzufügen.)
  2. Warum ist in den E-Mails für Beitragsbenachrichtigungen kein Link zum Thema enthalten? Auch kein Abmeldelink.
    Die Vorlage scheint dieselbe zu sein – „user_posted“.

Welche Einstellung genau für alle, die mitlesen? Ich glaube nicht, dass ich etwas ändern musste, bin also nur neugierig.

Ich denke, das ist beabsichtigt und funktioniert genauso, wenn man eine E-Mail an eine Discourse-Gruppe sendet. Es ist so konzipiert, dass es wie eine normale E-Mail funktioniert, da der Benutzer möglicherweise nicht einmal weiß, dass er eine E-Mail in ein Discourse-Forum sendet. Wenn ich dir eine reguläre E-Mail an dein E-Mail-Konto sende, erhalte ich keine Antwort von deinem E-Mail-Anbieter, die bestätigt, dass du meine E-Mail erhalten hast. Wir vertrauen einfach darauf, dass es funktioniert.

Hier ist ein Beispiel für eine E-Mail-Benachrichtigung, die ein gestaffelter Benutzer erhält:

Doch so sieht es für einen nicht-gestaffelten Benutzer aus:

Es scheint einen Unterschied zwischen gestaffelten und nicht-gestaffelten Benutzern zu geben. Wahrscheinlich ist dies darauf zurückzuführen, dass der Benutzer gestaffelt ist und die Interaktion wie über eine reguläre E-Mail erfolgen soll.

Tatsächlich gab es mehrere.

  • Standard-E-Mail-Level – Standard ist „nur bei Abwesenheit“
  • E-Mail-Zeitfenster – Standard sind 10 Minuten, sodass die Benachrichtigungs-E-Mail nicht sofort gesendet wird
  • E-Mails deaktivieren – Standard ist „nein“, aber ich hatte es zuvor geändert und war es vergessen :man_facepalming:

Nun, für mich sieht die Beitragsbenachrichtigung sowieso nicht wirklich wie eine reguläre E-Mail aus – sie enthält beispielsweise zweimal (!) einen Link zum Profil des Beitragsautors im Forum, aber keinen Link zum Thema.

Außerdem möchte ich den gestaffelten Benutzer darauf hinweisen, dass er sich tatsächlich im Forum anmelden kann.
Gibt es eine Möglichkeit, diese E-Mail-Vorlage anzupassen?

Per Design werden bei gestaffelten Benutzern in E-Mail-Vorlagen mehrere Felder weggelassen (z. B. die Antwortanweisungen):

Ich bin mir nicht ganz sicher, worin der Grund dafür liegt, aber im Code ist dies einfach so festgelegt. Daher haben Sie es hier mit einem steilen Anstieg zu tun, da Sie versuchen, etwas zu tun, wofür Discourse nicht ausgelegt ist.

Ja, Sie können die E-Mail-Vorlagen bearbeiten, aber Ihre Möglichkeiten zur Anpassung sind stark begrenzt. So können Sie beispielsweise meiner Meinung nach nicht dafür sorgen, dass die E-Mail-Vorlage für gestaffelte Benutzer anders aussieht als für nicht gestaffelte. Sie können jedoch eine Nachricht mit einem Link an den unteren Rand der Benachrichtigungs-E-Mail hinzufügen, in der die Benutzer aufgefordert werden, Ihre Website zu besuchen, anstatt sich nur per E-Mail zu interagieren.

Eigentlich würde es schon reichen, wenn die Vorlage für reguläre und gestaffelte Nutzer genauso aussieht :slight_smile:
Ich werde überlegen, was ich tun könnte. Vielen Dank für die detaillierte Erklärung!

Eine letzte Frage (hoffentlich): Wie kann ein gestaffelter Benutzer die Benachrichtigung über neue Beiträge im für ihn erstellten Thema abbestellen?