Inviare email di reset della password in massa?

Ho migrato gli utenti dal vecchio database del forum. Esiste un modo per inviare email di reimpostazione della password in blocco? Ho provato a usare l’API, ma dopo aver richiesto l’invio di circa 3 reset di password ho ricevuto il messaggio You have performed this action too many times, try again later. (le altre azioni API funzionano correttamente).

Sarei felice di utilizzare la console Ruby o l’API, se potete consigliarmi come aggirare quel limite di frequenza. Probabilmente è un limite per indirizzo IP, come ho scoperto.

[aggiornato]

Sembra che il RateLimiter per ‘forgot_password’ sia purtroppo hardcoded, quindi ho optato per uno script Ruby…

Per il reset di massa (invio di token per il reset della password a tutti gli utenti), potete procedere come segue:

cd /var/discourse
./launcher enter app

Quindi create un nuovo file mass-password-reset.rb utilizzando il vostro editor preferito con il seguente script:

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

Infine, eseguitelo con rails r mass-password-reset.rb.

5 Mi Piace

Fantastico, grazie! Ho recentemente migrato i dati dal mio vecchio forum e, quando ho provato a resettare manualmente le password per i miei utenti (non sono molti), ho ricevuto un messaggio di errore. I log di Discourse non mostravano nulla, ho provato a ricostruire l’app ma non ha aiutato. Poi ho provato il tuo script e ora, tramite il servizio esterno di invio email (e Sidekiq), vedo che queste email vengono inviate. Quindi, grazie ancora! :slight_smile:

2 Mi Piace

Ho provato, ma il modello dei dati è cambiato (credo a causa dell’email secondaria). Le indirizzi email si trovano ora nell’oggetto User Email, credo.

2 Mi Piace

Ciao, hai trovato qualcosa per risolvere questo problema? Stavo per provare quello script ma ho visto il tuo messaggio e ora mi chiedo se sei riuscito a risolvere la cosa.

Penso che l’opzione migliore sia ancora far loro reimpostare la password tramite il link di reimpostazione della password. C’è un motivo per cui il tuo utente non può farlo?

No, sarebbe solo una questione di esperienza utente. Abbiamo migrato il nostro vecchio forum vanilla e penso che la migliore esperienza per i vecchi utenti sarebbe ricevere un’email che dice “Ehi, siamo migrati dal nostro forum a una nuova piattaforma. Puoi accedere tramite questo link: {link}”.

Solo sto correggendo qui: quello script funziona. Ho solo dovuto:

cd /var/discourse
sudo ./launcher enter app

Poi creare il file:

// crea file
touch password.rb

Poi aggiungere il seguente codice:

email_token = nil

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

E infine, eseguirlo:

rails r password.rb

Ha funzionato per me :slight_smile:.

2 Mi Piace

Mi dispiace, volevo tornare su questo ieri quando mi sono reso conto che volevi fare una massa e non un singleton. Sono contento che tu l’abbia capito comunque. :slight_smile: :+1:

Dividerò questo problema per renderlo più facile da trovare nelle ricerche future. :mag_right:

3 Mi Piace

Ehi, non so se questo sia ancora il posto migliore per chiedere, ma sapresti dirmi per quanto tempo dura l’email per il recupero della password? So che scade in 3 o 4 giorni, ma ho bisogno di saperlo perché inviterò i miei utenti da un vecchio forum e dovrò inviare un messaggio per avvisarli che l’email potrebbe essere scaduta dopo n giorni, quindi ho bisogno dell’ora specifica. Saluti

Come possiamo eseguire questo comando per singolo utente o solo per un elenco di utenti in un file di testo? Ho circa 8000 utenti da trasferire. Sto creando gli utenti senza problemi con l’API, ma poi le email non vengono inviate a causa del limite di frequenza codificato. Ho anche impostato il mio indirizzo IP su ACCETTA nel Screened IP, ma ancora niente. È qualcosa che può essere fatto solo nella console di Rails?

Grazie!

Sarei anche interessato ad adattare lo script sopra per inviarlo a solo 1 utente, in modo da poterlo testare prima di inviarlo a tutti.

Penso che l’uso di uno script di importazione sarebbe un’idea migliore per creare così tanti utenti, ma siamo fuori tema :upside_down_face:
Comunque, raggiungeresti il limite di frequenza se inviassi anche l’email nello script.

Se vuoi rallentare il processo di invio delle email, puoi aggiungere uno sleep(x) (x in secondi) nel ciclo ruby, e deve essere adattato a quali sono i limiti di frequenza.

Se intendi lasciare che il tuo script venga eseguito per un po’, usa un gestore di sessioni come screen o 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

Non c’è bisogno di creare un file Ruby per questo; puoi eseguirlo nella console Rails (./launcher enter app poi rails c).

2 Mi Piace

Grazie per l’aiuto @Canapin!