Attualmente disponiamo di un flusso di lavoro in cui gli utenti inviano dati tramite email a un indirizzo di posta in arrivo personalizzato, creando un utente in fase di staging e un messaggio privato a un gruppo Discourse.
È possibile replicare lo stesso flusso di lavoro utilizzando chiamate API? In pratica: 1) creare un utente in fase di staging, 2) generare una chiave API per tale utente, quindi 3) pubblicare a nome di quell’utente? Nelle documentazioni API vedo come inviare messaggi di gruppo per utenti esistenti, ma non so se i passaggi 1) e 2) siano attualmente possibili.
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!
Potresti specificare quali intestazioni e campi devono essere inclusi nella chiamata API a /admin/email/handle_email che crea un utente in staging e un topic a suo nome?
Inoltre, ho capito correttamente che un tale utente riceverà notifiche per nuovi post in quel topic e potrà rispondere tramite email?
E cosa succede se provo a creare un utente in staging e un topic tramite una chiamata API con un indirizzo email che appartiene a un utente attivo? Verrà creato questo topic a nome di tale utente?
Ho già scoperto che l’endpoint corretto è /admin/email/handle_mail (non “handle_email”), ma non riesco ancora a capire cosa dovrebbe contenere la richiesta API.
Grazie, Blake. Tuttavia, per me non funziona ancora. Ho ricevuto una risposta dall’API “l'email è stata ricevuta ed è in coda per l'elaborazione”, ma non appare nulla in Discourse: né un nuovo argomento, né un utente in fase di staging.
Ecco la verifica delle impostazioni:
Globale:
email_in: attivo
email_in_min_trust: 0
enable_staged_users: attivo
Categoria:
Indirizzo email in arrivo personalizzato: impostato come [my_name]@gmail.com
Accetta email da utenti anonimi senza account: attivo
Chiamata API: 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."
Puoi verificare se Sidekiq è in esecuzione navigando su /sidekiq, ma penso che ora che la richiesta API ha avuto successo, il problema riguardi probabilmente l’email grezza. Nella dashboard di amministrazione ci sono diverse schede dove puoi controllare gli errori relativi alle email:
/admin/email/sent
/admin/email/skipped
/admin/email/bounced
/admin/email/received
/admin/email/rejected
Verifica se riesci a trovare le email che stai creando tramite chiamate API in una di queste schede; potresti riuscire a vedere un messaggio di errore associato.
Sì, sidekiq è in esecuzione. Ho controllato le schede /admin/email: sembra che le mie “email” vengano effettivamente rifiutate.
Questo è quanto ricevo:
Ho inserito lo stesso testo dell’email nella scheda “Testo avanzato” e sembra funzionare, purché ogni parte (Data, Da, A, Oggetto) inizi su una nuova riga e il corpo sia separato da due interruzioni di riga. Inserendo il testo esattamente come in curl, non viene restituito nulla. Potrebbe dipendere dalle interruzioni di riga nell’email grezza? Se sì, cosa dovrei fare?
Ho provato con /n, %0A e $'[text/n]', ma nessuno di questi funziona.
Non sono sicuro. Sembra che non accetti nessuno dei campi nel tuo messaggio.
Ho usato Ruby per generare il comando curl e Ruby per leggere il file di testo della mia email che ho scritto, ma sì, sembra essere un problema di newline.
Avevi ragione: era un problema di newline. Ho provato la stessa chiamata API da Postman ed è andata a buon fine: è stato creato un nuovo utente in fase di staging e un topic a suo nome.
Però: non è stata inviata alcuna email all’indirizzo di questo utente! Ho anche pubblicato un commento nel topic, ma non ho ricevuto alcuna notifica via email. Esiste un’impostazione che lo impedisce? Ho cercato di trovarla, ma non ci sono riuscito.
AGGIORNAMENTO: C’era effettivamente un’impostazione che impediva l’invio delle notifiche sui post Quindi ora ho due domande diverse:
Perché non è stata inviata un’email all’utente in fase di staging per informarlo che il topic era stato creato e per fornirgli il link ad esso?
(Anch’io aggiungerei alcune istruzioni su come accedere al forum, se sapessi quale modello modificare.)
Perché nelle email di notifica sui post non c’è il link al topic? Inoltre manca il link per annullare l’iscrizione.
Il modello sembra essere lo stesso: “user_posted”.
Quale impostazione, per chi sta seguendo? Non credo di aver dovuto modificare nulla, quindi sono solo curioso.
Penso che questo sia previsto dal design e succede lo stesso se si invia un’e-mail a un gruppo Discourse. È progettato per funzionare proprio come l’e-mail, nel senso che l’utente potrebbe non sapere nemmeno di star inviando un’e-mail a un forum Discourse. Se ti invio un’e-mail normale al tuo account, non ricevo una risposta dal tuo provider di posta che conferma la ricezione; ci fidiamo semplicemente che funzioni.
Ecco un esempio di notifica e-mail che riceverà un utente in staging:
Sembra esserci una differenza tra gli utenti in staging e quelli non in staging. Probabilmente, poiché l’utente è in staging, l’interazione deve essere simile a quella tramite e-mail normale.
default email level - il predefinito è “solo quando assente”
email time window - il predefinito è 10 minuti, quindi l’email di notifica non viene inviata immediatamente
disable emails - il predefinito è “no”, ma l’avevo modificata in precedenza e me ne ero dimenticato
Beh, per me la notifica del post non assomiglia davvero a un’email regolare; ad esempio, contiene un link al profilo dell’autore del post sul forum (due volte!), ma non al topic.
Inoltre, vorrei informare l’utente in fase di staging che può effettivamente accedere al forum.
Esiste un modo per personalizzare questo modello di email?
Per progettazione, diversi campi vengono omessi per gli utenti in fase di staging nei modelli di posta elettronica (come le istruzioni per la risposta):
Non sono completamente sicuro della motivazione, ma il fatto è che nel codice è così: stai quindi affrontando una sfida in salita, poiché stai tentando di fare qualcosa che Discourse è progettato per non fare.
Sì, puoi modificare i modelli di posta elettronica, ma hai limitazioni significative su ciò che puoi personalizzare. Ad esempio, non credo sia possibile far sì che il modello di posta elettronica appaia in un certo modo per gli utenti in staging e in un altro per gli utenti non in staging. Tuttavia, puoi aggiungere un messaggio con un link alla fine dell’email di notifica, invitandoli a visitare il tuo sito invece di interagire solo tramite posta elettronica.
In realtà, basterebbe che il modello appaia nello stesso modo per gli utenti regolari e quelli in staging
Ci penserò su per vedere cosa posso fare. Grazie per la spiegazione dettagliata!