ask.discourse.org produce un buon punto di partenza, come script Rails:
MAX_MESSAGES = 1000 # Limite opzionale per i test
SECONDS_BETWEEN_MESSAGES = 3 # Intervallo di 3 secondi
Rails.logger.info "Avvio dello script di messaggistica di massa..."
# Definisci il contenuto del tuo messaggio
message_title = "Benvenuto nella nostra community"
message_body = "Ciao! Siamo entusiasti di averti qui. Facci sapere se hai domande!"
# Recupera gli utenti ordinati per ultimo accesso
users = User.where(active: true)
.where.not(staged: true) # Escludi gli utenti staged
.order(last_seen_at: :desc)
.limit(MAX_MESSAGES)
Rails.logger.info "Trovati #{users.count} utenti attivi a cui inviare messaggi."
users.each_with_index do |user, index|
begin
Rails.logger.info "In coda messaggio per #{user.username} (#{index + 1}/#{users.count})..."
PostCreator.create!(
Discourse.system_user,
title: message_title,
raw: message_body,
archetype: Archetype.private_message,
target_usernames: user.username,
skip_validations: true
)
Rails.logger.info "Messaggio accodato con successo per #{user.username}."
# Attendi l'intervallo specificato prima di elaborare il prossimo utente
sleep(SECONDS_BETWEEN_MESSAGES)
rescue => e
Rails.logger.error "Impossibile inviare messaggio a #{user.username}: #{e.message}"
end
end
Rails.logger.info "Script di messaggistica di massa completato!"
Non ho apportato alcuna modifica e l’utente system ha inviato il MP a tutti i miei utenti nella mia istanza di test:
@Canapin prima di tutto è un nome utente fantastico… ma la tua risposta lo è ancora di più! Questo è davvero in linea con ciò che vogliamo fare. Qualche dettaglio in più.
Abbiamo 3,5 milioni di utenti. Non abbiamo intenzione di inviare a tutti contemporaneamente, l’idea sarebbe quella di eseguire questo script, magari per lotti di 10k, poi fermarsi per qualche giorno, vedere che tipo di attività abbiamo, controllare la reputazione delle email, e poi ricominciare, e così via.
Vorremmo inviarlo però da un amministratore con un profilo piuttosto che da ‘sistema’, immagino sia possibile?
Sì, basta sostituire system con il nome utente desiderato nello script.
Mi dispiace, ho letto velocemente il codice, non c’è system da sostituire, quindi deve essere fatto in un altro modo.
Probabilmente vorrai usare un session manager come screen o tmux in modo che il tuo script possa essere eseguito in background.
Presumo che vorrai anche essere in grado di interrompere lo script quando desiderato e riavviarlo in seguito dall’utente in cui si è fermato.
Dato che non sono un programmatore (voglio dire, a parte stampare hello world…), lascerò che altri diano consigli su come impostare correttamente questa funzionalità, oltre a gestire in modo sicuro l’invio a milioni di utenti
@Canapin Tutto sensato, e grazie. Sì, penso che ci sia un modo per fare semplicemente un conteggio dei record che il sistema elaborerebbe, quindi in pratica si fermerebbe da solo, ma ho capito le altre opzioni.
Se qualcun altro ha idee su come rendere questo più automatizzato (ad esempio, eseguirlo per batch di 10.000 utenti), sarebbe fantastico.
Sì. Se dovessi creare questo tipo di script, imposterei qualcosa che mi permettesse di ripartire dall’ultimo utente nel caso in cui lo script venga interrotto forzatamente da qualcosa (riavvio del server, crash…, ecc.).
Ecco lo script aggiornato con il nome utente del mittente:
MAX_MESSAGES = 1000 # Limite opzionale per i test
SECONDS_BETWEEN_MESSAGES = 3 # Intervallo di 3 secondi
SENDER_USERNAME = "coco"
message_sender = User.find_by(username: SENDER_USERNAME)
if message_sender.nil?
Rails.logger.error "Utente mittente '#{message_sender_username}' non trovato!"
exit
end
Rails.logger.info "Avvio dello script di messaggistica di massa..."
# Definisci il contenuto del tuo messaggio
message_title = "Benvenuto nella nostra community"
message_body = "Ciao! Siamo entusiasti di averti qui. Facci sapere se hai domande!"
# Recupera gli utenti ordinati per ultimo accesso
users = User.where(active: true)
.where.not(staged: true) # Escludi gli utenti staged
.order(last_seen_at: :desc)
.limit(MAX_MESSAGES)
Rails.logger.info "Trovati #{users.count} utenti attivi a cui inviare messaggi."
users.each_with_index do |user, index|
begin
Rails.logger.info "In coda messaggio per #{user.username} (#{index + 1}/#{users.count})..."
PostCreator.create!(
message_sender,
title: message_title,
raw: message_body,
archetype: Archetype.private_message,
target_usernames: user.username,
skip_validations: true
)
Rails.logger.info "Messaggio accodato con successo per #{user.username}."
# Attendi l'intervallo specificato prima di elaborare il prossimo utente
sleep(SECONDS_BETWEEN_MESSAGES)
rescue => e
Rails.logger.error "Impossibile inviare messaggio a #{user.username}: #{e.message}"
end
end
Rails.logger.info "Script di messaggistica di massa completato!"
Un’altra domanda. Qualcuno ha idea di come tenere traccia di dove si trova lo script nel processo? Ad esempio, inviamo 10.000 email e ci fermiamo. Poi vogliamo ricominciare, come faremmo a sapere da quale record iniziare?