ask.discourse.org gera um bom ponto de partida, como um script Rails:
MAX_MESSAGES = 1000 # Limite opcional para testes
SECONDS_BETWEEN_MESSAGES = 3 # Intervalo de 3 segundos
Rails.logger.info "Iniciando script de mensagens em massa..."
# Defina o conteúdo da sua mensagem
message_title = "Bem-vindo à Nossa Comunidade"
message_body = "Olá! Estamos muito felizes em tê-lo aqui. Avise-nos se tiver alguma dúvida!"
# Busque usuários ordenados pelo último visto
users = User.where(active: true)
.where.not(staged: true) # Exclua usuários staged
.order(last_seen_at: :desc)
.limit(MAX_MESSAGES)
Rails.logger.info "Encontrados #{users.count} usuários ativos para enviar mensagens."
users.each_with_index do |user, index|
begin
Rails.logger.info "Enfileirando mensagem 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 "Mensagem enfileirada com sucesso para #{user.username}."
# Aguarde o intervalo especificado antes de processar o próximo usuário
sleep(SECONDS_BETWEEN_MESSAGES)
rescue => e
Rails.logger.error "Falha ao enviar mensagem para #{user.username}: #{e.message}"
end
end
Rails.logger.info "Script de mensagens em massa concluído!"
Eu não fiz nenhuma modificação, e o usuário system enviou a MP para todos os meus usuários na minha instância de teste:
@Canapin, em primeiro lugar, esse é um nome de usuário incrível… mas sua resposta é ainda mais incrível! Isso está realmente alinhado com o que queremos fazer. Mais alguns detalhes.
Temos 3,5 milhões de usuários. Não planejamos enviar para todos de uma vez, a ideia seria executar este script, talvez para lotes de 10 mil, depois parar por alguns dias, ver que tipo de atividade temos, verificar a reputação do e-mail e, em seguida, começar novamente, e assim por diante.
Gostaríamos de enviar isso de um administrador com um perfil em vez de ‘sistema’, presumo que isso seja possível?
Sim, basta substituir system pelo nome de usuário desejado no script.
Desculpe, dei uma olhada rápida no código, não há system para substituir, então deve ser feito de outra forma.
Você provavelmente vai querer usar um gerenciador de sessão como screen ou tmux para que seu script possa ser executado em segundo plano.
Presumo que você também vai querer ser capaz de parar o script quando desejar e reiniciá-lo mais tarde do usuário em que parou.
Como não sou programador (quero dizer, além de imprimir hello world…), deixarei que outros deem conselhos sobre como configurar este recurso adequadamente, bem como gerenciar com segurança o envio para milhões de usuários
@Canapin Todas sensatas, e obrigado. Sim, estou pensando que há uma maneira de apenas fazer algum tipo de contagem de registros que o sistema processaria, então basicamente ele se pararia, mas entendi sobre as outras opções.
Se mais alguém tiver alguma ideia sobre como tornar isso mais automatizado (executar para lotes de 10 mil usuários, por exemplo), seria ótimo.
Sim. Se eu fosse criar esse tipo de script, eu configuraria algo que me permitisse reiniciar do último usuário caso o script fosse interrompido forçadamente por algo (reinicialização do servidor, falha…, etc.).
Aqui está o script atualizado com o nome de usuário remetente:
MAX_MESSAGES = 1000 # Limite opcional para testes
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 "Usuário remetente '#{message_sender_username}' não encontrado!"
exit
end
Rails.logger.info "Iniciando script de mensagens em massa..."
# Defina o conteúdo da sua mensagem
message_title = "Bem-vindo à Nossa Comunidade"
message_body = "Olá! Estamos muito felizes em ter você aqui. Avise-nos se tiver alguma dúvida!"
# Busca usuários ordenados pelo último acesso
users = User.where(active: true)
.where.not(staged: true) # Exclui usuários em staging
.order(last_seen_at: :desc)
.limit(MAX_MESSAGES)
Rails.logger.info "Encontrados #{users.count} usuários ativos para enviar mensagem."
users.each_with_index do |user, index|
begin
Rails.logger.info "Enfileirando mensagem 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 "Mensagem enfileirada com sucesso para #{user.username}."
# Aguarda o intervalo especificado antes de processar o próximo usuário
sleep(SECONDS_BETWEEN_MESSAGES)
rescue => e
Rails.logger.error "Falha ao enviar mensagem para #{user.username}: #{e.message}"
end
end
Rails.logger.info "Script de mensagens em massa concluído!"
Outra pergunta aqui. Alguém tem alguma ideia de como acompanhar onde o script está no processo? Por exemplo, enviamos 10 mil e-mails e paramos. Depois queremos recomeçar, como saberíamos com qual registro começar?