ask.discourse.org genera un buen punto de partida, como un script de Rails:
MAX_MESSAGES = 1000 # Límite opcional para pruebas
SECONDS_BETWEEN_MESSAGES = 3 # Intervalo de 3 segundos
Rails.logger.info "Iniciando script de mensajes masivos..."
# Define el contenido de tu mensaje
message_title = "Bienvenido a Nuestra Comunidad"
message_body = "¡Hola! Estamos muy contentos de tenerte aquí. ¡Déjanos saber si tienes alguna pregunta!"
# Obtiene usuarios ordenados por última vez visto
users = User.where(active: true)
.where.not(staged: true) # Excluye usuarios staged
.order(last_seen_at: :desc)
.limit(MAX_MESSAGES)
Rails.logger.info "Se encontraron #{users.count} usuarios activos a los que enviar mensajes."
users.each_with_index do |user, index|
begin
Rails.logger.info "Encolando mensaje para #{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 "Mensaje encolado exitosamente para #{user.username}."
# Espera el intervalo especificado antes de procesar al siguiente usuario
sleep(SECONDS_BETWEEN_MESSAGES)
rescue => e
Rails.logger.error "Fallo al enviar mensaje a #{user.username}: #{e.message}"
end
end
Rails.logger.info "¡Script de mensajes masivos completado!"
No hice ninguna modificación, y el usuario system envió el MP a todos mis usuarios en mi instancia de prueba:
@Canapin, primero, ese es un nombre de usuario increíble… ¡pero tu respuesta es aún más increíble! Esto está realmente en línea con lo que queremos hacer. Algunos detalles más.
Tenemos 3.5 millones de usuarios. No planeamos enviar a todos a la vez, la idea sería ejecutar este script, quizás para lotes de 10k, luego detenerse por unos días, ver qué tipo de actividad tenemos, revisar la reputación del correo electrónico y luego comenzar de nuevo, y así sucesivamente.
Nos gustaría enviar esto desde un administrador con un perfil en lugar de ‘sistema’, ¿supongo que eso es posible?
Sí, solo reemplaza system con el nombre de usuario deseado en el script.
Lo siento, leí el código por encima, no hay system que reemplazar, así que debe hacerse de otra manera.
Probablemente querrás usar un administrador de sesiones como screen o tmux para que tu script pueda ejecutarse en segundo plano.
Supongo que también querrás poder detener el script cuando lo desees y reiniciarlo más tarde desde el usuario en el que se detuvo.
Dado que no soy programador (quiero decir, además de imprimir hello world…), dejaré que otros den consejos sobre cómo configurar esta función correctamente, así como gestionar de forma segura el envío a millones de usuarios
@Canapin Todo sensato, y gracias. Sí, estoy pensando que hay una manera de simplemente contar los registros que el sistema recorrería, por lo que básicamente se detendría solo, pero entiendo las otras opciones.
Si alguien más tiene alguna idea sobre cómo hacer esto más automatizado (ejecutar para lotes de 10k usuarios, por ejemplo), sería genial.
Sí. Si fuera a crear este tipo de script, configuraría algo que me permitiera reiniciar desde el último usuario en caso de que el script se interrumpa forzosamente por algo (reinicio del servidor, caída, etc.).
Aquí tienes el script actualizado con el nombre de usuario del remitente:
MAX_MESSAGES = 1000 # Límite opcional para pruebas
SECONDS_BETWEEN_MESSAGES = 3 # Intervalo de 3 segundos
SENDER_USERNAME = "coco"
message_sender = User.find_by(username: SENDER_USERNAME)
if message_sender.nil?
Rails.logger.error "¡Usuario remitente '#{message_sender_username}' no encontrado!"
exit
end
Rails.logger.info "Iniciando script de mensajes masivos..."
# Define el contenido de tu mensaje
message_title = "Bienvenido a Nuestra Comunidad"
message_body = "¡Hola! Estamos muy contentos de tenerte aquí. ¡Déjanos saber si tienes alguna pregunta!"
# Obtiene usuarios ordenados por la última vez que se vieron
users = User.where(active: true)
.where.not(staged: true) # Excluye usuarios en etapa de preparación
.order(last_seen_at: :desc)
.limit(MAX_MESSAGES)
Rails.logger.info "Se encontraron #{users.count} usuarios activos a los que enviar mensajes."
users.each_with_index do |user, index|
begin
Rails.logger.info "Poniendo en cola el mensaje para #{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 "Mensaje puesto en cola con éxito para #{user.username}."
# Espera el intervalo especificado antes de procesar al siguiente usuario
sleep(SECONDS_BETWEEN_MESSAGES)
rescue => e
Rails.logger.error "Error al enviar mensaje a #{user.username}: #{e.message}"
end
end
Rails.logger.info "¡Script de mensajes masivos completado!"
Aquí hay otra pregunta. ¿Alguien tiene alguna idea de cómo hacer un seguimiento de dónde se encuentra el script en el proceso? Por ejemplo, enviamos 10.000 correos electrónicos y nos detenemos. Luego queremos empezar de nuevo, ¿cómo sabríamos con qué registro empezar?